我正在使用纯 Win32 API(RegisterClass 和 CreateWindow 函数)创建窗口。如何为窗口指定字体而不是系统定义的字体?
Andrei
问问题
20784 次
3 回答
16
当您创建自己的窗口类时,您自己负责管理字体。该任务将分为四个部分:
- 创建窗口时(即处理WM_CREATE时),使用CreateFont()或CreateFontIndirect()获取要在窗口中使用的字体的 HFONT。您需要将此 HFONT 与您为窗口类的每个实例保留的其他数据一起存储。您可以选择让您的窗口类也处理WM_GETFONT和WM_SETFONT,但顶级窗口通常不需要它(如果您正在创建控制窗口类,您将需要处理 WM_SETFONT,因为对话框管理器会发送该消息)。
- 如果您的窗口有任何包含文本的子窗口,只要您的窗口字体发生变化,就向每个子窗口发送一条 WM_SETFONT 消息。所有常见的 Windows 控件都处理 WM_SETFONT。
- 当您绘制窗口的内容时(通常是响应WM_PAINT消息),在绘制文本之前使用SelectObject()函数将您的 HFONT 选择到设备上下文中(或使用诸如或GetTextMetrics()之类的文本函数)。
- 当窗口被销毁时(即当您处理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
如果您超类化一个已经有自己的字体句柄的标准公共控件,请使用这种方法:只需使用CreateFont
or创建字体CreateFontIndirect
并使用 message 设置它WM_SETFONT
(在 MFC 和 ATL 中会有相应的SetFont
函数)。当不再需要字体时,使用DeleteObject
. 确保不要破坏窗口先前设置的字体。
如果您正在编写一个可以自行绘制的自定义控件,只需使用CreateFont
or创建一个新的字体对象CreateFontIndirect
并将其存储在您的类中的某个位置。如果要支持第三方用户,请处理WM_SETFONT
并WM_GETFONT
让用户设置另一种字体。绘画时,使用存储在类中的当前字体对象。
于 2008-10-21T10:40:29.310 回答