如何为Win32应用程序中的所有窗口设置默认字体?

15

我希望我的应用程序中的所有控件(编辑框、列表框等)都具有相同的字体,而不是系统默认字体。我该怎么做?是否存在Win32 API可以设置应用程序默认字体?

6个回答

22

实现这个:

    bool CALLBACK SetFont(HWND child, LPARAM font){
        SendMessage(child, WM_SETFONT, font, true);
        return true;
    }

在单独的文件中或者只是在主cpp文件中,然后运行:

EnumChildWindows(hwnd, (WNDENUMPROC)SetFont, (LPARAM)GetStockObject(DEFAULT_GUI_FONT));

无论何时需要,比如在创建完所有子窗口之后的WM_CREATE消息中!

我在我的Win32 GUI应用程序解决方案中始终有一个SetFont.cppSetFont.h


9
Windows没有提供应用程序范围的字体机制。每个窗口类可以有自己选择默认使用字体的行为。它可以尝试选择Windows shell对话框使用的字体,或者仅使用自动选择到新DC中的可怕位图“系统”字体来绘制其文本。
Windows常规控件窗口类都响应WM_SETFONT,这是告诉窗口要使用什么字体的标准窗口消息。当您实现自己的窗口类(特别是新的子控件窗口类)时,您还应编写WM_SETFONT的处理程序:
  1. 如果你的窗口类有任何子窗口,你的WM_SETFONT处理程序应该将消息转发给每个子窗口。
  2. 如果你的窗口类进行任何自定义绘制,请确保在WM_SETFONT处理程序中保存你收到的HFONT,并将其选择到你用于绘制窗口的DC中。
  3. 如果你的窗口类用作顶级窗口,则需要逻辑来选择自己的字体,因为它将没有父窗口发送WM_SETFONT消息。

请注意,对话框管理器会为你完成其中一些工作;在实例化对话框模板时,新对话框的字体设置为模板中命名的字体,并且对话框会向所有子控件发送WM_SETFONT消息。


所有的Windows控件都会响应这个信息吗?您知道有没有任何例外情况? - Canopus
我期望 Microsoft 提供的所有控件都尊重 WM_SETFONT,因为一个不尊重该消息的控件几乎肯定会在对话框中使用不匹配的字体,这在如此广泛使用的软件中很快就会被发现。如果您正在使用来自其他来源的控件,则取决于其开发人员的技能水平。 - Matthew Xavier

8
可以的!
HFONT defaultFont;
defaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(handlerControl, WM_SETFONT, WPARAM (defaultFont), TRUE); // Send this to each control

3

一种方便的方法,可以通过一次调用来设置所有子窗口的字体:

SendMessageToDescendants( WM_SETFONT, 
                          (WPARAM)m_fntDialogFont.GetSafeHandle(), 
                          0 ); 

1

你无法一次性为所有控件设置字体,必须通过资源编辑器进行设置,或者手动在每个控件上调用SetFont()方法。


-1

您可以通过资源视图为每个对话框设置字体。右键单击对话框(而不是其他控件),选择属性和字体选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接