通常,标准控件使用的大多数颜色都可以从GetSysColor
获得,我运行了所有常量(0-30)的所有COLOR_
测试,并将其与组框边框的颜色进行比较,他们匹配。我使用XP,并且组框边框的颜色为0xD0D0BF
。获取组框边框的系统颜色
如何获取用于绘制组框边框的系统颜色?
通常,标准控件使用的大多数颜色都可以从GetSysColor
获得,我运行了所有常量(0-30)的所有COLOR_
测试,并将其与组框边框的颜色进行比较,他们匹配。我使用XP,并且组框边框的颜色为0xD0D0BF
。获取组框边框的系统颜色
如何获取用于绘制组框边框的系统颜色?
使用“经典”主题(在XP上,或以前版本的Windows中唯一的主题),组框边框不是单一的颜色。它实际上是一条“蚀刻”线,由两条不同颜色的线组成。每种颜色都有COLOR_*
值,但您不想尝试以这种方式重新创建线条。相反,使用GDI的DrawEdge
函数和EDGE_ETCHED
标志。
但是,如果启用了主题,则组框边框实际上是是单一颜色,并且该颜色因所选主题而异。无法使用GetSysColor
检索主题颜色,因为它们没有对应的COLOR_*
值。在构思主题之前,该API是发明了长。相反,有一套全新的主题API。你在这里感兴趣的是GetThemeColor
,但为了使用它,你还需要OpenThemeData
和CloseThemeData
。
棘手的部分是搞清楚要传递给OpenThemeData
函数的内容。 This question可能有帮助。 A组框控件实际上是一种特殊类型的按钮控制的,所以你想要的风格是:
BUTTON
BP_GROUPBOX
GBS_NORMAL
(也可能是GBS_DISABLED
)TMT_BORDERCOLOR
请确保您的代码在主题被禁用时具有适当的后备支持!使用函数在运行时动态确定并选择适当的绘图代码路径。
编辑:上的XP虚拟机经过一番测试,我无法找到合适的TMT_*
属性ID指定要得到一个组框的边框正确的颜色。我不确定那是怎么回事。但是你可以得到绘制您使用DrawThemeBackground
功能边界:
HTHEME hTheme = OpenThemeData(grpBox->m_hWnd, L"Button");
DrawThemeBackground(hTheme, hDC, BP_GROUPBOX, GBS_NORMAL, &rcArea, NULL);
CloseThemeData(hTheme);
不幸的是,这并没有告诉你如何得到的颜色值本身。
感谢您经过这么多努力来研究这个答案(即使我已经将它标记为答案!)。 – Matt
显然没有直接的方法来获得颜色。我列举了所有'TMT_ *'值,并且它们中的_none_与组合框实际使用的值相匹配。 TMT_BORDERCOLORHINT可能会关闭。 –
问题可能在于它不是单一颜色。例如,如果它是一个渐变。如果'TMT_BORDERCOLORHINT'接近,那可能是解释。也有助于解释为什么它被称为“提示”。 –