如何显示与面板控件中的所有内容重叠的矩形

本文关键字:重叠 控件 何显示 显示 | 更新日期: 2023-09-27 18:36:37

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

如何在面板控件内部创建一个矩形绘图,它将重叠所有内容?(始终在顶部)

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

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();
        }
    }
}

如何显示与面板控件中的所有内容重叠的矩形

是不可能的。如果将 Web 浏览器添加为面板的子控件,它将显示在面板背景区域的顶部。当然,面板的背景区域是您绘制蓝色矩形的位置。您的绘图仍然存在,WebBrowser 控件只是显示在其顶部。

我想到了三种可能的解决方案,此处没有特别的顺序:

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

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

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

在不相关的说明中,您应该首选 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));
    }
}

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