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

时间:2010-12-02 19:43:17

标签: winforms controls transparency backcolor

我将在这里失去理智。
为什么复选框控件不会与后面的内容混合? 这个问题适用于所有WinForms控件,但我以此为例。

一张图片胜过千言万语:

alt text

还有几句话:
CheckBox后面的内容有彩色PictureBoxButton CheckBox的{​​{1}}设置为BackColor。但不知何故,它决定这意味着它应该共享包含Transparent的{​​{1}}(这是它对透明幻觉的看法吗?)。

这在WinForms中是不可能的?我发誓我之前做过这件事。

更新
我刚试过这个:
在该表单上,将BackColor的{​​{1}}设置为Form,然后将包含CheckBox的{​​{1}}更改为其他颜色,并BackColor 1}}将匹配Transparent。什么.......?

3 个答案:

答案 0 :(得分:6)

这是Windows窗口控件的副作用。窗口负责绘制自己,OnPaintBackground和OnPaint方法负责处理。

此渲染模型不能很好地支持透明度。通过使用分层窗口支持真正的透明度。这是由视频适配器实现的,Windows使用它的硬件覆盖功能。但这只适用于顶层窗户,而不适用于儿童窗户。请注意Form.Opacity和Form.TransparencyKey属性。

通过技巧部分支持透明度。控件可以通过要求父窗口首先在控件窗口内绘制自己来伪造它。这会产生背景像素,然后可以在其上绘制。将BackColor属性设置为Color.Transparent会为支持此功能的控件启用此技巧。所有的ButtonBase派生类都可以。但不是作为本机Windows控件的包装器的控件。

“询问父窗口”是这个技巧中的缺陷在你的屏幕截图中可见的地方。您正在看到表单像素。堆叠效果不起作用,它从不考虑Z顺序中的任何中间窗口,只考虑父级。这是可以修复的,但非常丑陋,有一篇KB文章显示代码。

值得注意的是,WPF没有此限制。控件不是窗口,它们通过在父窗口上绘制自己来呈现。油漆层。透明度现在微不足道,只是不要画画。

答案 1 :(得分:1)

您可以手动将复选框的背景颜色设置为您想要的颜色吗? (背后的图片框中的值)

'透明'可能意味着与您想要的MS不同。

另外,尝试更改图片框的zorder(显示在前面)并查看是否更改了复选框的基础颜色。

答案 2 :(得分:1)

鲍勃鲍威尔撰写了一篇关于透明控件的优秀文章。看看:

http://www.bobpowell.net/transcontrols.htm