字体 对话框允许用户为逻辑字体选择属性,例如字体系列和相关字体样式、点大小、效果(下划线、删除线和文本颜色),以及脚本(或字符集)。
通过初始化 CHOOSEFONT 结构并将结构传递给 ChooseFont 函数,可以创建并显示 字体 对话框。
以下屏幕截图显示了典型的“字体 ”对话框。
显示字体对话框屏幕截图
如果用户单击“确定”按钮 “确定”按钮,ChooseFont 函数将返回 TRUE true,并设置有关 CHOOSEFONT 结构中用户选择的信息。
如果用户取消 字体 对话框或发生错误,ChooseFont 返回 FALSE,并且未定义 logFONT结构的内容。 可以使用 CommDlgExtendedError 函数来检索扩展的错误值来确定错误的原因。
本节将讨论以下主题。
- 字体对话框初始化标志
- 自定义早期版本的 Windows 的字体对话框
- 自定义 Windows 7 上的字体对话框
“字体”对话框初始化标志
在调用 ChooseFont之前,CHOOSEFONT 结构的 标志 成员必须指定 CF_SCREENFONTS、CF_PRINTERFONTS或 CF_BOTH,以指示对话框是否应列出屏幕字体、打印机字体或两者。 如果指定 CF_PRINTERFONTS 或 CF_BOTH,则 CHOOSEFONT 结构的 hDC 成员必须指定打印机设备上下文的句柄。
如果设置了 CF_PRINTERFONTS 或 CF_BOTH 标志,则字体类型说明标签将显示在 字体 对话框底部。
从 Windows 7 开始,ChooseFont 函数不再使用 CF_PRINTERFONTS、CF_SCREENFONTS、CF_BOTH和 CF_WYSIWYG 标志进行字体枚举。 它们在 Windows 7 中已过时。 但是,CF_PRINTERFONTS 标志保留一个函数:在 字体 对话框底部显示字体类型说明标签。
可以使用 标志 成员启用或禁用某些 字体 对话框控件,并且可以将 标志 成员与其他 CHOOSEFONT 成员结合使用来控制某些控件的初始值。
显示允许用户选择罢工、下划线和颜色选项的控件:
- 设置 CF_EFFECTS 标志。 可以使用 CHOOSEFONT 结构的 rgbColors 成员来指定初始字体颜色。
若要指定字体、字体样式、大小、删除线和下划线对话框控件的初始值:
- 若要指定“字体”、“字体样式”、“大小”、“删除线”和“下划线”对话框控件的初始值,
- 在 标志 成员中设置 CF_INITTOLOGFONTSTRUCT 标志,以及由 lpLogFont指向的 LOGFONT 结构的成员,以指定字体属性的初始值。
- 还可以使用 CF_NOFACESEL、CF_NOSTYLESEL和 CF_NOSIZESEL 标志来阻止 字体 对话框显示相应控件的初始值。 当你使用包含多个字样、样式或点大小的文本选择时,这非常有用。 如果用户未选择相应的值,则当 ChooseFont 返回时,这些值也会在 标志 中设置。
若要将字体样式控件初始化为指定的样式名称
- 设置 CF_USESTYLE 标志,并使用 lpszStyle 成员指定样式名称。
注意
若要全球化应用程序,请使用 lfWeight 和 lfItalicLOGFONT 结构的成员指定样式,lpLogFont所指向。 样式名称可能会根据系统用户界面语言而更改。
显示“应用”按钮
- 设置 CF_APPLY 标志,并提供挂钩过程来处理 “应用”按钮 WM_COMMAND 消息。 挂钩过程可以将 WM_CHOOSEFONT_GETLOGFONT 消息发送到对话框,以检索包含字体当前选择的 LOGFONT 结构的地址。
显示“帮助”按钮
- 设置 CF_SHOWHELP 标志。 当用户单击“帮助”按钮时,hwndOwner 成员必须标识窗口,才能接收 HELPMSGSTRING 注册的消息。
限制对话框中显示的字体
- 设置 CF_TTONLY、CF_FIXEDPITCHONLY、CF_NOVECTORFONTS、CF_NOVERTFONTS、CF_SCALABLEONLY和 CF_WYSIWYG 标志的任意组合。 还可以使用 CF_NOSIMULATIONS 值限制对话框为某些字体显示的可用样式。
从 Windows 7 开始,对话框中显示的字体列表会根据用户的显示字体进行限制。 若要删除限制,请设置 CF_INACTIVEFONTS 标志。
限制用户可以指定 的字样名称、样式和点大小
- 设置 CF_FORCEFONTEXIST 标志以限制用户仅指定对话框中列出的有效字样名称、样式和点大小。
- 设置 CF_LIMITSIZE 标志以限制用户指定 nSizeMin 指定的范围中的点大小,并 nSizeMax 成员。
限制或禁用脚本组合框
- 设置 CF_NOSCRIPTSEL 标志以禁用 脚本 组合框,或设置 CF_SELECTSCRIPT 标志以将 脚本 组合框中的选择限制为指定的字符集。
自定义早期版本的 Windows 上的“字体”对话框
例如,如果要包含应用程序唯一的其他控件,则可以为“字体”对话框提供自定义模板。 ChooseFont 函数使用自定义模板代替默认模板。
为“字体”对话框提供自定义模板
- 通过修改 Font.dlg 文件中指定的默认模板来创建自定义模板。 默认字体对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
- 使用 CHOOSEFONT 结构启用模板,如下所示:
- 如果自定义模板是应用程序或动态链接库中的资源,请在 标志 成员中设置 CF_ENABLETEMPLATE 标志。 使用 hInstance 和 lpTemplateName 结构成员来标识模块和资源名称。
- 如果自定义模板已在内存中,请设置 CF_ENABLETEMPLATEHANDLE 标志。 使用 hInstance 成员标识包含模板的内存对象。
可以为 字体 对话框提供 CFHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息,并将消息发送到对话框。 如果使用自定义模板定义其他控件,则必须提供挂钩过程来处理控件的输入。
为“字体”对话框启用挂钩过程
- 在 标志CHOOSEFONT 结构的成员中设置 CF_ENABLEHOOK 标志。
- 在 lpfnHook 成员中指定挂钩过程的地址。
处理 WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 CHOOSEFONT 结构的指针。
挂钩过程可以将 WM_CHOOSEFONT_GETLOGFONT、WM_CHOOSEFONT_SETLOGFONT和 WM_CHOOSEFONT_SETFLAGS 消息发送到对话框,以获取和设置对话框的当前值和标志。
自定义 Windows 7 上的“字体”对话框
以下屏幕截图显示了 Windows 7 中典型的 字体 对话框。
显示字体拨号框屏幕截图
在早期 Windows 版本中,font.dlg 模板文件包含一个默认的 ChooseFont 模板。 Windows 7 上的 font.dlg 模板文件包含两个默认模板:早期 Windows 版本的默认模板和新的 Windows 7 ChooseFont 模板。 因此,在 Windows 7 上自定义 字体 对话框时,必须考虑以下问题。
为在 Windows 7 上运行的应用程序创建自定义模板时,请使用新模板。 此新模板包含一个链接控件,用户可以单击该控件以启动 字体控制面板 窗口,如以下屏幕截图所示。
显示 windows 7屏幕截图
若要使用此链接控件,调用应用程序必须使用版本 6 或更高版本COMCTL32.DLL。 否则,ChooseFont 函数在尝试在自定义模板中创建链接控件时返回错误。 若要确定是否启用此控件,请针对 COMCTL32.DLL 版本 6.0 编译调用应用程序。 有关详细信息,请参阅 使用通用控件启用视觉样式。
如果应用程序使用 COMCTL32.DLL 5.0 或更高版本,则必须在创建自定义模板时执行以下作:
将控件指定为 PUSHBUTTON。 用于启动 字体控制面板的控件 将显示为按钮而不是链接。
替换 font.dlg 中的以下文本:
CONTROL "<A>Show more fonts</A>", IDC_MANAGE_LINK, "SysLink", WS_TABSTOP, 7, 199, 227, 9
包含以下文本:
PUSHBUTTON "S&how more fonts", IDC_MANAGE_LINK, 7, 199, 74, 14 , WS_TABSTOP
若要确保应用程序使用自定义模板,必须使用 CF_ENABLETEMPLATE 标志指定自定义模板,基于 Windows 7 ChooseFont 模板创建自定义模板,然后选择性地启用挂钩过程。
如果在未创建自定义模板的情况下启用挂钩过程,将加载早期 Windows 版本的默认 ChooseFont 模板。
注意
必须在新模板中指定 CONTROL 或 PUSHBUTTON 控件类型,具体取决于应用程序编译的COMMCTL.DLL版本。 另请注意,当应用程序在早期版本的 Windows作系统上运行时,Windows 7 特定功能(例如字体列表和扩展系列)的显示不可用。