【发布时间】:2010-10-30 14:35:09
【问题描述】:
我希望我的应用程序中的所有控件(编辑、列表控件等)都具有相同的字体,这不是系统默认的字体。我该怎么做呢?是否有任何设置应用程序默认字体的 Win32 API?
【问题讨论】:
我希望我的应用程序中的所有控件(编辑、列表控件等)都具有相同的字体,这不是系统默认的字体。我该怎么做呢?是否有任何设置应用程序默认字体的 Win32 API?
【问题讨论】:
您可以通过资源视图为每个对话框设置字体。右键单击一个对话框(不是其他控件),选择属性和字体选项。
【讨论】:
您不能,无法同时对所有控件执行此操作。您需要按照之前的建议通过资源编辑器进行设置,或者在每个控件上手动调用 SetFont()。
【讨论】:
Windows 不为应用程序范围的字体提供任何机制。每个窗口类可能有自己的行为来选择默认使用的字体。它可能会尝试选择 Windows shell 对话框使用的字体,或者它可能只是使用自动选择到新 DC 中的可怕的位图“系统”字体来绘制其文本。
Windows 通用控制窗口类都响应WM_SETFONT,这是标准的窗口消息,用于告诉窗口您希望它使用什么字体。在实现自己的窗口类(尤其是新的子控件窗口类)时,还应该为WM_SETFONT编写一个处理程序:
WM_SETFONT 处理程序应将消息转发给每个子窗口。WM_SETFONT 处理程序中,并将其选择到您在绘制窗口时使用的 DC。WM_SETFONT 消息。请注意,对话管理器会为您完成其中的一些工作;实例化对话框模板时,新对话框的字体设置为模板中指定的字体,对话框发送WM_SETFONT其所有子控件。
【讨论】:
一种在一次调用中为所有子窗口设置字体的便捷方法:
SendMessageToDescendants( WM_SETFONT,
(WPARAM)m_fntDialogFont.GetSafeHandle(),
0 );
【讨论】:
是的,你可以!
HFONT defaultFont;
defaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(handlerControl, WM_SETFONT, WPARAM (defaultFont), TRUE); // Send this to each control
【讨论】:
实现这个:
bool CALLBACK SetFont(HWND child, LPARAM font){
SendMessage(child, WM_SETFONT, font, true);
return true;
}
在单独的文件中或仅在 main.cpp 中,然后运行:
EnumChildWindows(hwnd, (WNDENUMPROC)SetFont, (LPARAM)GetStockObject(DEFAULT_GUI_FONT));
在您创建所有子窗口之后,无论何时,例如在WM_CREATE 消息中!
我的 win32 GUI 应用程序解决方案中总是有一个SetFont.cpp 和一个SetFont.h。
【讨论】: