本主题描述显示和管理“查找”对话框的示例代码,以便用户可以指定搜索操作的参数。该对话框将向您的窗口过程发送消息,以便您可以执行搜索操作。
用于显示和管理“替换”对话框的代码是类似的,只是使用ReplaceText函数来显示该对话框。“替换”对话框还会发送消息以响应“替换和替换全部”按钮上的用户点击。
要使用“查找或替换”对话框,必须执行三个单独的任务:
1.获取FINDMSGSTRING注册消息的消息标识符。
2.显示对话框。
3.打开对话框时处理FINDMSGSTRING消息。
初始化应用程序时,请调用RegisterWindowMessage功能获取FINDMSGSTRING注册消息的消息标识符。
UINT uFindReplaceMsg; // FINDMSGSTRING的消息标识符
uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING);
要显示“查找”对话框,首先初始化FINDREPLACE结构,然后调用FindText函数。请注意,FINDREPLACE结构和搜索字符串的缓冲区应该是一个全局或静态变量,所以在对话框关闭之前,它不会超出范围。您必须设置hwndOwner成员以指定接收注册消息的窗口。创建对话框后,可以使用返回的句柄来移动或操作该对话框。
FINDREPLACE fr; //常见的对话框结构
HWND hwnd; //所有者窗口
CHAR szFindWhat[80]; //缓冲区接收字符串
HWND hdlg = NULL; //“查找”对话框的句柄
//初始化FINDREPLACE
ZeroMemory(&fr, sizeof(FINDREPLACE));
fr.lStructSize = sizeof(FINDREPLACE);
fr.hwndOwner = hwnd;
fr.lpstrFindWhat = szFindWhat;
fr.wFindWhatLen = 80;
fr.Flags = 0;
hdlg = FindText(&fr);
当对话框打开时,主消息循环必须包含对IsDialogMessage功能的调用。将对话框的窗口句柄作为IsDialogMessage调用中的参数传递。这样可以确保对话框正确处理键盘消息。
要监视从对话框发送的消息,您的窗口过程必须检查FINDMSGSTRING注册的消息,并处理在FINDREPLACE结构中传递的值,如以下示例所示:
LPFINDREPLACE lpfr;
if (message == uFindReplaceMsg){
//从lParam获取指向FINDREPLACE结构的指针。
lpfr = (LPFINDREPLACE)lParam;
//如果设置了FR_DIALOGTERM标志,
//使识别对话框的句柄无效。
if(lpfr- >标志& FR_DIALOGTERM){
hdlg = NULL;
return 0;
}
//如果设置了FR_FINDNEXT标志,
//调用应用程序定义的搜索例程
//搜索所请求的字符串。
if(lpfr- >标志& FR_FINDNEXT)
SearchFile(lpfr->lpstrFindWhat,
(BOOL)(lpfr- >标志& FR_DOWN),
(BOOL) (lpfr->Flags & FR_MATCHCASE));
return 0;
}