2009-07-29 34 views
2

你如何绘制应该在其他任何东西上的字符串? 现在在我的面板中,我在Panel1.Controls中有一些用户控件。所以我将其添加到Paint方法中:C#如何绘制对象的前面?

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

问题是,文本打印在用户控件的后面,所以无法看到。 (如果我改变了文字的位置,它显示正确)。

任何想法?

+0

是不是.NET的问题,而不是C#的问题? C#是语言。 .NET是框架。 – 2009-07-29 11:56:07

+0

您使用的是哪个版本的.NET? – Kazar 2009-07-29 12:17:00

+0

我正在使用.Net 3.5 – Patrick 2009-07-29 12:30:20

回答

2

所有的Windows窗体控件都是基于HWND,这意味着他们各自有自己的窗口句柄和控件的Z顺序/亲子决定了剪辑的内容。面板绘画事件正在绘制到面板控件上,但面板控件输出被所有子控件剪裁。

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

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

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

怎么样在面板覆盖的OnPaint,写你的绘图代码后的基材涂料?

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

     // Your drawing code here 


    } 
} 
1

我不确定它会工作,但你可以尝试SendToBack在面板内的所有用户控件,然后也许文本将显示在顶部。