我在位图上绘制了一些窗口控件,在对话框上绘制了彩色背景.是否有一些可能的方法使窗口控件的背景透明?目前,它们显示对话框的默认彩色背景.
示例 - 我尝试粘贴一个纯蓝色位图,两个按钮控件具有明显的默认彩色矩形背景.

这可以通过为Windows提供一个句柄来轻松解决,这个句柄可以用于绘制按钮背景的任何画笔.只要在按钮的父窗口的消息处理程序中收到WM_CTLCOLORBTN消息,就会执行此操作.
我嘲笑了一个小型的演示应用程序,它可以并排比较两个不同的按钮.两者都是标准的Win32 BUTTON控件,但左侧的控件处理WM_CTLCOLORBTN消息并指定与窗口背景颜色相同的画笔.你可以看到不同紧邻的浅灰色(或者,更准确地说,对于3D控件,默认颜色COLOR_3DFACE)按钮周围的矩形条纹消失,按钮看起来对自定义背景色要好得多:

该效果也适用于启用了视觉主题的Windows XP - 这是同一个应用程序的屏幕截图:

我用来创建上述效果的代码几乎是非常简单的.将其添加到应用程序的主窗口过程(MainWndProc),如上所述.您无需触摸按钮.
HBRUSH hButtonBackColor = NULL;
LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_CTLCOLORBTN:
{
if (!hButtonBackColor)
{
// Create the brush, if it hasn't already been created.
// (You can use any type of brush here; this is just an example.)
hButtonBackColor = GetSysColorBrush(COLOR_3DDKSHADOW);
}
return (LRESULT)hButtonBackColor;
}
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是,请确保您指定的画笔表示与窗口背景颜色完全相同的颜色 - 透明画笔可能无法正常工作.同样,对于带图案的画笔(有没有人再使用它们?),需要将画笔的原点设置为与背景相匹配.
务必确保通过调用释放您创建的任何画笔DeleteObject!在C++中,您可以通过使CBrush对象(或等效对象)成为对话框类的成员来实现此目的,以便自动销毁它.在C中,您需要处理WM_NCDESTROY消息并手动删除画笔.
还要注意的是,你并不需要指定BS_OWNERDRAW样式,以便这一招工作.上面的例子中使用两个标准按钮控件,仅使用下面的窗口风格标志创建的:WS_CHILD,WS_VISIBLE,和BS_PUSHBUTTON.
当然,如果你的设计比上面的例子复杂(例如,你的按钮重叠多个背景),你可能不得不采用所有者绘制路线.我认为这对于一个像你似乎描述的那个简单的任务来说太过分了.