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

Bee*_*Guy 3 controls transparency backcolor winforms

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

一张图片胜过千言万语:

替代文字

还有几句话:
背后CheckBox有什么是有色的PictureBoxes和a Button.
CheckBoxBackColor设置为Transparent.但不知何故,它决定了这意味着它应该分享其中BackColor的含义Form(这是它对透明幻觉的看法吗?).

这在WinForms中不可能吗?我发誓我之前做过这件事.

更新:
我刚试过这个:
在那个表单上,将CheckBox's 设置BackColorTransparent,然后BackColor将包含更改为Form其他颜色,CheckBox并将匹配BackColor.什么.......?

Han*_*ant 6

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

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

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

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

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