C#如何在对象前面绘制?

时间:2009-07-29 11:53:35

标签: .net graphics user-controls paint drawstring

你如何绘制一个应该在其他一切之上的字符串? 现在,在我的面板中,我在Panel1.Controls中有一些用户控件。所以我把它添加到Paint方法:

Graphics g = Panel1.CreateGraphics();  
g.DrawString("BUSTED", new Font("Arial", 20f), new SolidBrush(Color.Black), new PointF(50, 50));

问题是文本打印在用户控件后面,因此无法看到。 (如果我在打开时更改文本的位置,则会正确显示)。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

所有Windows窗体控件都是基于HWND的,这意味着它们每个都有自己的窗口句柄,控件的z-order / parent-child决定了什么剪辑。面板绘制事件正在绘制到面板控件上,但面板控件输出被其所有子控件剪切。

透明度在Windows窗体中无法正常工作。如果你设置一些具有透明背景的东西,它通常会结束表格背景显示,而不是它的直接父母。

我已经以各种方式解决了这个问题。

  1. 通过将所有内容渲染到位图然后显示来完成所有合成。这仅适用于静态内容。
  2. 创建一个无窗口渲染模型,渲染#1中的所有内容,同时处理与其组成元素的鼠标交互。
  3. 创建一个新的顶级分层窗口(WS_EX_LAYERED),它覆盖控件并呈现所需内容。这禁止与底层控件的交互,除非采取步骤传递消息。我相信这是Visual Studio 2008用于Windows窗体设计器表面的方法。

答案 1 :(得分:1)

尝试添加覆盖所有控件的面板,然后绘制其中。必须设置面板透明度。

以下是更多信息:Drawing on top of controls inside a panel (C# WinForms)

答案 2 :(得分:1)

我不确定它是否可行,但您可以在面板内的所有用户控件上尝试SendToBack,然后文本将显示在顶部。

答案 3 :(得分:0)

如何在Panel中覆盖OnPaint,并在绘制基础后编写绘图代码?

class DrawingPanel : Panel {
    protected override void OnPaint(PaintEventArgs e)
    {
       base.OnPaint(e);

       // Your drawing code here


    }
}