【问题标题】:Transparent form background with MenuStrip?MenuStrip 的透明表单背景?
【发布时间】:2013-05-23 06:36:20
【问题描述】:

根据关于 SO 的很多问题,使表单背景透明的最佳方法是将其设置为相当未使用的颜色(如洋红色),然后将表单的 TransparencyKey 设置为该颜色。

this.BackColor = Color.Magenta;
this.TransparencyKey = Color.Magenta;

那部分工作正常。我遇到的问题是它在 MenuStrip 后面工作正常except。 MenuStrip 中的半透明背景 + 表单中的透明背景最终如下:

这就是 MenuStrip 的样子。它变成洋红色的部分是 MenuStrip 本身设置为半透明时。

这是我的表单初始化函数的样子:

public frmMain() {
    this.TransparencyKey = Color.Magenta;
    InitializeComponent();
    this.BackColor = Color.Magenta;

    if(Properties.Settings.Default.windowTheme == 0) { // theme is light
        menuStrip.Renderer = new ToolStripProfessionalRenderer(new LightTheme());
    }
    else if(Properties.Settings.Default.windowTheme == 1) {
        menuStrip.Renderer = new ToolStripProfessionalRenderer(new DarkTheme());
    }

    menuStrip.Invalidate();
}

还有我的 MenuStrip 自定义渲染器(颜色现在仅用于测试):

public class LightTheme: ProfessionalColorTable {
    public override Color MenuItemSelected {
        get { return Color.FromArgb(255, Color.Yellow); }
    }

    public override Color MenuStripGradientBegin {
        get { return Color.FromArgb(255, Color.Black); }
    }

    public override Color MenuStripGradientEnd {
        get { return Color.FromArgb(0, Color.Gainsboro); }
    }
}

我在这里真正想要完成的是让表单透明并且 MenuStrip 的一部分透明,这样您就可以看到它下面的桌面。有没有更好的方法或解决此问题的方法?

【问题讨论】:

标签: c# transparency menustrip


【解决方案1】:
public override Color MenuStripGradientEnd {
    get { return Color.FromArgb(0, Color.Gainsboro); }
}

这是问题开始的地方,您为渐变结束颜色指定了 0 的 alpha。效果很好,alpha混合得很好。但它适用于背景颜色。所以你会看到洋红色的混合。不再与颜色键匹配,因此像素变得可见。

Windows 内置的分层窗口功能支持两种方式将窗口与桌面混合,底层的 winapi 调用是 SetLayeredWindowAttributes()。 Winforms 支持通过设置 TransparencyKey 属性启用的 LWA_COLORKEY 选项,但不支持 LWA_ALPHA 选项。称为“每像素 alpha”。您会在需要启用它的 pinvoke 上找到大量 google 提示。

但您会大吃一惊,您会发现工具箱中的大多数控件都停止工作。 Winforms 中的文本渲染是由 GDI 完成的,GDI 是一个渲染 alpha 为 0 的文本的 api。不可避免的副作用是,当您打开 per-pixel alpha 时,该文本现在也是透明的。您可以将其称为功能,但非常不切实际,因为您无法控制桌面颜色,也无法控制您背后的窗口。

这也可以通过替换控件并使用像 DirectWrite 这样的文本呈现 API 来解决。但这是相当多的工作,而且您不再从 Winforms 中获得太多好处。 WPF 支持每像素 alpha,它不使用标准的 Windows 控件。

【讨论】:

  • 所以据我了解,这只是一团糟,听起来我最好不要打扰。我仍然是一个中级 C# 用户,所以我真的不知道如何做这些事情。
  • 我也曾经是一名中级 C# 用户。没持续多久,我就烦了。但是,是的,不要费心在 Winforms 中进行这项工作。
猜你喜欢
  • 2011-10-02
  • 2014-07-13
  • 2021-10-27
  • 2019-06-12
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多