如何在原始WinForms控件上实现透明的BackColor?

3

我快要崩溃了。
为什么复选框控件与其后面的内容不能融合在一起?
这个问题适用于所有WinForms控件,但我以此作为示例。

一张图片胜过千言万语:

alt text

再多说几句:
CheckBox的后面是有颜色的PictureBox和一个Button
CheckBoxBackColor设置为Transparent,但它却决定应该共享包含FormBackColor(这是它对透明度的幻想吗?)。

在WinForms中难道不可能吗?我敢肯定我以前做过这个。

更新:
我刚试了一下:
在那个窗体上,将CheckBoxBackColor设置为Transparent,然后更改包含FormBackColor为其他颜色,CheckBox就会与那个BackColor相匹配。这是什么鬼……?


我之前也遇到过这个问题,据我所知就是这样的。但我希望其他人能为你提供解决方法 :) - clifgriffin
3个回答

6
这是控件作为Windows窗口的副作用。窗口负责绘制自身,OnPaintBackground和OnPaint方法负责此任务。
这种渲染模型不支持透明度。使用分层窗口可以实现真正的透明度。这是由视频适配器实现的,Windows使用其硬件叠加功能。但这仅适用于顶级窗口,而不是子窗口。请注意Form.Opacity和Form.TransparencyKey属性。
通过一个技巧,可以部分支持透明度。控件可以通过请求父窗口首先在控件窗口内绘制自身来模拟它。这会产生背景像素,然后可以在其上绘制。将BackColor属性设置为Color.Transparent可为支持此功能的控件启用此技巧。所有ButtonBase派生类都支持此功能,但是包装本机Windows控件的控件不支持此功能。
“请求父窗口”是此技巧中的缺陷,在您的截图中可以看到此问题。您正在看到表单像素。堆叠效果不起作用,它从不考虑Z顺序中的任何中间窗口,只考虑父窗口。这是可以修复的,但非常丑陋,有一篇KB文章展示了代码。
值得注意的是,WPF没有此限制。控件不是窗口,它们通过在父级上绘制自己来呈现。层层涂料。透明度现在很简单,只需不绘制即可。

1
你能手动设置复选框的背景颜色吗?可以设置成图片框背后的颜色吗?
“透明”可能与你想要的不同。
另外,尝试更改图片框的Z顺序(移到最前面),看是否会改变复选框下面的颜色。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接