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类的成员如下:

android 查找替换 查找替换是什么_mfc

下面以一个实例来演示,CFindReplaceDialog的用法。

示例(基于演示文件对话框所创建的单文档工程):

1. 在IDR_MAINFRAME 菜单文件中新建“FindReplaceTestTest”菜单,及子菜单“Find”、“Find & Replace”,如下:

android 查找替换 查找替换是什么_mfc_02

2. 在视图类中添加一个CFindReplaceDialog指针变量pDlg,如下:

android 查找替换 查找替换是什么_android 查找替换_03

3. 为Find子菜单添加事件处理程序,如下:

android 查找替换 查找替换是什么_android 查找替换_04

void CFileDialogTestView::OnFind()
{
	// TODO: 在此添加命令处理程序代码
	pDlg = new CFindReplaceDialog();
	pDlg->Create(TRUE,NULL, NULL, FR_DOWN,this);
	pDlg->ShowWindow(SW_SHOW);
}

4.为Find & Replace子菜单添加事件处理程序,如下:

android 查找替换 查找替换是什么_c++_05

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),如下:

android 查找替换 查找替换是什么_子菜单_06

7. 在类视图源文件(.app)中,添加消息映射宏,如下:ON_REGISTERED_MESSAGE(WM_FINDMESSAGE, OnFindReplace)

android 查找替换 查找替换是什么_mfc_07

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试运行,结果如下:

android 查找替换 查找替换是什么_mfc_08

10,点击FileDialogTest 菜单下的子菜单Font,设置字体,如下:

android 查找替换 查找替换是什么_windows_09

11,点击FileDialogTest 菜单下的子菜单Single Line Text,完成一行文字输入,如下:

android 查找替换 查找替换是什么_子菜单_10

android 查找替换 查找替换是什么_android 查找替换_11

11,点击FindReplaceTest菜单下的子菜单Find

android 查找替换 查找替换是什么_子菜单_12

打开Find对话框,输入EF,如下:

android 查找替换 查找替换是什么_mfc_13

点击“查找下一个”,结果如下:

android 查找替换 查找替换是什么_子菜单_14

点击弹出信息框的确定后,输入:123,点击“查找下一个”,结果如下:

android 查找替换 查找替换是什么_windows_15

12. 关闭查找对话框后,点击“Find & Replace”子菜单,打开替换对话框

android 查找替换 查找替换是什么_mfc_16

在查找内容输入框中输入:D,在替换为输入框中输入:12345

android 查找替换 查找替换是什么_android 查找替换_17

点击替换,结果如下:

android 查找替换 查找替换是什么_android 查找替换_18