在WTL中使用CFindReplaceDialog,个人感觉要比MFC简单一些。
查找/替换对话框是非模态窗体,靠发送消息(CFindReplaceDialog::GetFindReplaceMsg())与窗体通信。
首先在需要响应“查找/替换”菜单或者按钮功能的地方添加如下代码,用来显示查找/替换对话框。
我是在某个按钮下响应“查找/替换”功能的。
LRESULT CMainDlg::OnBnClickedButton6(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { // TODO: Add your control notification handler code here // FindDialog必须用new的方法,否则就得自己继承并用一个空函数重载OnFinalMessage CFindReplaceDialog *lpFRDlg = new CFindReplaceDialog; //若要用自定义的查找/替换对话框模板则去掉下面两行的注释以及/*FR_ENABLETEMPLATE | */ //lpFRDlg->m_fr.hInstance=GetModuleHandle(NULL); //lpFRDlg->m_fr.lpTemplateName=MAKEINTRESOURCE(1541); lpFRDlg->Create( FALSE, // TRUE for Find, FALSE for FindReplace _T(""), // 初始要找的字符串 NULL, // 初始替换的字符串 /*FR_ENABLETEMPLATE | */FR_DOWN | FR_HIDEWHOLEWORD, // 对话框标志,参考MSDN里的FINDREPLACE结构 *this); // 父窗口句柄 lpFRDlg->ShowWindow(SW_NORMAL); return 0; }
然后在其父窗口类里添加一个消息映射:MESSAGE_HANDLER(CFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceMsg),使程序可以接收查找/替换对话框中发给父窗口的消息。
再定义一个LRESULT OnFindReplaceMsg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);函数
BEGIN_MSG_MAP(CMainDlg) //。。。 COMMAND_HANDLER(IDC_BUTTON6, BN_CLICKED, OnBnClickedButton6) MESSAGE_HANDLER(CFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceMsg) //。。。 END_MSG_MAP() //。。。 LRESULT OnBnClickedButton6(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); LRESULT OnFindReplaceMsg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); //。。。
OnFindReplaceMsg函数就是用来响应查找/替换对话框消息的。
LRESULT CMainDlg::OnFindReplaceMsg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { CString cstrFind, cstrReplace; // 从lParam里取回CFindReplaceDialog对象 CFindReplaceDialog *lpFRDlg = CFindReplaceDialog::GetNotifier(lParam); if (lpFRDlg) { cstrFind = lpFRDlg->GetFindString();//查找串 cstrReplace = lpFRDlg->GetReplaceString();//替换串 if(lpFRDlg->IsTerminating())// 正在退出 { lpFRDlg=NULL; return 0; } if(lpFRDlg->FindNext())// 按了FindNext按钮 { MessageBox(cstrFind); } } return 0; }
在该函数里跟据CFindReplaceDialog的方法:GetFindString(),GetReplaceString(),SearchDown(),FindNext(),MatchCase(),MatchWholeWord(),ReplaceCurrent(),ReplaceAll(),IsTerminating()提供的信息来完成自己所需的工作。