“字体”对话框

字体 ”对话框允许用户选择逻辑字体的属性,例如字体系列和关联的字体样式、点大小、效果 (下划线、删除线和文本颜色) ,以及脚本 (或字符集) 。

可以通过初始化 CHOOSEFONT 结构并将结构传递给 ChooseFont 函数来创建并显示“字体”对话框。

以下屏幕截图显示了典型的 “字体 ”对话框。

显示字体对话框的屏幕截图

如果用户单击“ 确定” 按钮, 则 ChooseFont 函数将返回 TRUE ,并在 CHOOSEFONT 结构中设置有关用户选择的信息。

如果用户取消“ 字体 ”对话框或发生错误, 则 ChooseFont 返回 FALSE ,并且未定义 LOGFONT 结构的内容。 可以使用 CommDlgExtendedError 函数检索扩展错误值来确定错误原因。

本节将讨论以下主题。

字体对话框初始化标志

在调用 ChooseFont 之前,CHOOSEFONT 结构的 Flags 成员必须指定CF_SCREENFONTSCF_PRINTERFONTSCF_BOTH,以指示对话框应列出屏幕字体和/或打印机字体。 如果指定CF_PRINTERFONTSCF_BOTH则 CHOOSEFONT 结构的 hDC 成员必须为打印机指定设备上下文的句柄。

如果设置了 CF_PRINTERFONTSCF_BOTH 标志,则字体类型说明标签将显示在“ 字体 ”对话框的底部。

从 Windows 7 开始,ChooseFont 函数不再使用CF_PRINTERFONTSCF_SCREENFONTSCF_BOTHCF_WYSIWYG标志进行字体枚举。 它们在 Windows 7 中已过时。 但是, CF_PRINTERFONTS 标志保留一个函数:在“ 字体”对话框 底部显示字体类型说明标签。

可以使用 Flags 成员启用或禁用某些 “字体 ”对话框控件,还可以将 Flags 成员与其他 CHOOSEFONT 成员结合使用来控制某些控件的初始值。

显示允许用户选择删除线、下划线和颜色选项的控件:

  • 设置 CF_EFFECTS 标志。 可以使用 CHOOSEFONT 结构的 rgbColors 成员指定初始字体颜色。

指定“字体”、“字体样式”、“大小”、“删除线”和“下划线”对话框控件的初始值:

  1. 指定“字体”、“字体样式”、“大小”、“删除线”和“下划线”对话框控件的初始值:
  2. 设置 Flags 成员中的CF_INITTOLOGFONTSTRUCT标志,以及 lpLogFont 指向的 LOGFONT 结构的成员,以指定字体属性的初始值。
  3. 还可以使用 CF_NOFACESELCF_NOSTYLESELCF_NOSIZESEL 标志来防止 “字体 ”对话框显示相应控件的初始值。 这在处理具有多个字样、样式或点大小的选定文本时非常有用。 如果用户未选择相应的值,则当 ChooseFont 返回时,还会在 Flags 中设置这些值。

将“字体样式”控件初始化为指定的样式名称

  • 设置 CF_USESTYLE 标志,并使用 lpszStyle 成员指定样式名称。

注意

若要全球化应用程序,请使用 lpLogFont 指向的 LOGFONT 结构的 lfWeightlfItalic 成员指定样式。 样式名称可能会根据系统用户界面语言而更改。

 

显示“应用”按钮

  • 设置CF_APPLY标志并提供挂钩过程来处理“应用”按钮WM_COMMAND消息。 挂钩过程可以将 WM_CHOOSEFONT_GETLOGFONT 消息发送到对话框,以检索包含当前字体选择的 LOGFONT 结构的地址。

显示“帮助”按钮

  • 设置 CF_SHOWHELP 标志。 hwndOwner 成员必须标识在用户单击“帮助”按钮时接收 HELPMSGSTRING 注册消息的窗口。

