“字体”对话框
“ 字体 ”对话框允许用户选择逻辑字体的属性,例如字体系列和关联的字体样式、点大小、效果 (下划线、删除线和文本颜色) ,以及脚本 (或字符集) 。
可以通过初始化 CHOOSEFONT 结构并将结构传递给 ChooseFont 函数来创建并显示“字体”对话框。
以下屏幕截图显示了典型的 “字体 ”对话框。
如果用户单击“ 确定” 按钮, 则 ChooseFont 函数将返回 TRUE ,并在 CHOOSEFONT 结构中设置有关用户选择的信息。
如果用户取消“ 字体 ”对话框或发生错误, 则 ChooseFont 返回 FALSE ,并且未定义 LOGFONT 结构的内容。 可以使用 CommDlgExtendedError 函数检索扩展错误值来确定错误原因。
本节将讨论以下主题。
字体对话框初始化标志
在调用 ChooseFont 之前,CHOOSEFONT 结构的 Flags 成员必须指定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 标志保留一个函数:在“ 字体”对话框 底部显示字体类型说明标签。
可以使用 Flags 成员启用或禁用某些 “字体 ”对话框控件,还可以将 Flags 成员与其他 CHOOSEFONT 成员结合使用来控制某些控件的初始值。
显示允许用户选择删除线、下划线和颜色选项的控件:
- 设置 CF_EFFECTS 标志。 可以使用 CHOOSEFONT 结构的 rgbColors 成员指定初始字体颜色。
指定“字体”、“字体样式”、“大小”、“删除线”和“下划线”对话框控件的初始值:
- 指定“字体”、“字体样式”、“大小”、“删除线”和“下划线”对话框控件的初始值:
- 设置 Flags 成员中的CF_INITTOLOGFONTSTRUCT标志,以及 lpLogFont 指向的 LOGFONT 结构的成员,以指定字体属性的初始值。
- 还可以使用 CF_NOFACESEL、 CF_NOSTYLESEL和 CF_NOSIZESEL 标志来防止 “字体 ”对话框显示相应控件的初始值。 这在处理具有多个字样、样式或点大小的选定文本时非常有用。 如果用户未选择相应的值,则当 ChooseFont 返回时,还会在 Flags 中设置这些值。
将“字体样式”控件初始化为指定的样式名称
- 设置 CF_USESTYLE 标志,并使用 lpszStyle 成员指定样式名称。
注意
若要全球化应用程序,请使用 lpLogFont 指向的 LOGFONT 结构的 lfWeight 和 lfItalic 成员指定样式。 样式名称可能会根据系统用户界面语言而更改。
显示“应用”按钮
- 设置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 结构启用模板,如下所示:
- 如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置CF_ENABLETEMPLATE标志。 使用 结构的 hInstance 和 lpTemplateName 成员标识模块和资源名称。
- 如果自定义模板已在内存中,请设置 CF_ENABLETEMPLATEHANDLE 标志。 使用 hInstance 成员标识包含模板的内存对象。
可以为“字体”对话框提供 CFHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息,并将消息发送到对话框。 如果使用自定义模板来定义其他控件,则必须提供挂钩过程来处理控件的输入。
为“字体”对话框启用挂钩过程
- 在 CHOOSEFONT 结构的 Flags 成员中设置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 上运行的应用程序创建自定义模板时,请使用新模板。 此新模板包含一个链接控件,用户可以单击该控件以启动“字体控制面板”窗口,如以下屏幕截图所示。
若要使用此链接控件,调用应用程序必须使用 COMCTL32.DLL版本 6 或更高版本。 否则, ChooseFont 函数在尝试在自定义模板中创建链接控件时返回错误。 若要确定是否启用此控件,请根据COMCTL32.DLL版本 6.0 编译调用应用程序。 有关详细信息,请参阅 使用通用控件启用视觉样式。
如果应用程序使用 COMCTL32.DLL 版本 5.0 或更早版本,则必须在创建自定义模板时执行以下操作:
将控件指定为 PUSHBUTTON。 用于启动 Fonts 控制面板 的控件将显示为按钮而不是链接。
替换 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 特定功能(如 WYSIWYG 显示字体列表和扩展系列)不可用。