【问题标题】:How can I specify a font for a window created through CreateWindow?如何为通过 CreateWindow 创建的窗口指定字体?
【发布时间】:2010-09-18 07:06:44
【问题描述】:

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

【问题讨论】:

标签: windows winapi fonts


【解决方案1】:

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

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

【讨论】:

  • 窗口默认字体不能为 ::DeleteObject-ed。但是,如果子窗口获取其父窗口设置的字体并且该字体在窗口之间共享,那么清理它当然是父窗口的责任。
  • WM_SETFONT 仅由标准/通用控件处理。如果 Andrei 正在创建一个全新的类(他确实提到了 RegisterClass),他必须遵循 Matthew Xavier 的指导方针。
  • 谢谢,我相应地更新了答案。谢谢 Matthew Xavier,你的回答也是对的。
【解决方案2】:

正如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);

【讨论】:

  • SendMessage(window, WM_SETFONT, (LPARAM)hFont, TRUE);准确地说。
【解决方案3】:

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

  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 处理程序中收到的字体对象,因为发送消息的代码希望保留该句柄的所有权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2021-08-24
    • 2018-06-15
    相关资源
    最近更新 更多