如何显示与面板控件中的所有内容重叠的矩形
本文关键字:重叠 控件 何显示 显示 | 更新日期: 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 控件只是显示在其顶部。
我想到了三种可能的解决方案,此处没有特别的顺序:
将 WebBrowser 控件的
Visible
属性设置为false
只要您希望蓝色矩形(或在 Panel 控件的背景上绘制的任何内容可见)。将 WebBrowser.Visible 设置为再次true
,以便可以使用 WebBrowser 控件。
不要将 WebBrowser 控件添加为面板的子控件(面板又是容器窗体的子控件),而是将面板和 WebBrowser 控件添加为容器窗体的子控件。换句话说,扁平化层次结构。由于这消除了父子关系,因此您现在可以更改控件的 Z 顺序,从而更改可见的控件。这在使用
SendToBack
和BringToFront
成员函数的WinForms中是微不足道的。创建一个新控件,名为
BlueRectangle
或DrawingSurface
或其他什么,它继承自System.Windows.Forms.Control
。覆盖其OnPaint
事件并将绘图代码放在那里。将此控件类的实例作为子控件添加到 Panel 控件中。实际上,您的 Panel 控件将有两个子控件:BlueRectangle
控件和WebBrowser
控件。如上所述,通过更改 Z 顺序在两者之间来回洗牌,使用SendToBack
和BringToFront
。
在不相关的说明中,您应该首选 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));
}
}
更简单、更易于阅读、更安全。