【问题标题】:Transparent Panel on top of another normal panel另一个普通面板顶部的透明面板
【发布时间】:2009-05-03 01:43:44
【问题描述】:

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

有什么想法吗???

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

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

谢谢,

【问题讨论】:

  • 你到底想做什么?如果它是透明的,你怎么知道不透明面板在透明面板之上?
  • 我可以设置透明面板的透明度。目前设定为 50%。所以我知道哪一个在上面。
  • 您能在 pasteit.net(或任何其他代码共享网站)上发布一个简单的示例吗?我很乐意提供更多帮助

标签: c# winforms


【解决方案1】:

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

同一控件中的两个兄弟姐妹将相互绘制。

所以要回答这个问题,最上面的面板/控件必须是您要在其上绘制的控件的子控件。

【讨论】:

  • 我认为保罗是正确的。我尝试过使用 Paint 事件,但无法让它对您的情况做任何有用的事情。您可能会在只绘制不相交的矩形或其他东西的情况下进行一些黑客工作,但这似乎太复杂了。即使是动态添加,它也可能更容易添加为子控件。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    如果您以编程方式执行此操作,则可以调用 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()
    

    Suspend/Resume Layout 调用可防止 UI 在您重新排列时更新。

    【讨论】:

    • 谢谢 Yoooder 我已经尝试过您的解决方案,但恐怕它不起作用。我在 InitialiseComponent 之后将代码添加到表单的构造函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2014-09-11
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多