MFC 通用对话框之“查找/替换“对话框

21 篇文章 6 订阅

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注册消息而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值