我将在这里失去理智。
为什么复选框控件不会与后面的内容混合?
这个问题适用于所有WinForms控件,但我以此为例。
一张图片胜过千言万语:
还有几句话:
CheckBox
后面的内容有彩色PictureBox
和Button
CheckBox
的{{1}}设置为BackColor
。但不知何故,它决定这意味着它应该共享包含Transparent
的{{1}}(这是它对透明幻觉的看法吗?)。
这在WinForms中是不可能的?我发誓我之前做过这件事。
更新
我刚试过这个:
在该表单上,将BackColor
的{{1}}设置为Form
,然后将包含CheckBox
的{{1}}更改为其他颜色,并BackColor
1}}将匹配Transparent
。什么.......?
答案 0 :(得分:6)
这是Windows窗口控件的副作用。窗口负责绘制自己,OnPaintBackground和OnPaint方法负责处理。
此渲染模型不能很好地支持透明度。通过使用分层窗口支持真正的透明度。这是由视频适配器实现的,Windows使用它的硬件覆盖功能。但这只适用于顶层窗户,而不适用于儿童窗户。请注意Form.Opacity和Form.TransparencyKey属性。
通过技巧部分支持透明度。控件可以通过要求父窗口首先在控件窗口内绘制自己来伪造它。这会产生背景像素,然后可以在其上绘制。将BackColor属性设置为Color.Transparent会为支持此功能的控件启用此技巧。所有的ButtonBase派生类都可以。但不是作为本机Windows控件的包装器的控件。
“询问父窗口”是这个技巧中的缺陷在你的屏幕截图中可见的地方。您正在看到表单像素。堆叠效果不起作用,它从不考虑Z顺序中的任何中间窗口,只考虑父级。这是可以修复的,但非常丑陋,有一篇KB文章显示代码。
值得注意的是,WPF没有此限制。控件不是窗口,它们通过在父窗口上绘制自己来呈现。油漆层。透明度现在微不足道,只是不要画画。
答案 1 :(得分:1)
您可以手动将复选框的背景颜色设置为您想要的颜色吗? (背后的图片框中的值)
'透明'可能意味着与您想要的MS不同。
另外,尝试更改图片框的zorder(显示在前面)并查看是否更改了复选框的基础颜色。
答案 2 :(得分:1)
鲍勃鲍威尔撰写了一篇关于透明控件的优秀文章。看看: