16

我正在使用纯 Win32 API(RegisterClass 和 CreateWindow 函数)创建窗口。如何为窗口指定字体而不是系统定义的字体?

4

3 回答 3

16

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

  1. 创建窗口时(即处理WM_CREATE时),使用CreateFont()CreateFontIndirect()获取要在窗口中使用的字体的 HFONT。您需要将此 HFONT 与您为窗口类的每个实例保留的其他数据一起存储。您可以选择让您的窗口类也处理WM_GETFONTWM_SETFONT,但顶级窗口通常不需要它(如果您正在创建控制窗口类,您将需要处理 WM_SETFONT,因为对话框管理器会发送该消息)。
  2. 如果您的窗口有任何包含文本的子窗口,只要您的窗口字体发生变化,就向每个子窗口发送一条 WM_SETFONT 消息。所有常见的 Windows 控件都处理 WM_SETFONT。
  3. 当您绘制窗口的内容时(通常是响应WM_PAINT消息),在绘制文本之前使用SelectObject()函数将您的 HFONT 选择到设备上下文中(或使用诸如或GetTextMetrics()之类的文本函数)。
  4. 当窗口被销毁时(即当您处理WM_DESTROY时),使用DeleteObject()释放您在步骤 1 中创建的字体。请注意,如果您选择在窗口中处理 WM_SETFONT,请不要删除您在 WM_SETFONT 中收到的字体对象处理程序,因为发送消息的代码期望保留该句柄的所有权。
于 2008-10-22T13:32:54.467 回答
13

正如vivios所说,只需使用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);
于 2008-10-22T04:06:26.467 回答
7

如果您超类化一个已经有自己的字体句柄的标准公共控件,请使用这种方法:只需使用CreateFontor创建字体CreateFontIndirect并使用 message 设置它WM_SETFONT(在 MFC 和 ATL 中会有相应的SetFont函数)。当不再需要字体时,使用DeleteObject. 确保不要破坏窗口先前设置的字体。

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

于 2008-10-21T10:40:29.310 回答