“查找和替换”对话框
显示一个无模式对话框,该对话框允许用户指定要搜索的字符串,以及在搜索文档中的文本时要使用的选项。 “ 替换 ”对话框允许用户指定要搜索的字符串和替换字符串,以及用于控制操作的选项。
通过初始化 FINDREPLACE 结构并将该结构传递给 FindText 函数,可以创建并显示“查找”对话框。 下图显示了一个典型的“ 查找 ”对话框。
通过初始化 FINDREPLACE 结构并将结构传递给 ReplaceText 函数,可以创建并显示“替换”对话框。 下图显示了一个典型的“ 替换 ”对话框。
与其他常见对话框不同, “查找 ”和“ 替换 ”对话框是无模式的。 无模式对话框允许用户在对话框和创建对话框的窗口之间切换。 这对于让用户搜索字符串、切换到应用程序窗口以处理字符串,以及切换回对话框以搜索另一个字符串很有用,而无需重复打开对话框所需的命令。
如果 FindText 或 ReplaceText 函数成功创建对话框,它将返回对话框的句柄。 可以使用此句柄移动对话框并与之通信。 如果函数无法创建对话框,则返回 NULL。 可以通过调用 CommDlgExtendedError 函数来检索扩展的错误值来确定错误的原因。
本部分讨论以下主题。
FINDMSGSTRING 已注册消息
在创建 “查找 ”或“ 替换 ”对话框之前,必须调用 RegisterWindowMessage 函数以获取 FINDMSGSTRING 已注册消息的消息标识符。 然后,可以使用标识符来检测和处理从对话框发送的消息。 当用户单击对话框中的 “查找下一个”、“ 替换”或“ 全部替换 ”按钮时,对话框过程会将 FINDMSGSTRING 消息发送到所有者窗口的窗口过程。 创建对话框时,FINDREPLACE 结构的 hwndOwner 成员标识所有者窗口。
FINDMSGSTRING 消息的 lParam 参数是指向在创建对话框时指定的 FINDREPLACE 结构的指针。 在发送消息之前,对话框使用最新的用户输入设置此结构的成员,包括要搜索的字符串、替换字符串 ((如果有任何) )以及查找和替换操作的选项。
在 FINDMSGSTRING 消息中,FINDREPLACE 结构的 Flags 成员包含以下标志之一,用于指示导致消息的事件。
标志 | 含义 |
---|---|
FR_DIALOGTERM | 对话框正在关闭。 所有者窗口处理此消息后,对话框的句柄不再有效。 |
FR_FINDNEXT | 用户单击了“查找”或“替换”对话框中的“查找下一个”按钮。 lpstrFindWhat 成员指定要搜索的字符串。 |
FR_REPLACE | 用户单击了“ 替换 ”对话框中的“ 替换 ”按钮。 lpstrFindWhat 成员指定要替换的字符串,lpstrReplaceWith 成员指定替换字符串。 |
FR_REPLACEALL | 用户单击了“ 替换 ”对话框中的“全部 替换 ”按钮。 lpstrFindWhat 成员指定要替换的字符串,lpstrReplaceWith 成员指定替换字符串。 |
对于 “查找下一个 ”或“ 全部替换” 消息, Flags 成员可以包含以下标志的任意组合,以指示搜索选项。
标志 | 含义 |
---|---|
FR_DOWN | 如果设置,则选择方向单选按钮的 向下 按钮,指示用户想要从当前位置到文档末尾进行搜索。 如果未设置 FR_DOWN ,则选择“ 向上 ”按钮,以便用户想要搜索到文档的开头。 |
FR_MATCHCASE | 如果设置,则选中“匹配大小写检查框,指示用户希望搜索区分大小写。 如果未设置FR_MATCHCASE,则取消选中检查框,以便搜索不区分大小写。 |
FR_WHOLEWORD | 如果设置,则选中“匹配整个Word仅检查”框,指示用户只想搜索与搜索字符串匹配的整个单词。 如果未设置FR_WHOLEWORD,则未选中检查框,因此还应搜索与搜索字符串匹配的单词片段。 |
自定义“查找”或“替换”对话框
若要自定义“ 查找 ”或“ 替换 ”对话框,可以使用以下任一方法:
- 创建对话框时,在 FINDREPLACE 结构中指定值
- 提供自定义模板
- 提供挂钩过程
创建“查找或替换”对话框时,可以在 FINDREPLACE 结构的 Flags 成员中设置标志,以隐藏或禁用任何搜索选项控件。 例如,可以设置FR_NOMATCHCASE标志以禁用“匹配大小写检查”框,或设置FR_HIDEMATCHCASE标志来隐藏它。
你可以为“ 查找 ”或“ 替换 ”对话框提供自定义模板,例如,如果要包含应用程序独有的其他控件。 FindText 和 ReplaceText 函数使用自定义模板代替默认模板。
为“查找”或“替换”对话框提供自定义模板
- 通过修改 Findtext.dlg 文件中指定的默认模板来创建自定义模板。 默认的 “查找 或 替换 ”对话框模板中使用的控件标识符在 Dlgs.h 文件中定义。
- 使用 FINDREPLACE 结构启用模板,如下所示:
-
如果自定义模板是应用程序或动态链接库中的资源,请在 Flags 成员中设置FR_ENABLETEMPLATE标志。 使用 结构的 hInstance 和 lpTemplateName 成员标识模块和资源名称。
-或-
如果自定义模板已在内存中,请设置FR_ENABLETEMPLATEHANDLE标志。 使用 hInstance 成员标识包含模板的内存对象。
-
可以为“查找”或“替换”对话框提供 FRHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息。 如果使用自定义模板来定义其他控件,则必须提供一个挂钩过程来处理控件的输入。
为“查找”或“替换”对话框启用挂钩过程
- 在 FINDREPLACE 结构的 Flags 成员中设置FR_ENABLEHOOK标志。
- 在 lpfnHook 成员中指定挂钩过程的地址。
处理 WM_INITDIALOG 消息后,对话框过程会将 WM_INITDIALOG 消息发送到挂钩过程。 此消息的 lParam 参数是指向用于初始化对话框的 FINDREPLACE 结构的指针。
如果挂钩过程返回 FALSE 以响应 WM_INITDIALOG 消息,则除非挂钩过程显示该对话框,否则不会显示该对话框。 为此,请先执行任何其他绘制操作,然后调用 ShowWindow 和 UpdateWindow 函数。 以下代码提供了一个示例:
// 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);