通常标准控件使用的大多数颜色都可以从 中获得GetSysColor
,我用所有COLOR_
常量(0-30)进行了测试,并将其与组框边框的颜色进行了比较,但没有一个匹配。我用的是 XP,组框边框的颜色是0xD0D0BF
.
你如何获得用于绘制组框边框的系统颜色?
使用“经典”主题(在 XP 上,或以前版本的 Windows 中的唯一主题),组框边框不是单一颜色。它实际上是一条“蚀刻”线,由两条不同颜色的线组成。这些颜色中的每一种都有一个COLOR_*
值,但您不想尝试以这种方式重新创建线条。相反,使用带有标志的 GDIDrawEdge
函数。EDGE_ETCHED
但是,如果您启用了主题,则组框边框实际上是一种颜色,并且该颜色会根据所选主题而有所不同。无法使用检索主题颜色,GetSysColor
因为它们没有对应的COLOR_*
值。该 API早在构思主题之前就已发明。相反,有一套全新的主题 API。您在这里感兴趣的是GetThemeColor
,但为了使用它,您还需要OpenThemeData
和CloseThemeData
。
棘手的部分是弄清楚要传递给OpenThemeData
函数的内容。这个问题可能对此有所帮助。组框控件其实是一种特殊类型的按钮控件,所以你想要的样式是:
BUTTON
BP_GROUPBOX
GBS_NORMAL
可能还有GBS_DISABLED
)TMT_BORDERCOLOR
请确保您的代码在禁用主题时具有适当的后备支持!使用该IsAppThemed
函数在运行时动态确定并选择适当的绘图代码路径。
编辑:在 XP VM 上进行一些测试后,我找不到正确的TMT_*
属性 ID 来指定为组框边框获取正确的颜色。我不确定那是怎么回事。但是您可以DrawThemeBackground
使用以下函数为您绘制边框:
HTHEME hTheme = OpenThemeData(grpBox->m_hWnd, L"Button");
DrawThemeBackground(hTheme, hDC, BP_GROUPBOX, GBS_NORMAL, &rcArea, NULL);
CloseThemeData(hTheme);
不幸的是,这并没有告诉您如何获取颜色值本身。