WinAPI的Groupbox字体问题

时间:2012-06-16 05:18:12

标签: c++ winapi user-interface windows-7

我在通过CreateWindowEx创建一个简单的Group-Box-Control时遇到问题。其标题的font-size / -style看起来不正确。

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

使用Microsoft Spy ++,我能够看到其他组合框的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);

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

还有什么我可以做的吗?

[EDIT-2]

我无法相信......它现在有效!非常感谢你的帮助!

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

祝大家周末愉快。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

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

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

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