我正在用 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);
Run Code Online (Sandbox Code Playgroud)
此代码基于 MSDN 示例。我的问题是它在按钮上使用粗体字体,如下所示:
当我想使用这样的标准字体时:
我的文件顶部已经有预处理器指令来启用视觉样式。
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
Run Code Online (Sandbox Code Playgroud)
我应该采取哪些步骤来使用标准系统宽字体?
谢谢
GetStockObject不是检索 GUI 字体的推荐方法(它不考虑主题,并且可以为按钮、菜单等选择不同的字体)。相反,您应该使用SystemParametersInfo(请参阅的备注部分GetStockObject)。
不建议您使用此方法来获取对话框和窗口当前使用的字体。相反,使用带有 SPI_GETNONCLIENTMETRICS 参数的 SystemParametersInfo 函数来检索当前字体。SystemParametersInfo 将考虑当前主题并提供标题、菜单和消息对话框的字体信息。
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);
Run Code Online (Sandbox Code Playgroud)