“字体”对话框

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

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

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

显示字体对话框屏幕截图

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

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

本节将讨论以下主题。

“字体”对话框初始化标志

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

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

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

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

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

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

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

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

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

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

注意

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

 

显示“应用”按钮

  • 设置 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 结构启用模板,如下所示:
    • 如果自定义模板是应用程序或动态链接库中的资源,请在 标志 成员中设置 CF_ENABLETEMPLATE 标志。 使用 hInstancelpTemplateName 结构成员来标识模块和资源名称。
    • 如果自定义模板已在内存中,请设置 CF_ENABLETEMPLATEHANDLE 标志。 使用 hInstance 成员标识包含模板的内存对象。

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

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

  1. 标志CHOOSEFONT 结构的成员中设置 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. 若要使用此链接控件,调用应用程序必须使用版本 6 或更高版本COMCTL32.DLL。 否则,ChooseFont 函数在尝试在自定义模板中创建链接控件时返回错误。 若要确定是否启用此控件,请针对 COMCTL32.DLL 版本 6.0 编译调用应用程序。 有关详细信息,请参阅 使用通用控件启用视觉样式

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

注意

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