【问题标题】:How to set default font for all the windows in a Win32 Application?如何为 Win32 应用程序中的所有窗口设置默认字体?
【发布时间】:2010-10-30 14:35:09
【问题描述】:

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

【问题讨论】:

    标签: windows winapi mfc fonts


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        请注意,对话管理器会为您完成其中的一些工作;实例化对话框模板时,新对话框的字体设置为模板中指定的字体,对话框发送WM_SETFONT其所有子控件。

        【讨论】:

        • 是否所有 Windows 控件都会对此消息作出反应?你知道有什么例外吗?
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          是的,你可以!

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

          【讨论】:

            【解决方案6】:

            实现这个:

                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

            【讨论】:

            • 漂亮!简洁明了的说明。
            猜你喜欢
            • 1970-01-01
            • 2011-03-09
            • 2011-02-05
            • 1970-01-01
            • 1970-01-01
            • 2010-09-22
            • 1970-01-01
            • 2012-02-01
            相关资源
            最近更新 更多