Winapi 如何在Win32中为组框控件着色?

Winapi 如何在Win32中为组框控件着色?,winapi,dialog,controls,Winapi,Dialog,Controls,我试图使文本颜色和背景的一组框控件。我正在使用对话框和Win32。为了说明我的问题,我创建了一个项目,其中包含重现问题所需的最少代码 如果我们使用一个对话框并将某种位图作为背景,我们可以很容易地看到组框控件的真实颜色。默认情况下,在不进行任何重写的情况下,它将如下所示: 我将尝试使用以下代码将文本颜色设置为白色,将文本背景设置为透明: case WM_CTLCOLORSTATIC: { HDC hDC = ( HDC )wParam; SetTextColor( hDC, RGB( 2

我试图使文本颜色和背景的一组框控件。我正在使用对话框和Win32。为了说明我的问题,我创建了一个项目,其中包含重现问题所需的最少代码

如果我们使用一个对话框并将某种位图作为背景,我们可以很容易地看到组框控件的真实颜色。默认情况下,在不进行任何重写的情况下,它将如下所示:

我将尝试使用以下代码将文本颜色设置为白色,将文本背景设置为透明:

case WM_CTLCOLORSTATIC: {
  HDC hDC = ( HDC )wParam;
  SetTextColor( hDC, RGB( 255, 255, 255 ) );
  SetBkMode( hDC, TRANSPARENT );
  return ( INT_PTR )GetStockObject( HOLLOW_BRUSH );
}
我通过以下方式更改清单,测试了启用和不启用视觉样式的外观:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
对于视觉样式,对话框如下所示:

根据对话框的背景,背景会被更改为不可接受的纯色。文本颜色也没有改变。禁用视觉样式后,该对话框如下所示:

文本颜色已更改,透明度已起作用,但组框的矩形甚至显示文本所在的位置

我已经上传了该项目的任何人感兴趣的测试与它

我在这个网站上读到了其他类似的问题,这些问题似乎表明,如果没有子类化或所有者绘图,这可能是不可能的。我不介意子类化,但我正在检查是否有更好的方法可以先这样做。如果唯一的方法是子类化,我很乐意获得关于应该重写什么的信息(可能是WM_PAINT)。我在网上找到了人们创建自己的组框控件的例子,但有些人似乎有z顺序问题。因此,通过子类化,处理WM_NCHITTEST是否相关


类似地,如果我使用SetWindowLong()切换owner draw样式,然后对控件进行子类化以获取WM_DRAWITEM消息,那么有什么需要注意的吗?我应该如何处理视觉样式等问题?

您是否尝试返回hBrBackground而不是GetStockObject(空心画笔)以获得WM\u CTLCOLORSTATIC?

这是一个老问题,但有人可能会搜索答案。要使分组框文本的背景与窗口背景相同,请在
SetBkMode
函数中将
透明
更改为
不透明

API@David赫弗南:考虑到我希望它既适用于经典主题,也适用于视觉风格,是否可以简单地使用诸如ArcTo等GDI功能。?是否可以拥有绘制组框控件,或者我应该在对话框的WM_画图中这样做?我怀疑您需要为classic和Themed分别编写代码。我想避免这样的情况:您不可以使用GUI框架吗?