win32-在按钮中使用默认按钮字体 我在C++中创建了一个小型WiNAPI应用程序。我正在尝试使用以下代码在表单上创建按钮: HWND hwndButton = CreateWindow( TEXT("BUTTON"), TEXT("Click Here"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, // Styles 10, 10, 100, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
此代码基于MSDN示例。我的问题是,它在按钮上使用粗体字体,如下所示: 当我想使用这样的标准字体时: 我已经在文件顶部有了预处理器指令来启用视觉样式win32-在按钮中使用默认按钮字体 我在C++中创建了一个小型WiNAPI应用程序。我正在尝试使用以下代码在表单上创建按钮: HWND hwndButton = CreateWindow( TEXT("BUTTON"), TEXT("Click Here"), WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, // Styles 10, 10, 100, 30, hwnd, NULL, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);,c++,winapi,fonts,C++,Winapi,Fonts,此代码基于MSDN示例。我的问题是,它在按钮上使用粗体字体,如下所示: 当我想使用这样的标准字体时: 我已经在文件顶部有了预处理器指令来启用视觉样式 #pragma comment(linker,"\"/manifestdependency:type='win32' \ name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \ processorArchitecture='*' publicKeyToken='6595b6414
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
我应该采取什么步骤来使用标准的系统范围字体
谢谢控件没有默认的系统范围字体,最初您会得到一个使用“系统”字体创建的控件,这是您在第一张图片上看到的。当按钮作为对话框的一部分创建时,它使用对话框模板中的字体,因此在按钮上使用类似“MS Shell Dlg”的适当大小+WM_SETFONT应该会得到与图2相同的结果。请注意,系统上没有物理MS Shell Dlg字体,它根据注册表设置映射到特定字体
通用控件清单与此无关,comctl32版本6的行为没有改变。默认GUI字体存储在
default\u GUI\u font
中,可以通过
GetStockObject(DEFAULT_GUI_FONT);
要设置按钮的字体,可以使用:
HWND yourButton; // use CreateWindow or anything else to get this
SendMessage(yourButton, WM_SETFONT, (LPARAM)GetStockObject(DEFAULT_GUI_FONT), true);
在不手动调用每个子窗口上的
sendmages
的情况下执行此操作的一种方便方法是将EnumChildWindows
函数与以下回调函数一起使用:
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
HFONT hfDefault = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
SendMessage(hWnd, WM_SETFONT, (WPARAM) hfDefault, MAKELPARAM(TRUE, 0));
return TRUE;
}
然后,在(w)WinMain
函数中,在ShowWindow
调用之后添加此行:
EnumChildWindows(hWnd, EnumChildProc, 0);
这不是检索GUI字体的推荐方法(它不考虑主题,可以为按钮、菜单等选择不同的字体)。相反,您应该使用(请参阅GetStockObject
的备注部分)
不建议您使用此方法获取对话框和窗口使用的当前字体。相反,使用SystemParametersInfo函数和SPI_GETNONCLIENTMETRICS参数来检索当前字体。SystemParametersInfo将考虑当前主题,并为标题、菜单和消息对话框提供字体信息
您必须自己设置字体,请参见链接OK。谢谢出于好奇,为什么默认情况下不使用系统范围的字体?我不知道为什么会使用丑陋的字体作为默认字体,而不是每个人都想要的字体。也许是为了向后兼容。顺便说一下,上面的对话框使用了不同的字体。如果目标平台是Vista及以上版本,则您可以转到对话框编辑器并使用大小为9 pt的“Segoe UI”,或在
WM_INITDIALOG
systemparameters中管理字体。建议在GetStockObject
中使用fo
。您是英雄。
NONCLIENTMETRICS metrics = {};
metrics.cbSize = sizeof(metrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, metrics.cbSize, &metrics, 0);
HFONT guiFont = CreateFontIndirect(&metrics.lfCaptionFont);
// When you're done with the font, don't forget to call
DeleteObject(guiFont);