根据这里的许多问题,使表单的背景透明的最佳方法是将其设置为相当未使用的颜色(如洋红),然后将表单的TransparencyKey设置为该颜色。
this.BackColor = Color.Magenta;
this.TransparencyKey = Color.Magenta;那部分运作得很好。我遇到的问题是,除了MenuStrip之外,它运行得很好。表单中的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透明的一部分,这样你就可以看到它下面的桌面了。有没有更好的方法来做这件事,还是有办法解决这个问题?
发布于 2013-05-23 13:41:50
public override Color MenuStripGradientEnd {
get { return Color.FromArgb(0, Color.Gainsboro); }
}这是问题开始的地方,您为渐变结束颜色指定了一个0的alpha值。它工作得很好,阿尔法混合得很好。但是它适用于背景颜色。所以你可以看到洋红的混合物。它不再与颜色键匹配,因此像素变得可见。
windows中内置的分层窗口特性支持两种将窗口与桌面混合的方法,底层的winapi调用是SetLayeredWindowAttributes()。Winforms支持通过设置LWA_COLORKEY属性而启用的TransparencyKey选项,但不支持LWA_ALPHA选项。叫做“每像素阿尔法”。你会发现很多谷歌提示在你需要的调用上启用它。
但是这样你就会大吃一惊,你会发现工具箱中的大多数控件都停止工作了。Winforms中的文本呈现是由GDI完成的,GDI是一个api,它使用alpha值为0呈现文本。不可避免的副作用是,当你打开每个像素的alpha,文本现在也是透明的。你可以称之为一个功能,但是非常不切实际,因为你不能控制桌面的颜色,也不能控制你后面的窗口。
通过替换控件并使用像DirectWrite这样的文本呈现api,这也是可以修复的。但是这是相当多的工作,你只是没有从Winforms那里得到太多的好处。WPF支持每像素α,它不使用标准的Windows控件.
https://stackoverflow.com/questions/16707132
复制相似问题