代码之家  ›  专栏  ›  技术社区  ›  Canopus

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

  •  11
  • Canopus  · 技术社区  · 15 年前

    我希望应用程序中的所有控件(编辑、列表控件等)具有相同的字体,这不是系统默认字体。我该怎么做?有没有设置应用程序默认字体的win32 api?

    6 回复  |  直到 10 年前
        1
  •  8
  •   Matthew Xavier    15 年前

    Windows不提供应用程序范围字体的任何机制。每个窗口类都可以有自己的行为来选择默认使用的字体。它可以尝试选择Windows Shell对话框使用的字体,也可以简单地使用自动选择到新DC中的可怕位图“system”字体绘制文本。

    Windows公共控件窗口类都响应 WM_SETFONT ,这是标准的窗口消息,用于告诉窗口要使用的字体。当您实现自己的窗口类(尤其是新的子控件窗口类)时,还应该为 WMWSET字体 :

    1. 如果window类有任何子窗口,则 WMWSET字体 处理程序应将消息转发给每个处理程序。
    2. 如果您的window类执行任何自定义绘图,请确保将收到的hfont保存在 WMWSET字体 处理程序并将其选择到绘制窗口时使用的DC中。
    3. 如果您的window类被用作顶级窗口,它将需要逻辑来选择自己的字体,因为它没有父窗口来发送一个 WMWSET字体 消息。

    注意,对话框管理器为您做了一些这样的工作;当实例化对话框模板时,新对话框的字体设置为模板中指定的字体,对话框将发送 WMWSET字体 它的所有子控件。

        2
  •  12
  •   Christopher Janzon    11 年前

    实现这一点:

        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 消息,在您创建了所有子窗口之后!

    我总是有一个 SetFont.cpp 和A SetFont.h 在我的win32 gui应用程序解决方案中。

        3
  •  6
  •   Péa    13 年前

    是的,你可以!

    HFONT defaultFont;
    defaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(handlerControl, WM_SETFONT, WPARAM (defaultFont), TRUE); // Send this to each control
    
        4
  •  4
  •   Alan    15 年前

    在一次调用中为所有子窗口设置字体的简便方法:

    SendMessageToDescendants( WM_SETFONT, 
                              (WPARAM)m_fntDialogFont.GetSafeHandle(), 
                              0 ); 
    
        5
  •  1
  •   Roel    15 年前

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

        6
  •  -1
  •   Nick Dandoulakis    15 年前

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