如何使用 Win32 设置组框标题的字体和颜色

Posted

技术标签:

【中文标题】如何使用 Win32 设置组框标题的字体和颜色【英文标题】:How do I set the font and color for a group box caption using Win32 【发布时间】:2009-11-15 09:42:41 【问题描述】:

我被 WIN32 困住了(没有 .NET 或任何托管的东西)

【问题讨论】:

真棒真的有用万岁迂腐 【参考方案1】:

WM_CTLCOLORSTATIC 是控制组框标题颜色的正确方法。

但是,它不再起作用:如果您的应用程序使用清单来包含版本 6 comctl 库,则 Groupbox 控件不再将 WM_CTLCOLORSTATIC 发送给其父级以获取画笔。如果您的对话框控件看起来很丑,呈方形和灰色 - 就像 windows 95 控件一样,那么您没有启用 xp 样式,您可以控制组框的颜色。但这是一个可怕的牺牲! :P

接下来,大多数标准控件向其父级(对话框)发送WM_CTLCOLORxxx 消息以控制其绘制。识别控件的唯一方法是查找它们的控件 ID - 这就是为什么为控件分配一个标识符以指示该控件需要特定的颜色或字体是一个好主意。即不要将IDC_STATIC 用于需要红色文本的控件。将它们设置为 IDC_DRAWRED 或一些虚构的 id。

不要使用GetDlgItem(hwndDlg,IDC_ID) == hwndCtl 来测试WM_CTLCOLOR 消息是否用于正确的控件:GetDlgItem 将简单地返回对话框上具有特定 ID 的第一个控件的句柄,这意味着只会绘制一个控件。

case WM_CTLCOLORSTATIC:
  if(GetWindowLong( (HWND)lParam, GWL_ID) == IDC_RED)
    return MakeControlRed( (HDC)wParam );

你总是*需要从 WM_CTLCOLORxxx 消息中返回一个 HBRUSH - 即使你真的只是想“篡改”传入的 HDC。如果你没有从你的对话过程中返回一个有效的画笔,那么对话窗口程序会认为您根本没有处理该消息并将其传递给 DefWindowProc - 这将重置您对 HDC 所做的任何更改。 系统没有创建画笔,而是有一个备用画笔缓存来绘制标准的 ui 元素:GetSysColorBrush

当然,您并不总是需要返回 HBRUSH。如果您在应用程序中启用了 xp 主题样式,则有时允许您返回 null :- 因为 xp 主题对话框具有不同颜色的背景(尤其是在选项卡控件上),返回 syscolor 画笔会导致在较浅的背景上出现丑陋的灰色框: - 在这些特定情况下,对话框管理器将允许您返回 null 而不会重置您在 DC 中的更改。

【讨论】:

您的问题是 - 他们似乎没有添加新的 CTLCOLOR 消息。这意味着您的选择是: - 所有者绘制组框 - 皮塔饼。或者使用一个无文本的组框,上面有一个常规的静态文本。或者使用 Spy++ 观察窗口,看看它是否正在发送一条新的尚未记录的消息。 所以当您可以通过在 .NET 中设置前景色来做到这一点时,您的猜测是在幕后这会导致所有者绘制的组框? Spy++ 是最好的检查方法。【参考方案2】:

我认为WM_CTLCOLORSTATIC notification 可能是您所追求的。

【讨论】:

【参考方案3】:

您使用设置控制字体的常规方式设置字体。使用您使用 CreateFont 创建的 HFONT 在您的窗口初始化中发送 WM_SETFONT 消息。例如

SendDlgItemMessage(hDlg, IDC_STATIC, WM_SETFONT, (WPARAM)hFont, TRUE);

然后正如所指出的,您需要使用 WM_CTLCOLORSTATIC 通知来设置实际颜色。

案例 WM_CTLCOLORSTATIC: if(GetDlgItem(hDlg, IDC_STATIC) == (HWND)lParam) HDC hDC = (HDC)wParam; SetBkColor(hDC, GetSysColor(COLOR_BTNFACE)); SetTextColor(hDC, RGB(0, 0xFF, 0)); SetBkMode(hDC, 透明); 返回 (INT_PTR)CreateSolidBrush(GetSysColor(COLOR_BTNFACE)); 休息;

虽然你真的应该只创建一次实体画笔并在对话框消失时将其删除,因为你最终会出现泄漏。

【讨论】:

这不适用于组框。但是它适用于标签(静态控件)文档说,当控件即将被绘制时,静态控件或只读或禁用的编辑控件会向其父窗口发送 WM_CTLCOLORSTATIC 消息。所以不确定组框是否符合条件。有趣的是,如果我设置了一个断点,它确实会关闭,所以我猜出于某种原因正在为所述控件(组框)发送消息,尽管颜色没有改变 真的不行吗?适用于我正在运行的小测试应用程序。这可能有点奇怪,例如,如果画笔不正确,它不会做任何事情。 好吧,我的机器是 Windows 7,所以我对此表示怀疑。我认为正在发生的是静态字段有一些奇怪的 ID 设置,几乎所有东西都设置为 -1,你最终可以为完全不相关的东西设置颜色。尝试右键单击资源编辑器中的对话框条目并选择资源符号。使用建议的 ID 在列表中添加一个新的不同条目(例如 IDC_MYGROUPBOX),转到对话框编辑器并将属性中的 ID 更改为该新 IDm,然后在代码中使用它来执行颜色并查看它是否生成区别。

以上是关于如何使用 Win32 设置组框标题的字体和颜色的主要内容,如果未能解决你的问题,请参考以下文章

制作组框按钮win32 C++

如何设置win32 api c++按钮背景颜色和文本颜色?

Win10如何更改CMD命令窗口颜色及字体大小

如何改变Linux Shell中的字体和背景颜色

如何改变Linux Shell中的字体和背景颜色

如何在可可的 nstextfield 上设置字体和颜色?