在保持文本清晰的同时使表单透明

Posted

技术标签:

【中文标题】在保持文本清晰的同时使表单透明【英文标题】:Making a form transparent while maintaining text clarity 【发布时间】:2022-01-10 19:58:00 【问题描述】:

所以我一直在为有趣的人制作一个股票跟踪器,我只需要克服 1 个障碍。那就是:我想让应用程序中的所有内容基本上都是透明的,除了文本和边框。

我尝试过在谷歌搜索时遇到的各种事情,例如

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

这行得通,只是它也弄乱了我的标签文本的字体/边框(?),导致:

我很想知道是否有办法去除标签文本周围的阴影,那样的话就完美了。

我也尝试过其他的东西,比如搞砸这个:

protected override void OnPaintBackground(PaintEventArgs e)

  //variations of code here

这完全搞砸了一切,原因我还不明白,就像这样:

然后我继续尝试弄乱以下代码的变体,但似乎什么也没做:

this.SetStyle(ControlStyles.USerPaint, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
// more variations of code

也许我对这一切的了解还不够多(我根本不了解 OnPaintBackground 方法),但无论如何我都感到有点失落。有人知道如何解决这个问题吗?

【问题讨论】:

我建议你放弃 WinForms 并至少使用 WPF,因为 WinForms 不支持堆叠控件、真正的透明度等。您使用 WinForms 有什么原因吗? “我很想知道是否有办法去除标签文本周围的阴影,在这种情况下,这将是完美的。” - 我不认为那些是“阴影”,我认为那些是亚像素抗锯齿(“ClearType”)的伪影。我想你可以禁用它,这样你就可以干净地隔离文本,但你还需要禁用 all 抗锯齿,而不仅仅是亚像素抗锯齿 - 最终结果将清晰易读,但它不会要漂亮(想想:非常 1995 年的样子)。 我在一家在他们的软件中使用 WinForms 的公司工作,我想我会弄乱它来熟悉一下。 很公平——毕竟,自我提升是一个正当的理由。但我确实建议您完成此操作后,在 WPF 中再次尝试 - 如果只是为了感受 WPF 的不同之处。 @Dai 你的回答确实导致了一些有用的东西。非常感谢!如果您想将其发布为答案,请继续,否则我想我会自己发布它来回答这个问题:) 【参考方案1】:

@Dai,我试过了,把所有的标签文字都变白了,但是我不能再按按钮了

public Form1()
        
            InitializeComponent();
            this.BackColor = Color.Magenta;
            this.TransparencyKey = BackColor;
        
        protected override void OnPaint(PaintEventArgs e)
        
            e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            e.Graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            e.Graphics.DrawString(" ", Font, new SolidBrush(ForeColor), 0, 0);
        

对解决方案有任何想法吗?

结果基本完美,只是我不能再按按钮了

编辑:找到答案,Backcolor 不能有 R & B 相等的值...

【讨论】:

以上是关于在保持文本清晰的同时使表单透明的主要内容,如果未能解决你的问题,请参考以下文章

合并图像并保持透明度

如何创建具有不透明度的父 div,同时将文本的不透明度保持在 100% [重复]

跨浏览器 rgba 透明背景,同时保持内容(文本和图像)不透明

如何使状态栏透明,文本颜色为灰色?

如何在 Swift 3 中使这个 UITableView 清晰(透明)

使 SKSpriteNode 透明