获取组框边框的系统颜色

时间:2013-07-05 09:39:15

标签: windows winapi

通常标准控件使用的大多数颜色都可以从GetSysColor获得,我使用所有COLOR_常量(0-30)进行测试,并将其与组框边框的颜色进行比较,没有一个匹配。我正在使用XP,组框边框的颜色为0xD0D0BF

如何获得用于绘制组框边框的系统颜色?

1 个答案:

答案 0 :(得分:4)

使用“经典”主题(在XP上,或以前版本的Windows中的唯一主题),组框边框不是单一颜色。它实际上是一条“蚀刻”线,由两条不同颜色的线组成。每种颜色都有COLOR_*值,但您不想尝试以这种方式重新创建线条。相反,使用GDI的DrawEdge函数和EDGE_ETCHED标志。

但是如果您启用了主题,则组框边框实际上 是单一颜色,并且该颜色会根据所选主题而有所不同。无法使用GetSysColor检索主题颜色,因为它们没有相应的COLOR_*值。该API是在构思主题之前发明的 long 。相反,有一整套新的主题API。您感兴趣的是GetThemeColor,但为了使用它,您还需要OpenThemeDataCloseThemeData

棘手的部分是弄清楚要传递给OpenThemeData函数的内容。 This question可能对此有所帮助。组框控件实际上是一种特殊类型的按钮控件,因此您需要的样式是:

  • 分类: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);

不幸的是,这并没有告诉您如何获取颜色值本身。