2

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

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

问题是文本打印在用户控件后面,所以看不到。(如果我在打开的情况下更改文本的位置,它会正确显示)。

有任何想法吗?

4

4 回答 4

2

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

透明度在 Windows 窗体中无法正常工作。如果您将某些内容设置为具有透明背景,则通常最终会显示表单背景,而不是直接父级。

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

  1. 通过将所有内容渲染到位图然后显示它来自己完成所有合成。这仅适用于静态内容。
  2. 创建一个无窗口渲染模型,该模型可以渲染 #1 中的所有内容,还可以处理鼠标与其组成元素的交互。
  3. 创建一个新的顶层分层窗口 (WS_EX_LAYERED),它覆盖控件并呈现所需的内容。这禁止与底层控件的交互,除非采取措施传递消息。我相信这是 Visual Studio 2008 用于 windows 窗体设计器表面的方法。
于 2009-07-29T12:44:29.223 回答
1

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

这里有更多信息:在面板内的控件之上绘图(C# WinForms)

于 2009-07-29T12:11:32.723 回答
1

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

于 2009-07-29T12:48:38.210 回答
0

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

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

       // Your drawing code here


    }
}
于 2009-07-29T12:44:25.950 回答