自定义常用对话框

可以使用标准格式的常用对话框,也可以自定义它们。 从用户的角度来看,通用对话框的主要优势是其外观和功能在应用程序之间保持一致。 因此,仅当应用程序绝对需要时才自定义通用对话框,这一点很重要。 否则,一致的外观和简单的编码接口将丢失。 适当的自定义项会保留尽可能多的原始控件。 增加对话框的大小或在对话框中已有的空间中添加新控件是适当的自定义项。 隐藏原始控件或以其他方式更改原始控件的预期功能是不太合适的自定义。

本部分讨论自定义常用对话框的以下方法:

自定义模板

常见对话框具有默认模板,用于定义对话框中标准控件的数量、类型和位置。 可以定义自定义模板,使用户能够访问应用程序特有的其他控件。

对于除“资源管理器”样式的“ 打开 ”和“ 另存为 ”对话框之外的所有常见对话框,可以修改默认模板以创建替换默认模板的自定义模板。 自定义模板定义标准控件以及任何其他控件的类型和位置。

通过修改默认对话框模板创建自定义对话框模板时,请确保任何添加的控件的标识符是唯一的,并且不与标准控件的标识符冲突。 下表列出了默认模板文件的名称以及每种常见对话框类型的 include 文件。

对话框类型 模板文件 include 文件
彩色 Color.dlg ColorDlg.h
查找 Findtext.dlg Dlgs.h
字体 Font.dlg Dlgs.h
打开 (多选) Fileopen.dlg Dlgs.h
打开 (单选) Fileopen.dlg Dlgs.h
页面设置 Prnsetup.dlg Dlgs.h
打印 Prnsetup.dlg Dlgs.h
打印设置 (过时) Prnsetup.dlg Dlgs.h
Findtext.dlg Dlgs.h

若要启用自定义模板,必须在对话框相应结构的 Flags 成员中设置一个标志。 如果模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置 ENABLETEMPLATE 标志,并使用结构的 hInstancelpTemplateName 成员标识模块和资源名称。 如果模板已在内存中,请在 Flags 成员中设置 ENABLETEMPLATEHANDLE 标志,并使用 hInstance 成员标识包含该模板的内存对象。

在大多数情况下,还必须为对话框启用挂钩过程,以支持和处理自定义模板中其他控件的输入。

对于“资源管理器”样式的“ 打开 ”和“ 另存为 ”对话框,默认模板不可用于修改。 相反,自定义模板定义了一个子对话框,该子对话框仅包含要添加到标准对话框的项。 自定义模板还可以定义一个静态控件,该控件指定子对话框中标准控件群集的位置。 有关详细信息,请参阅 资源管理器样式自定义模板

常见对话框的挂钩过程

对于每个常见对话框,可以启用挂钩过程来处理来自默认对话框过程的消息。 有两种常规类型的常见对话挂钩过程:

  • 用于最常见对话框的标准挂钩过程
  • 打开 ”和“ 另存为 ”对话框支持的资源管理器样式挂钩过程

为其中一个常用对话框提供标准挂钩过程时,默认对话框过程将按如下所示处理其消息。

消息 处理
WM_INITDIALOG 默认对话框过程在将消息传递到挂钩过程之前对其进行处理。 消息的 lParam 参数是指向创建对话框时指定的初始化结构的指针。
所有其他消息 挂钩过程首先接收消息。 然后,挂钩过程的返回值确定默认对话过程是处理消息还是忽略它。

对于“资源管理器”样式的“ 打开 ”和“ 另存为 ”对话框,挂钩过程不会接收用于对话框中标准控件的消息。 相反,它接收来自对话框的通知消息,以及自定义模板中定义的任何其他控件的消息。 有关详细信息,请参阅 资源管理器样式挂钩过程

若要启用挂钩过程,请在对话框相应结构的 Flags 成员中设置 ENABLEHOOK 值。 如果设置了 ENABLEHOOK 标志,则结构的 lpfnHook 成员必须指定挂钩过程的地址。

下表显示了要为每个常见对话框提供的挂钩过程的类型。

对话框类型 挂钩过程
彩色 CCHookProc
查找替换 FRHookProc
字体 CFHookProc
打开另存为 (资源管理器样式) OFNHookProc
打开另存为 (旧式) OFNHookProcOldStyle
打印 PrintHookProc
页面设置 PageSetupHook

对于“ 页面设置 ”对话框,还可以指定 PagePaintHook 挂钩过程。 这是一个特殊的挂钩过程,可用于自定义“ 页面设置 ”对话框显示的示例页面的外观。

注意

打印设置 ”对话框已被 “页面设置 ”对话框取代。 应用程序应使用 “页面设置 ”对话框。 但是,为了兼容, PrintDlg 函数继续支持显示“ 打印设置 ”对话框。 可以为“打印设置”对话框提供 SetupHookProc 挂钩过程。

常见对话消息

常见对话框使用消息在发生某些事件时通知窗口过程或挂钩过程。 此外,还可以将消息发送到公共对话框以检索信息或控制对话框的行为或外观。 本部分介绍 RegisterWindowMessage 函数注册的常见对话消息、 “字体 ”对话框和“ 页面设置 ”对话框使用的消息,以及“资源管理器”样式 的“打开 ”和“ 另存为 ”对话框使用的消息。

通用对话框库定义一组消息字符串。 可以将与其中一个消息字符串关联的常量传递给 RegisterWindowMessage 以获取消息标识符。 然后,可以使用 标识符来检测和处理从公共对话框发送的消息,或将消息发送到公共对话框。 下表显示了消息常量并描述了它们的用法。

