【问题标题】:Get theme properties of Group Box lines获取组框线的主题属性
【发布时间】:2011-05-08 18:26:08
【问题描述】:

我的目标是绘制一个不是矩形的组框,而是将角切掉。我的意思不仅仅是剪掉角落,而是有一个连续的封闭路径,其中角落是“缩进”的。我希望它与当前主题的颜色/样式相匹配。

我注意到在 Windows XP 上,组框有 1 像素的灰线,但在 Windows 7 上,通过在白线旁边有一条灰线(除了底部之外的内部的白线)会产生 3D 效果它位于灰线下方)。

您可以使用以下方法获取组框文本标签的颜色:

COLORREF cref;
GetThemeColor(hTheme, BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, &cref);

所以,我试图弄清楚如何获取组框中使用的线条的颜色和/或属性,然后(我希望)能够绘制我想要匹配组的线条通过分别绘制我想要的每一块形状的盒子样式。我不确定使用哪些属性来描述线条,或者函数 line DrawRect 是否会使用合适的 Pen 绘制 3D 效果。有没有办法设置 Pen 来绘制这些 3D 效果(2 色平行线)?

谢谢。

【问题讨论】:

  • 组框不关注主题,无论窗口背景颜色如何,它们总是灰色和白色。尝试一下。不适用于主题 api。只需对它们进行硬编码。
  • 在 Windows 经典主题上,它们有方角。在 Windows XP + 7 上,它们是四舍五入的。并且当主题颜色改变时,文本标签颜色会明显改变。我不能硬编码,因为那样它们就不会匹配不同主题或 Windows 版本中的其他组框。

标签: windows winapi groupbox


【解决方案1】:

我总是对分组框感到意外的是,它们实际上是一种按钮样式。 (BS_GROUPBOX)。

主题组框(XP 及更高版本关闭经典模式)使用 VSCLASS_BUTTON 中的主题部分 BP_GROUPBOX。您可以使用通常的主题 API 来获取和绘制。如果您的组框需要文本,您可以使用 DrawThemeText。

也有用于绘制非主题组框的 API(例如 DrawEdge),但我不记得详细信息,您不太可能需要它们。

像往常一样,我要指出,重现控件的行为总是比您想象的要难。

马丁

【讨论】:

  • 谢谢。你指的是 DrawThemeEdge 吗?如何获取此函数的正确参数 uEdge 和 uFlags?
  • 我发现 DrawThemeBackground 使用 iPartId==BP_GROUPBOX==4 和 iStateId==GBS_NORMAL==1 绘制匹配的组框边框。这个函数需要一个 RECT* 和剪裁 RECT*,所以我应该能够拼凑出我想要的形状。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2015-07-25
  • 2019-12-30
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多