win32 - 使用按钮中的默认按钮字体

时间:2016-02-15 17:38:21

标签: c++ winapi fonts

我在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示例。我的问题是它在按钮上使用粗体字符,如下所示:

enter image description here

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

enter image description here

我已在文件顶部安装了预处理程序指令以启用视觉样式。

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

我应该采取哪些步骤来使用标准的系统范围字体?

由于

4 个答案:

答案 0 :(得分:2)

默认的GUI字体存储在DEFAULT_GUI_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);

答案 1 :(得分:1)

控件没有默认的系统范围字体,最初你得到一个用“System”字体创建的控件,这就是你在第一张图片上看到的。当按钮作为对话框的一部分创建时,它使用对话框模板中的字体,因此在按钮上使用具有适当大小+ WM_SETFONT的“MS Shell Dlg”应该会给出与图2中相同的结果。请注意,没有系统上的物理MS Shell Dlg字体,它根据注册表设置映射到特定字体。

公共控件清单与此无关,使用comctl32版本6没有改变行为。

答案 2 :(得分:0)

在没有手动调用每个子窗口@GET @Path("/getdetails") @Produces({ "application/json", "application/xml" }) public Response getDetails(@QueryParam("field1") String fieldOne,@QueryParam("field2") List<HasMap<String,String>> fieldTwo){ //Processing } 的情况下执行此操作的便捷方法是使用具有以下回调函数的SendMessage函数:

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

答案 3 :(得分:0)

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