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

时间:2011-08-08 20:37:52

标签: winapi dialog controls

我正在尝试制作组框控件的文本颜色和背景。我正在使用对话框和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 );
}

我通过改变清单来测试带有和不带视觉样式的外观:

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

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

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

背景将更改为不可接受的纯色,具体取决于对话框的背景。文本颜色也未能改变。禁用可视样式后,对话框如下所示:

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

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

我已经为有兴趣使用它的人上传了项目here

我在这个网站上读过其他类似的问题,似乎暗示如果没有子类化或所有者绘制,这可能是不可能的。我不介意子类化,但我检查没有更好的方法来做它。如果唯一的方法是子类化,我很乐意获得有关应该覆盖的内容的信息(可能是WM_PAINT)。我在网上找到了人们创建自己的组框控件的例子,但有些人似乎遇到了z顺序问题。因此,使用子类化,是否与处理WM_NCHITTEST相关?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这是一个古老的问题,但有人可能会寻找答案。要使组框文本的背景与窗口背景相同,请在TRANSPARENT函数中将OPAQUE更改为SetBkMode