CFindReplaceDialog类封装了查找/替换对话框,使用CFindReplaceDialog类可以,可以轻松地在应用程序中实现标准的字符串查找/替换对话框 。不像其他通用对话框是模态对话框,查找/替换对话框是非模态对话框。CFindReplaceDialog对象有两种:查找对话框和查找/替换对话框。尽管对话框允许用户输入搜索和搜索/替换字符串,但它们不执行任何搜索或替换函数。 您必须将它们添加到应用程序中。
要构造一个CFindReplaceDialog对象,使用提供的构造函数(它没有参数)。 由于这是一个非模态对话框,所以使用new操作符在堆上分配对象,而不是在堆栈上。一旦CFindReplaceDialog对象被构造,你必须调用Create成员函数来创建和使用ShowWindow函数显示对话框。在调用Create之前可使用m_fr结构来初始化对话框。 m_fr结构的类型是FINDREPLACE。FINDREPLACE的原型如下:
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HINSTANCE hInstance;
DWORD Flags;
LPTSTR lpstrFindWhat;
LPTSTR lpstrReplaceWith;
WORD wFindWhatLen;
WORD wReplaceWithLen;
LPARAM lCustData;
LPFRHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} FINDREPLACE, *LPFINDREPLACE;
为了让父窗口得到查找/替换请求的通知,必须使用WindowsRegisterWindowMessage函数,并在你的框架窗口中使用处理此注册消息的ON_REGISTERED_MESSAGE消息映射宏。 你可以从框架窗口的回调函数中调用CFindReplaceDialog类成员表的“操作”部分中列出的任何成员函数。CFindReplaceDialog类的成员如下:
下面以一个实例来演示,CFindReplaceDialog的用法。
示例(基于演示文件对话框所创建的单文档工程):
1. 在IDR_MAINFRAME 菜单文件中新建“FindReplaceTestTest”菜单,及子菜单“Find”、“Find & Replace”,如下:
2. 在视图类中添加一个CFindReplaceDialog指针变量pDlg,如下:
3. 为Find子菜单添加事件处理程序,如下:
void CFileDialogTestView::OnFind()
{
// TODO: 在此添加命令处理程序代码
pDlg = new CFindReplaceDialog();
pDlg->Create(TRUE,NULL, NULL, FR_DOWN,this);
pDlg->ShowWindow(SW_SHOW);
}
4. 为Find & Replace子菜单添加事件处理程序,如下:
void CFileDialogTestView::OnFindReplace()
{
// TODO: 在此添加命令处理程序代码
pDlg = new CFindReplaceDialog();
pDlg->Create(FALSE, NULL, NULL, FR_DOWN, this); //find & replace
pDlg->ShowWindow(SW_SHOW);
}
5.在类视图头文件中注册一个Windows消息,代码如下:
// FileDialogTestView.h: CFileDialogTestView 类的接口
//
#pragma once
static UINT WM_FINDMESSAGE = RegisterWindowMessage(FINDMSGSTRING);//register windows message
6. 在类视图头文件中定义毁掉函数OnFindReplace(WPARAM wParm, LPARAM lParam),如下:
7. 在 类视图源文件(.app)中,添加消息映射宏,如下:ON_REGISTERED_MESSAGE(WM_FINDMESSAGE, OnFindReplace)
8.实现回调函数源代码,如下:
LRESULT CFileDialogTestView::OnFindReplace(WPARAM wParm, LPARAM lParam)
{
CString findTxt, replaceTxt;
int pos = -1;
BOOL bReplace = pDlg->ReplaceCurrent();
if (!bReplace)
{
findTxt = pDlg->GetFindString();
pos = mstr.Find(findTxt);
if (-1 == pos)
{
CString strTem;
strTem.Format(L"\"%s\"not found", findTxt);
MessageBox(strTem);
}
else
{
CString strTem;
strTem.Format(L"\"%s\" found at: %d", findTxt, pos);
MessageBox(strTem);
}
}
else
{
findTxt = pDlg->GetFindString();
pos = mstr.Find(findTxt);
replaceTxt = pDlg->GetReplaceString();
MessageBox(replaceTxt);
if (-1 != pos)
{
mstr.Replace(findTxt, replaceTxt);
CClientDC dc(this);
CString oldString = mstr;
COLORREF oldCr = dc.SetTextColor(mCurrentCr);
CFont mfont;
CFont* pOldfont;
mfont.CreateFontIndirectW(&mLogfont);
pOldfont = dc.SelectObject(&mfont);
COLORREF clr = dc.SetTextColor(dc.GetBkColor());
dc.TextOutW(startPoint.x, startPoint.y, oldString);
dc.SetTextColor(clr);
dc.TextOutW(startPoint.x, startPoint.y, mstr);
dc.SelectObject(&pOldfont);
dc.SetTextColor(oldCr);
}
else
MessageBox(L"None is replaced");
}
return 0;
}
9.按Ctrl+F5试运行,结果如下:
10,点击FileDialogTest 菜单下的子菜单Font,设置字体,如下:
11,点击FileDialogTest 菜单下的子菜单Single Line Text,完成一行文字输入,如下:
11,点击FindReplaceTest 菜单下的子菜单Find
打开Find对话框,输入EF,如下:
点击“查找下一个”,结果如下:
点击弹出信息框的确定后,输入:123,点击“查找下一个”,结果如下:
12. 关闭查找对话框后,点击“Find & Replace”子菜单,打开替换对话框
在查找内容输入框中输入:D,在替换为输入框中输入:12345
点击替换,结果如下:
需要注意的是,不要寄希望于“查找/替换对话框"替你完成查找于替换的代码,仅是提供一个对话框及发送FINDMSGSTRING注册消息而已。