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

Mik*_*wan 5 winapi controls dialog

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

如果我们拿一个对话框并把某种位图作为背景,我们可以很容易地看到分组框控件的真实色彩。默认情况下,没有任何覆盖,它看起来像这样:

http://localhostr.com/file/ItBy6DF/no%20override.png

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

case WM_CTLCOLORSTATIC: {
  HDC hDC = ( HDC )wParam;
  SetTextColor( hDC, RGB( 255, 255, 255 ) );
  SetBkMode( hDC, TRANSPARENT );
  return ( INT_PTR )GetStockObject( HOLLOW_BRUSH );
}
Run Code Online (Sandbox Code Playgroud)

我通过更改清单来测试启用和不启用视觉样式的外观:

#pragma comment(linker,"\"/manifestdependency:type='win32' \
    name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
    processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Run Code Online (Sandbox Code Playgroud)

使用视觉样式,对话框如下所示:

http://localhostr.com/file/hyJOhsj/theming.png

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

http://localhostr.com/file/8nVzn7t/no%20theming.png

文本颜色已更改且透明度已生效,但组框的矩形显示甚至文本所在的位置。

我已将项目上传到此处,供任何有兴趣使用它进行测试的人使用。

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

同样,如果我使用 SetWindowLong() 切换所有者绘制样式,然后将控件子类化以获取 WM_DRAWITEM 消息,有什么我应该注意的吗?我应该如何处理视觉样式等?

Vis*_*hal 2

您是否尝试为 WM_CTLCOLORSTATIC 返回 hBrBackground 而不是 GetStockObject(HOLLOW_BRUSH) ?