我如何为通过CreateWindow创build的窗口指定字体?

我使用纯Win32 API(RegisterClass和CreateWindow函数)创build窗口。 我怎样才能指定一个窗口的字体而不是系统定义的字体?

Solutions Collecting From Web of "我如何为通过CreateWindow创build的窗口指定字体?"

当你创建自己的窗口类时,你自己负责管理字体。 这个任务将有四个部分:

  1. 当窗口被创建时(即当你处理WM_CREATE时 ),使用CreateFont()或CreateFontIndirect()来获取你想要在窗口中使用的字体的HFONT。 您将需要存储此HFONT以及您为窗口类的每个实例保留的其他数据。 你可以选择让你的窗口类也处理WM_GETFONT和WM_SETFONT ,但是它对于顶层窗口通常是不需要的(如果你正在创建一个控件窗口类,你将需要处理WM_SETFONT,因为对话管理器发送这个消息)。
  2. 如果你的窗口有任何包含文本的子窗口,每当你的窗口字体改变时,发送每一个WM_SETFONT消息。 所有常见的Windows控件都处理WM_SETFONT。
  3. 在绘制窗口内容(通常是响应WM_PAINT消息)时,在绘制文本(或使用文本函数(如GetTextMetrics() ) )之前,使用SelectObject()函数将HFONT选择到设备上下文中。
  4. 当窗口被销毁时(例如当你处理WM_DESTROY时 ),使用DeleteObject()释放你在步骤1中创建的字体。注意,如果你选择在窗口中处理WM_SETFONT,不要删除你在WM_SETFONT中接收的字体对象处理程序,因为发送消息的代码希望保留该句柄的所有权。

vividos表示只是使用CreateFont()/ CreateFontIndirect :

HFONT hFont = CreateFont (13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma")); 

然后使用WM_SETFONT消息为您的窗口/控件设置此字体:

 SendMessage(window, WM_SETFONT, hFont, TRUE); 

如果你超级已经有自己的字体句柄的标准通用控件,使用这种方法:只需使用CreateFontCreateFontIndirect创建一个字体,并使用WM_SETFONT消息(在MFC和ATL将有一个相应的SetFont函数)设置它。 当不再需要字体时,使用DeleteObject销毁字体。 一定不要破坏窗口以前设置的字体。

如果你正在编写自己绘制的自定义控件,只需使用CreateFontCreateFontIndirect创建一个新的字体对象,并将其存储在你的类中。 如果您想支持第三方用户,请处理WM_SETFONTWM_GETFONT以让用户设置另一种字体。 绘画时,使用当前存储在类中的字体对象。