首页 > 解决方案 > C#透明面板?

问题描述

所以我通过使用 GDI 制作游戏引擎来挑战自己。

到目前为止,我已经设法使用 GDI 制作了一些游戏 - 但是我最近遇到了一个问题,我需要一些帮助。

我已经实现了一个 UI 系统,并发现 GDITranslate函数会移动整个画布。随后,我的所有鼠标坐标都被偏移,导致我的 UI 系统无法按预期工作。

问题:有没有办法让Panel 在Paint 方法上透明?

我试图将清晰的颜色设置为透明,但这只会使面板变黑。

标签: c#winformsgdi+

解决方案


我无法指出这一点的来源,但我现在做了一些测试,我的解释如下:

当我将面板的 BackgroundColor 设置为 Colors.FromArgb(50,0,0,0) 时,它起作用了,因为每当我更改面板的 Backgroundcolor 时,面板就会继续存在,然后表单的颜色就会透过面板发光。

但是:位于此面板后面的其他控件并非一直可见。我确信出于性能原因,控件的呈现仅在用户可见时才会发生,这意味着它们不会被其他控件覆盖。所以表单的颜色是透光的,因为透明颜色确实有效,但是面板后面的控件没有被渲染,因为它们被另一个控件覆盖了。

您必须编写自己的控件:

  public class TransparentPanel : Panel
  {
    protected override CreateParams CreateParams
    {
      get
      {
        var cp = base.CreateParams;
        cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT
        return cp;
      }
    }
  }

这告诉窗口,该控件是透明的,并且在该控件后面的 z 顺序中的控件也必须被渲染。


推荐阅读