我想要做的事情很简单,但似乎没有太多关于它的信息。基本上我有一个普通的非透明父窗口,我想在父窗口中放置一个子窗口(它有自己的非透明控件)。因此,我唯一要做的就是将子窗口的背景画笔设置为透明,但它仍然会绘制白色背景。尝试使用WS_EX_LAYERED样式和SetLayeredWindowAttributes,但它使子窗口不可见。
答案 0 :(得分:7)
在Windows上实现“透明”子控件有两种基本方法:
在父窗口中处理WM_CTLCOLORxxx消息。 这是使现有控件支持透明度的便捷方式。每个控件将发送适合于控件类型的WM_CTLCOLORxxx消息。如果创建一个表示对话框背景外观的画笔,并从每条消息中返回该画笔,则净效果就像每个控件都涂有透明外部区域一样。 但是,如果您想要alpha效果,或者控件在物理上相互重叠,则会失败。
在父窗口中使用WS_EX_COMPOSITED。 没有这种风格,窗口管理器绘制子窗口的顺序是未定义的,在实践中,它从上到下。当尝试alpha混合重叠控件时,结果将是......令人不快。 WS_EX_COMPOSITED将确保子窗口从下到上绘制。确保您不要使用WS_CLIPCHILDREN或WS_CLIPSIBLINGS样式,因为这样可以防止重叠区域被绘制。
你还需要通过WM_CTLCOLORxxx消息做一些聪明的事情,因为标准控件仍然会尝试用对话框 - 背景 - 灰色填充整个矩形。