Contants 用途
COLOROKSTRING 当用户选择颜色并单击“确定”按钮时,“颜色”对话框会将此消息发送到挂钩过程。 挂钩过程可以接受或拒绝颜色,并强制对话框保持打开状态。
FILEOKSTRING 当用户选择文件名并单击“确定”按钮时,“打开”或“另存为”对话框会将此消息发送到挂钩过程。 挂钩过程可以接受文件名,也可以拒绝它并强制对话框保持打开状态。 对于资源管理器样式 的“打开 ”和“ 另存为 ”对话框,此消息已被 CDN_FILEOK 通知消息所取代。
FINDMSGSTRING 当用户单击“查找下一个”、“替换”或“全部替换”或“全部替换”或关闭对话框时,“查找或替换”对话框会将此消息发送到其父窗口的窗口过程。 消息的 lParam 参数是指向包含用户输入的 FINDREPLACE 结构的指针。
HELPMSGSTRING 当用户单击“ 帮助 ”按钮时,所有常见对话框都会将此消息发送到其父窗口的窗口过程。 对于“资源管理器”样式 的“打开 ”和“ 另存为 ”对话框,此消息已被 CDN_HELP 通知消息所取代。
LBSELCHSTRING 当用户更改“文件名”列表框中的选择时,“打开”或“另存为”对话框会将此消息发送到挂钩过程。 对于资源管理器样式 的“打开 ”和“ 另存为 ”对话框,此消息已被 CDN_SELCHANGE 通知消息所取代。
SETRGBSTRING 挂钩过程可以将此消息发送到 “颜色 ”对话框,以设置当前颜色选择。
SHAREVISTRING 如果用户单击“确定”按钮时所选文件发生共享冲突,则打开或另存为对话框会将此消息发送到挂钩过程。 对于“资源管理器”样式 的“打开 ”和“ 另存为 ”对话框,此消息已被 CDN_SHAREVIOLATION 通知消息所取代。

某些常见对话框发送和接收其他窗口消息。 “字体”对话框的挂钩过程可以将任何WM_CHOOSEFONT_*消息发送到“字体”对话框。 有关详细信息,请参阅 字体对话框。 如果启用了 PagePaintHook 挂钩过程,“页面设置”对话框会发送WM_PSD_* 消息。 有关详细信息,请参阅 页面设置对话框

“资源管理器”样式的“ 打开 ”和“ 另存为 ”对话框支持一组预定义的消息。 其中包括以 WM_NOTIFY 消息的形式发送到挂钩过程的通知消息,以及挂钩过程可以发送到对话框的消息。 有关这些消息的完整列表,请参阅 资源管理器样式挂钩过程

帮助支持

常见对话框为对话框的标准控件提供上下文相关帮助。 若要为常见对话框提供其他帮助,可以显示 “帮助 ”按钮,并在用户单击该按钮时处理生成的消息。 “ 帮助 ”按钮是对默认上下文相关帮助的补充。 “帮助”按钮可用于描述对话框的一般用途,因为它适用于应用程序。

Context-Sensitive帮助

所有常见对话框都为对话框的标准控件提供上下文相关帮助。 用户可以通过以下任一方法显示单个控件的帮助:

  • 选择控件并按 F1 键。
  • 单击标题栏中的 按钮,然后单击控件。
  • 单击控件上的鼠标右键。

如果通过添加新控件来自定义对话框,还必须通过在挂钩过程中处理帮助请求来扩展对这些控件的帮助支持。 当用户请求帮助时,挂钩过程会收到以下消息。

用户操作 消息
单击控件上的鼠标右键。 WM_CONTEXTMENU
已按 F1 键。 WM_HELP
单击标题栏上的 按钮,然后单击控件。 WM_HELP

应为添加的控件处理这些消息,但让默认对话框过程处理标准控件的消息。 有关如何处理这些消息的详细信息,请参阅 帮助

“帮助”按钮

可以通过在对话框的初始化结构的 Flags 成员中设置 SHOWHELP 值,在任何常见对话框中显示“帮助”按钮。 如果显示“ 帮助 ”按钮,则必须处理用户的帮助请求。 可以在应用程序的某个窗口过程中或对话框的挂钩过程中完成处理。 通常,可以通过调用 WinHelp 函数来处理帮助请求。

若要在某个窗口过程中处理帮助消息,必须获取 由 HELPMSGSTRING 值定义的字符串的消息标识符,并标识接收消息的窗口。 若要获取消息标识符,请在对 RegisterWindowMessage 函数的调用中指定 HELPMSGSTRING 作为 参数。 创建对话框时,请使用对话框初始化结构的 hwndOwner 成员来标识要接收消息的窗口。 每当用户单击“ 帮助 ”按钮时,对话框过程会将消息发送到窗口过程。

若要在挂钩过程中处理帮助消息,应处理 WM_COMMAND 消息。 如果此消息的 wParam 参数指示用户单击了“ 帮助 ”按钮,则挂钩过程会提供帮助。 “帮助”按钮的标识符是在 Dlgs.h 文件中定义的 pshHelp 常量。

“资源管理器”样式的“打开”和“另存为”对话框的挂钩过程不会收到“帮助”按钮WM_COMMAND消息。 相反,当单击“帮助”按钮时,对话框会向挂钩过程发送CDN_HELP通知消息。