透明面板位于另一个普通面板的顶部

时间:2009-05-03 01:43:44

标签: c# winforms

我想在另一个面板的顶部显示一个透明面板,两个面板都有子控件,如标签,文本框等。如果透明面板是另一个面板的子控件,透明度可以正常工作但如果不是那么标签和普通面板的文本框显示在透明面板的顶部。该地区其他地区的透明度很好。

任何想法???

我尝试将透明面板放在前面但没有帮助。也许我需要指定控件的绘制顺序?如果是,我该怎么做?

有趣的是,如果我将应用程序移动到任务栏下方并将其启动。它取得了正确的结果。 (重印解决问题!!但为什么??)。但是,当我最小化它并恢复时它不会修复它!

谢谢,

3 个答案:

答案 0 :(得分:5)

Windows.Forms中的透明度由关系层次结构而不是可视层次结构实现。当绘制透明控件时,.NET基本上调用父树,要求每个父控件自己绘制,然后绘制实际控件内容本身。

同一控件中的两个兄弟姐妹会相互涂抹。

因此,要回答这个问题,最顶层的面板/控件需要是您想要绘制的控件的子项。

答案 1 :(得分:1)

如果你想要一个不会遮挡其兄弟姐妹的透明控件,根据Bob Powell你可以通过重写CreateParams方法来增加真正的透明度。请阅读链接以获取完整说明。

答案 2 :(得分:0)

如果您的所有面板/标签/控件都是单个UserControl的一部分,那么您可能只需要设置Z顺序(从前到后的顺序)。您可以使用Visual Studio的Designer中的文档大纲在View>下执行此操作。其他Windows>文件大纲。

如果你以编程方式进行,那么你可以调用Control.BringToFront()或Control.SendToBack()来改变它们的z顺序。一种可行的方法是(假设ctl1打算在后面,而ctl4打算是前端模式。

SuspendLayout()
ctl1.BringToFront()
ctl2.BringToFront() ' Bring ctl2 in front of ctl1
ctl3.BringToFront() ' 3 in front of 2 (and in turn 1)
ctl4.BringToFront() ' 4 in front of the rest
ResumeLayout()

暂停/恢复布局调用会阻止在重新排列内容时更新UI。