限制对话框中显示的字体

  • 设置 CF_TTONLYCF_FIXEDPITCHONLYCF_NOVECTORFONTSCF_NOVERTFONTSCF_SCALABLEONLYCF_WYSIWYG 标志的任意组合。 还可以使用 CF_NOSIMULATIONS 值限制对话框为某些字体显示的可用样式。

从 Windows 7 开始,对话框中显示的字体列表会根据用户显示的字体进行限制。 若要删除限制,请设置 CF_INACTIVEFONTS 标志。

限制用户可以指定的字样名称、样式和点大小

  1. 设置 CF_FORCEFONTEXIST 标志以限制用户仅指定对话框中列出的有效字样名称、样式和点大小。
  2. 设置CF_LIMITSIZE标志以限制用户指定 nSizeMin 和 nSizeMax 成员指定的范围内的点大小。

限制或禁用脚本组合框

  • 设置 CF_NOSCRIPTSEL 标志以禁用 “脚本 ”组合框,或设置 CF_SELECTSCRIPT 标志以将 “脚本 ”组合框中的选择限制为指定的字符集。

在早期版本的 Windows 上自定义“字体”对话框

例如,如果要包含应用程序唯一的其他控件,则可以为“ 字体 ”对话框提供自定义模板。 ChooseFont 函数使用自定义模板代替默认模板。

为“字体”对话框提供自定义模板

  1. 通过修改 Font.dlg 文件中指定的默认模板创建自定义模板。 默认字体对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
  2. 使用 CHOOSEFONT 结构启用模板,如下所示:
    • 如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置CF_ENABLETEMPLATE标志。 使用 结构的 hInstancelpTemplateName 成员标识模块和资源名称。
    • 如果自定义模板已在内存中,请设置 CF_ENABLETEMPLATEHANDLE 标志。 使用 hInstance 成员标识包含模板的内存对象。

可以为“字体”对话框提供 CFHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息,并将消息发送到对话框。 如果使用自定义模板来定义其他控件,则必须提供挂钩过程来处理控件的输入。

为“字体”对话框启用挂钩过程

  1. CHOOSEFONT 结构的 Flags 成员中设置CF_ENABLEHOOK标志。
  2. lpfnHook 成员中指定挂钩过程的地址。

处理 WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 CHOOSEFONT 结构的指针。

挂钩过程可以将 WM_CHOOSEFONT_GETLOGFONTWM_CHOOSEFONT_SETLOGFONTWM_CHOOSEFONT_SETFLAGS 消息发送到对话框,以获取和设置对话框的当前值和标志。

自定义 Windows 7 上的“字体”对话框

以下屏幕截图显示了 Windows 7 中典型的 “字体 ”对话框。

显示字体拨号盘框的屏幕截图

在早期 Windows 版本中,font.dlg 模板文件包含一个默认的 ChooseFont 模板。 Windows 7 上的 font.dlg 模板文件包含两个默认模板:早期 Windows 版本的默认模板和新的 Windows 7 ChooseFont 模板。 因此,在 Windows 7 上自定义 “字体 ”对话框时,必须考虑以下问题。

  1. 为在 Windows 7 上运行的应用程序创建自定义模板时,请使用新模板。 此新模板包含一个链接控件,用户可以单击该控件以启动“字体控制面板”窗口,如以下屏幕截图所示。

    显示 Windows 7 中字体控制面板的屏幕截图

  2. 若要使用此链接控件,调用应用程序必须使用 COMCTL32.DLL版本 6 或更高版本。 否则, ChooseFont 函数在尝试在自定义模板中创建链接控件时返回错误。 若要确定是否启用此控件,请根据COMCTL32.DLL版本 6.0 编译调用应用程序。 有关详细信息,请参阅 使用通用控件启用视觉样式

  3. 如果应用程序使用 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 模板。

注意

必须在新模板中指定 CONTROLPUSHBUTTON 控件类型,具体取决于应用程序编译所针对COMMCTL.DLL的版本。 另请注意,当应用程序在早期版本的 Windows 操作系统上运行时,Windows 7 特定功能(如 WYSIWYG 显示字体列表和扩展系列)不可用。