【发布时间】:2008-11-12 02:37:24
【问题描述】:
我知道这个问题已经被问了好几次了,但到目前为止我还没有找到一个好的解决方案。
我有一个面板,上面有其他控件。
我想在它上面和面板中所有控件的顶部画一条线
我遇到了 3 种类型的解决方案(没有一种按我想要的方式工作):
获取桌面 DC 并在屏幕上绘制。
如果它们与表单重叠,这将利用其他应用程序。覆盖面板的“CreateParams”:
=
protected override CreateParams CreateParams {
get {
CreateParams cp;
cp = base.CreateParams;
cp.Style &= ~0x04000000; //WS_CLIPSIBLINGS
cp.Style &= ~0x02000000; //WS_CLIPCHILDREN
return cp;
}
}
//注意我也试过禁用 WS_CLIPSIBLINGS
然后画线 OnPaint()。
但是...由于面板的 OnPaint 在其中的控件的 OnPaint 之前被调用,
内部控件的绘制只是简单地绘制在行的顶部。
我看到有人建议使用消息过滤器来收听 WM_PAINT 消息,并使用计时器,但我认为这种解决方案既不是“好的做法”,也不是有效的。
你会怎么做 ?判断里面的控件在X ms后绘制完毕,设置定时器为X ms?
此屏幕截图显示了关闭 WS_CLIPSIBLINGS 和 WS_CLIPCHILDREN 的面板。
蓝线在 Panel 的 OnPaint 处绘制,并由文本框和标签简单地绘制。
红线绘制在顶部只是因为它不是从面板的 OnPaint 绘制的(实际上是由于单击了按钮而绘制的)
第三个:创建一个透明图层并在该图层上绘图。
我使用以下方法创建了一个透明控件:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
return cp;
}
}
问题仍然存在,将透明控件置于面板及其所有控件之上。
我曾尝试使用: "BringToFront()" 将其置于最前面,但似乎没有帮助。
我已将它放在 Line 控件的 OnPaint() 处理程序中。
我应该尝试将它放在其他地方吗??
- 这也会造成在面板顶部有另一个控件的问题。 (捕捉鼠标点击等)
任何帮助将不胜感激!
**编辑: 黑线是我尝试做的一个示例。 (用窗户漆画的)
【问题讨论】:
-
我要问:为什么? (抱歉,我讨厌人们这么问——我不是说这是个坏主意,但我很好奇)
-
好吧,我猜:你有一个控件供用户在表单周围拖动,而这里的拖动控件和其他控件之间划了一条线?
-
我添加了一张照片来展示我正在尝试做的事情。我现在正在尝试您的标签解决方案。这是一个黑客,但现在可能就足够了。为了讨论,如果线不是水平或垂直的怎么办?有什么想法吗?
-
这篇文章可能对这个主题有所帮助,但不确定它是否是解决方案:http://www.codeproject.com/KB/GDI-plus/WindowGraphics.aspx 我想我会添加它以防它帮助其他人。
-
Here 是另一种解决方案..