设置透明背景Win32

我想要做的是非常简单的,但似乎没有很多关于它的信息。 基本上我有一个正常的非透明的父窗口,我想放置一个子窗口(有它自己的非透明的控制)在父窗口。 所以我唯一要做的就是将子窗口的背景画笔设置为透明,但是仍然绘制白色背景。 尝试使用WS_EX_LAYERED样式和SetLayeredWindowAttributes,但它使子窗口不可见。

在Windows上实现“透明”子控件有​​两种基本的方法:

  • 在父窗口中处理WM_CTLCOLORxxx消息。 这是使现有控件支持透明度的一种便捷方式。 每个控件将发送一个适合于控件类型的WM_CTLCOLORxxx消息。 如果您创建了代表对话框的背景外观的画笔,并从每条消息中返回该画笔,则净效果就好像每个控件都涂有透明的外部区域。 然而,如果你想要阿尔法效果,或者控件在物理上相互重叠,那么这个失败。

  • 在父窗口上使用WS_EX_COMPOSITED。 没有这种风格,窗口管理器画的子窗口的顺序是不确定的,实际上是从上到下。 当试图alpha混合重叠控制结果将是…不愉快的。 WS_EX_COMPOSITED将确保子窗口从下到上绘制。 确保不要使用WS_CLIPCHILDREN或WS_CLIPSIBLINGS样式,因为这将防止重叠区域被绘制。

您仍然需要通过WM_CTLCOLORxxx消息来做一些巧妙的事情,因为标准控件仍然会尝试使用dialog-background-grey填充整个矩形。