我在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示例。我的问题是它在按钮上使用粗体字符,如下所示:
当我想使用这样的标准字体时:
我已在文件顶部安装了预处理程序指令以启用视觉样式。
#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
我应该采取哪些步骤来使用标准的系统范围字体?
由于
答案 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);