“查找和替换”对话框

显示一个无模式对话框,允许用户指定要搜索的字符串,以及在文档中搜索文本时要使用的选项。 Replace 对话框允许用户指定要搜索的字符串和替换字符串,以及用于控制作的选项。

通过初始化 FINDREPLACE 结构并将结构传递给 FindText 函数,可以创建并显示 查找 对话框。 下图显示了典型的“查找 ”对话框

查找对话框

通过初始化 FINDREPLACE 结构并将结构传递给 ReplaceText 函数,创建并显示 替换 对话框。 下图显示了典型的“替换 ”对话框

替换对话框

与其他常见对话框不同,查找替换 对话框是无模式的。 无模式对话框允许用户在对话框和创建对话框的窗口之间切换。 这可用于让用户搜索字符串、切换到应用程序窗口以处理字符串,并切换回对话框以搜索另一个字符串,而无需重复打开对话框所需的命令。

如果 FindTextReplaceText 函数成功创建对话框,它将返回对话框的句柄。 可以使用此句柄来移动和与对话框通信。 如果函数无法创建对话框,则返回 NULL。 可以通过调用 CommDlgExtendedError 函数来检索扩展的错误值来确定错误的原因。

本部分讨论以下主题。

FINDMSGSTRING 已注册的消息

在创建 查找替换 对话框之前,必须调用 RegisterWindowMessage 函数以获取 FINDMSGSTRING 已注册消息的消息标识符。 然后,可以使用标识符来检测和处理从对话框发送的消息。 当用户单击对话框中 “查找下一”、“替换”或“替换所有”按钮时,对话框过程会将 FINDMSGSTRING 消息发送到所有者窗口的窗口过程。 创建对话框时,FINDREPLACE 结构的 hwndOwner 成员标识所有者窗口。

FINDMSGSTRING 消息的 lParam 参数是指向创建对话框时指定的 FINDREPLACE 结构的指针。 在发送消息之前,对话框会使用此结构的成员设置最新用户输入,包括要搜索的字符串、替换字符串(如果有)和查找和替换作的选项。

FINDMSGSTRING 消息中,FINDREPLACE 结构的 标志 成员包括以下标志之一,以指示导致消息的事件。

意义
FR_DIALOGTERM 对话框正在关闭。 所有者窗口处理此消息后,对话框的句柄将不再有效。
FR_FINDNEXT 用户在 查找替换 对话框中单击了 查找下一 按钮。 lpstrFindWhat 成员指定要搜索的字符串。
FR_REPLACE 用户在 “替换”对话框中单击 了“替换”按钮。 lpstrFindWhat 成员指定要替换的字符串,lpstrReplaceWith 成员指定替换字符串。
FR_REPLACEALL 用户在 “替换”对话框中单击了 “全部替换”按钮。 lpstrFindWhat 成员指定要替换的字符串,lpstrReplaceWith 成员指定替换字符串。

 

对于 查找下一个替换所有 消息,标志 成员可以包括以下标志的任意组合以指示搜索选项。

意义
FR_DOWN 如果已设置,则选中方向单选按钮 向下 按钮,指示用户希望从当前位置搜索到文档末尾。 如果未设置 FR_DOWN,则会选择“Up”按钮,以便用户想要搜索文档的开头。
FR_MATCHCASE 如果已设置,则选中 匹配大小写 复选框,指示用户希望搜索区分大小写。 如果未设置 FR_MATCHCASE,则取消选中该复选框,以便搜索不区分大小写。
FR_WHOLEWORD 如果已设置,则选中 “仅匹配整个单词” 复选框,指示用户只搜索与搜索字符串匹配的整个单词。 如果未设置 FR_WHOLEWORD,则取消选中该复选框,因此还应搜索与搜索字符串匹配的单词片段。

 

自定义“查找或替换”对话框

若要自定义 查找替换 对话框,可以使用以下任一方法:

  • 创建对话框时,在 FINDREPLACE 结构中指定值
  • 提供自定义模板
  • 提供挂钩过程

创建 查找替换 对话框时,可以在 FINDREPLACE 结构的 标志 成员中设置标志以隐藏或禁用任何搜索选项控件。 例如,可以设置FR_NOMATCHCASE标志以禁用 匹配事例 复选框,或设置FR_HIDEMATCHCASE标志以隐藏它。

你可以为 查找替换 对话框提供自定义模板,例如,如果要包含应用程序唯一的其他控件。 FindTextReplaceText 函数使用自定义模板代替默认模板。

为“查找”或“替换”对话框提供自定义模板

  1. 通过修改 Findtext.dlg 文件中指定的默认模板创建自定义模板。 在 Dlgs.h 文件中定义默认 查找替换 对话框模板中使用的控件标识符。
  2. 使用 FINDREPLACE 结构启用模板,如下所示:
      • 如果自定义模板是应用程序或动态链接库中的资源,请在 标志 成员中设置FR_ENABLETEMPLATE标志。 使用 hInstancelpTemplateName 结构成员来标识模块和资源名称。

        -或-

      • 如果自定义模板已在内存中,请设置FR_ENABLETEMPLATEHANDLE标志。 使用 hInstance 成员标识包含模板的内存对象。

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

为查找或替换对话框启用挂钩过程

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

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

如果挂钩过程返回 FALSE 以响应 WM_INITDIALOG 消息,则除非挂钩过程显示它,否则不会显示对话框。 为此,请先执行任何其他绘制作,然后调用 ShowWindowUpdateWindow 函数。 以下代码提供了一个示例:

// We've returned FALSE in response to WM_INITDIALOG. 
// We've performed any other paint operations. 
// Now we display the dialog box. 
ShowWindow(hDlg, SW_SHOWNORMAL); 
UpdateWindow(hDlg);