【问题标题】:How can I display a rectangle that overlaps everything in a panel control?如何在面板控件中显示与所有内容重叠的矩形?
【发布时间】:2016-02-29 08:39:14
【问题描述】:

我想在面板控件内的所有内容上显示一个矩形。到目前为止,我在面板控件中只有一个 WebBrowser。如果我开始运行程序而不将 WebBrowser 添加到面板控件,那么我将能够看到矩形。但是,如果我将 WebBrowser 添加到面板控件,那么它将与我的矩形绘图重叠。

如何在面板控件的内部创建一个矩形绘图,它将与所有内容重叠? (总是在最前面)

下面的代码将在面板控件内绘制一个蓝色矩形。但它不会显示,因为面板包含一个 WebBrowser。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Graphics_Overlay
{
    public partial class GraphicsOverlayForm : Form
    {
        public GraphicsOverlayForm()
        {
            InitializeComponent();

            Panel panel = new Panel();
            panel.Dock = DockStyle.Fill;
            panel.Paint += panel_Paint;

            WebBrowser webBrowser = new WebBrowser();
            webBrowser.Dock = DockStyle.Fill;
            webBrowser.Url = new Uri("http://stackoverflow.com/");

            Controls.Add(panel);

            // If I comment out the line below then I will
            // be able to see my blue rectangle.
            panel.Controls.Add(webBrowser);
        }

        private void panel_Paint(object sender, PaintEventArgs e)
        {
            ShowLineJoin(e);
        }

        private void ShowLineJoin(PaintEventArgs e)
        {
            // Create a new pen.
            Pen skyBluePen = new Pen(Brushes.Blue);

            // Set the pen's width.
            skyBluePen.Width = 1;

            // Set the LineJoin property.
            skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;

            // Draw a rectangle.
            e.Graphics.DrawRectangle(skyBluePen,
                new Rectangle(0, 0, 200, 200));

            //Dispose of the pen.
            skyBluePen.Dispose();
        }
    }
}

【问题讨论】:

    标签: c# winforms graphics drawing panel


    【解决方案1】:

    这是不可能的。如果您将 WebBrowser 添加为面板的子控件,它将显示在面板的背景区域之上。面板的背景区域当然是您绘制蓝色矩形的地方。你的绘图还在,WebBrowser 控件只是显示在它上面。

    想到了三种可能的解决方案,此处不按特定顺序列出:

    1. 只要您希望蓝色矩形(或在 Panel 控件背景上绘制的任何内容可见),请将 WebBrowser 控件的 Visible 属性设置为 false。再次将 WebBrowser.Visible 设置为 true,以便可以使用 WebBrowser 控件。

    2. 与其将 WebBrowser 控件添加为 Panel 的子控件(后者又是容器窗体的子控件),不如将 Panel 和 WebBrowser 控件添加为容器窗体的子控件。换句话说,扁平化层次结构。因为这消除了父子关系,所以您现在可以更改控件的 Z 顺序,从而更改哪个可见。这在 WinForms 中使用 SendToBackBringToFront 成员函数是微不足道的。

    3. 创建一个 new 控件,命名为 BlueRectangleDrawingSurface 或其他名称,继承自 System.Windows.Forms.Control。覆盖其OnPaint 事件并将您的绘图代码放在那里。将此控件类的实例作为子控件添加到您的 Panel 控件。那么,您的 Panel 控件实际上将有两个子控件:BlueRectangle 控件和 WebBrowser 控件。如上所述,使用SendToBackBringToFront 更改Z 顺序,在两者之间来回移动。

    在不相关的说明中,您应该更喜欢 using 语句,以确保自动释放实现 IDisposable 的对象,而不是显式调用 Dispose 方法。例如,像这样编写ShowLineJoin 方法:

    private void ShowLineJoin(PaintEventArgs e)
    {
        // Create a new pen with the specified color and width.
        using (Pen skyBluePen = new Pen(Brushes.Blue, 1))
        {
            // Set the LineJoin property.
            skyBluePen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel;
    
            // Draw a rectangle.
            e.Graphics.DrawRectangle(skyBluePen,
            new Rectangle(0, 0, 200, 200));
        }
    }
    

    更简单、更易读、更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多