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

时间:2009-06-02 06:48:16

标签: windows winapi mfc fonts

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

6 个答案:

答案 0 :(得分:13)

实施这个:

    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.cppSetFont.h

答案 1 :(得分:8)

Windows不为应用程序范围的字体提供任何机制。每个窗口类可能有自己的行为,用于选择默认使用的字体。它可能会尝试选择Windows shell对话框使用的字体,或者它可能只是使用自动选择到新DC中的可怕位图“system”字体来绘制文本。

Windows公共控制窗口类都响应WM_SETFONT,这是用于告诉窗口您希望它使用哪种字体的标准窗口消息。当您实现自己的窗口类(尤其是新的子控件窗口类)时,您还应该为WM_SETFONT编写处理程序:

  1. 如果你的窗口类有任何子窗口,你的WM_SETFONT处理程序应该将消息转发给每个窗口。
  2. 如果您的窗口类执行任何自定义绘图,请确保将您收到的HFONT保存在WM_SETFONT处理程序中,并将其选择到绘制窗口时使用的DC中。
  3. 如果您的窗口类用作顶级窗口,则需要逻辑来选择自己的字体,因为它没有父窗口向其发送WM_SETFONT消息。
  4. 请注意,对话管理器会为您执行此操作;在实例化对话框模板时,新对话框的字体将设置为模板中指定的字体,对话框将发送WM_SETFONT所有子控件。

答案 2 :(得分:6)

是的,你可以!

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

答案 3 :(得分:4)

在一次通话中为所有子窗口设置字体的便捷方法:

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

答案 4 :(得分:1)

您不能,同时无法对所有控件执行此操作。您需要通过资源编辑器设置它,如前所述,或者在每个控件上手动调用SetFont()。

答案 5 :(得分:-1)

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