1

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

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

使用 Microsoft Spy++,我能够看到其他 groub-boxes 的 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/

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

[编辑-1]

关于乔纳森波特和超人,正如你所建议的,我将新组框的字体句柄设置为与其他控件相同。

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);

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

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

[编辑-2]

我不敢相信……它现在有效!非常感谢大家的帮助!

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

祝大家周末愉快。

4

2 回答 2

3

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

SendMessage(hGroup2, WM_SETFONT, (WPARAM)SendMessage(hGroup1, WM_GETFONT, 0, 0), TRUE);
于 2012-06-16T06:28:32.910 回答
1

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

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

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

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

HFONT font = (HFONT)::SendMessage(m_hWnd, WM_GETFONT, 0, 0);
::SendMessage(hGroup2, WM_SETFONT, (WPARAM)font, TRUE);
于 2012-06-16T07:47:05.650 回答