首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >透明的表单背景与MenuStrip?

透明的表单背景与MenuStrip?
EN

Stack Overflow用户
提问于 2013-05-23 06:36:20
回答 1查看 2.1K关注 0票数 2

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

代码语言:javascript
复制
this.BackColor = Color.Magenta;
this.TransparencyKey = Color.Magenta;

那部分运作得很好。我遇到的问题是,除了MenuStrip之外,它运行得很好。表单中的MenuStrip +透明背景中的半透明背景以如下方式结束:

这就是MenuStrip看起来的样子。它变成洋红的部分是当MenuStrip本身被设置为半透明的时候.

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

代码语言:javascript
复制
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定制的渲染器(颜色现在只用于测试):

代码语言:javascript
复制
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透明的一部分,这样你就可以看到它下面的桌面了。有没有更好的方法来做这件事,还是有办法解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 13:41:50

代码语言:javascript
复制
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控件.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16707132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档