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

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

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

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

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

请注意,对话管理器为你做了一些这样的事情; 当实例化对话框模板时,新对话框的字体被设置为在模板中命名的字体,并且对话框发送WM_SETFONT所有子控件。

实现这个:

  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

是的你可以 !

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

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

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

你不能,在同一时间没有办法为所有的控制。 您需要通过资源编辑器来设置它,或者在每个控件上手动调用SetFont()。

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