显示一个无模式对话框,允许用户指定要搜索的字符串,以及在文档中搜索文本时要使用的选项。 Replace 对话框允许用户指定要搜索的字符串和替换字符串,以及用于控制作的选项。
通过初始化 FINDREPLACE 结构并将结构传递给 FindText 函数,可以创建并显示 查找 对话框。 下图显示了典型的“查找 ”对话框。
通过初始化 FINDREPLACE 结构并将结构传递给 ReplaceText 函数,创建并显示 替换 对话框。 下图显示了典型的“替换 ”对话框。
与其他常见对话框不同,查找 和 替换 对话框是无模式的。 无模式对话框允许用户在对话框和创建对话框的窗口之间切换。 这可用于让用户搜索字符串、切换到应用程序窗口以处理字符串,并切换回对话框以搜索另一个字符串,而无需重复打开对话框所需的命令。
如果 FindText 或 ReplaceText 函数成功创建对话框,它将返回对话框的句柄。 可以使用此句柄来移动和与对话框通信。 如果函数无法创建对话框,则返回 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标志以隐藏它。
你可以为 查找 或 替换 对话框提供自定义模板,例如,如果要包含应用程序唯一的其他控件。 FindText 和 ReplaceText 函数使用自定义模板代替默认模板。
为“查找”或“替换”对话框提供自定义模板
- 通过修改 Findtext.dlg 文件中指定的默认模板创建自定义模板。 在 Dlgs.h 文件中定义默认 查找 或 替换 对话框模板中使用的控件标识符。
- 使用 FINDREPLACE 结构启用模板,如下所示:
-
如果自定义模板是应用程序或动态链接库中的资源,请在 标志 成员中设置FR_ENABLETEMPLATE标志。 使用 hInstance 和 lpTemplateName 结构成员来标识模块和资源名称。
-或-
如果自定义模板已在内存中,请设置FR_ENABLETEMPLATEHANDLE标志。 使用 hInstance 成员标识包含模板的内存对象。
-
可以为 查找 或 替换 对话框提供 FRHookProc 挂钩过程。 挂钩过程可以处理发送到对话框的消息。 如果使用自定义模板定义其他控件,则必须提供挂钩过程来处理控件的输入。
为查找或替换对话框启用挂钩过程
- 在 FINDREPLACE 结构的 标志 成员中设置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);