WinAPI 的 Groupbox 字体问题

Posted

技术标签:

【中文标题】WinAPI 的 Groupbox 字体问题【英文标题】:Groupbox Font Issue with WinAPI 【发布时间】:2012-06-16 05:18:11 【问题描述】:

我在通过 CreateWindowEx 创建简单的 Group-Box-Control 时遇到问题。其标题的字体大小/样式看起来不正确。

我使用 Visual Studio - 资源管理器创建了一个简单的 Windows 对话框(包含组框、按钮……)。当我使用 DialogBox(...) 加载该对话框时,一切看起来都很正常,但是当我通过 CreateWindowEx(...) 在同一个对话框上创建另一个组框控件时,新控件的标题具有不同的字体大小/样式。

使用 Microsoft Spy++,我能够看到其他 groub-box 的 dwExStyle 和 dwStyle 值,但即使我在 CreateWindowEx 中使用相同的值,我仍然会得到不同的外观。

这是我用来创建新组框的代码:

HWND hGroup1 = GetDlgItem(_hWnd, IDC_GROUPBOX1);
HWND hGroup2 = CreateWindowEx(            
    WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOPARENTNOTIFY,
    L"Button",
    L"Hallo",
    WS_CHILDWINDOW | WS_VISIBLE | BS_GROUPBOX,
    20, 20, 250, 250,
    hGroup1,
    nullptr,
    _hInstance,
    nullptr);

这是对话框的屏幕截图:

http://imageshack.us/photo/my-images/856/groupboxfontissue.png/

请告诉我哪里出了问题以及我可以做些什么来解决它。

[EDIT-1]

关于 Jonathan Potter 和 Superman,正如您所建议的,我将新组框的字体句柄设置为与其他控件相同。

HFONT hFont1 = (HFONT)SendMessage(hGroup1, WM_GETFONT, 0, 0); 
HFONT hFont2 = (HFONT)SendMessage(hGroup2, WM_GETFONT, 0, 0);
HFONT hFont3 = (HFONT)SendMessage(_hWnd, WM_GETFONT, 0, 0);
SendMessage(hGroup2, WM_SETFONT, (WPARAM)hFont1, TRUE);

hFont2 = (HFONT)SendMessage(hGroup2, WM_GETFONT, 0, 0);

在这段代码的最后,我可以看到所有控件和对话框窗口都具有相同的字体句柄,但只有使用资源管理器创建的控件具有正确的字体(即系统字体)。

还有什么我可以做的吗???

[EDIT-2]

我不敢相信……它现在起作用了!非常感谢大家的帮助!

我只需将 CreateWindowEx(...) 中的 hWndParent 值设置为对话框句柄,然后使用 WM_GETFONT 和 WM_SETFONT 复制正确的字体。

祝大家周末愉快。

【问题讨论】:

您很可能需要IDC_GROUPBOX2 或其他东西来代替您的第一个nullptr,因为它还是个孩子。 【参考方案1】:

您手动创建的控件(通过 CreateWindowEx)不会自动设置其字体,而是默认为“系统字体”(即您在屏幕截图中看到的)。相反,您需要在创建控件后设置控件的字体。例如,

SendMessage(hGroup2, WM_SETFONT, (WPARAM)SendMessage(hGroup1, WM_GETFONT, 0, 0), TRUE);

【讨论】:

我试过了,但没有帮助。我还比较了 Text-Metrics 和 Text-Faces,但我找不到任何差异。还有什么我可以做的吗?【参考方案2】:

当您使用资源编辑器将控件放置在对话框中时,默认情况下将使用设置为对话框的字体,即控件的父级。

如果动态创建控件,系统字体将被使用,而不是对话框的字体。

要为您动态创建的控件获取相同的对话框字体,请将对话框的字体设置为 WM_INITDIALOG 处理程序中的控件。

在下面的代码sn-p中,将m_hWnd替换为父对话框的句柄。

HFONT font = (HFONT)::SendMessage(m_hWnd, WM_GETFONT, 0, 0);
::SendMessage(hGroup2, WM_SETFONT, (WPARAM)font, TRUE);

【讨论】:

以上是关于WinAPI 的 Groupbox 字体问题的主要内容,如果未能解决你的问题,请参考以下文章

winapi - 如何使用所有控件禁用组框框架

如何在 WinAPI 中将 TrueType 字体绘制到像素数组中?

扩展GroupBox控件

c# 如何改变datagridview里的字体颜色

如何预先测量静态尺寸? WINAPI

移动窗口时 C++/WinApi 内存使用率上升