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

时间:2008-10-21 10:36:07

标签: windows winapi fonts

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

3 个答案:

答案 0 :(得分:14)

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

  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,请执行< em> not 删除您在WM_SETFONT处理程序中收到的字体对象,因为发送邮件的代码希望保留该句柄的所有权。

答案 1 :(得分:9)

生动说,只需使用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);

答案 2 :(得分:6)

如果您对已经拥有自己的字体句柄的标准公共控件进行超类,请使用以下方法:使用CreateFontCreateFontIndirect创建字体并使用WM_SETFONT消息进行设置(在MFC和ATL中会有相应的SetFont函数。当不再需要该字体时,使用DeleteObject销毁字体。请务必不要破坏窗口以前设置的字体。

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