Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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

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

此代码基于MSDN示例。我的问题是,它在按钮上使用粗体字体,如下所示:

当我想使用这样的标准字体时:

我已经在文件顶部有了预处理器指令来启用视觉样式

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