使用MFC中自带的CFindReplaceDialog类实现字符串查找和替换

  首先,我们给出本次的demo


使用MFC中自带的CFindReplaceDialog类实现字符串查找和替换_第1张图片



 CFindReplaceDialog类提供了查找和查找/替换对话框,在windows通用的对话框中,查找对话框是比较特殊的一个,他是一个非模态对话框,所以他的使用与其他通用对话框有所不同。本例使用查找对话框对编辑框中的文件实现查找和替换。


首先   ,我们为编辑框添加成员变量

CString m_str;
CEdit m_ctlEdit;


然后在头文件中声明查找对话框并在初始化函数OnInitDialog中进行初始化


CFindReplaceDialog *pFindReplaceDlg;
int pos;
int curpos;

下面是在ONinitDialog中初始化的内容

pFindReplaceDlg = NULL;
curpos = -1;


然后为查找按钮添加响应函数,在create函数创建查找替换对话框



void CMFCApplication5Dlg::OnBnClickedButton1()
{
// TODO:  在此添加控件通知处理程序代码


UpdateData(TRUE);


pos = 0;


if (pFindReplaceDlg){
pFindReplaceDlg->SetActiveWindow();
return;
}


pFindReplaceDlg = new CFindReplaceDialog;
pFindReplaceDlg->Create(FALSE, NULL, NULL, FR_DOWN, this);
}



然后要做的就是 发送并处理替换对话框的通知消息


由于替换对话框是非模态对话框,所有用户选择完毕后,要通知父窗口,这就要通过自定义的消息实现这个功能。首先在对话框的稳步通过函数定义消息

代码如下

static const UINT MsgFindReplace = ::RegisterWindowMessage(FINDMSGSTRING);


然后为消息添加响应函数



BEGIN_MESSAGE_MAP(CMFCApplication5Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication5Dlg::OnBnClickedButton1)
ON_REGISTERED_MESSAGE(MsgFindReplace , OnFindReplace)
END_MESSAGE_MAP()

    


在消息梳理函数中,实现具体的查找,替换操作







LRESULT CMFCApplication5Dlg::OnFindReplace(WPARAM, LPARAM lparam){




if (pFindReplaceDlg->IsTerminating()){  //判断对话框是否被关闭
pFindReplaceDlg = NULL;
}
//获取当前查找对话框的指针
CFindReplaceDialog * pDlg = CFindReplaceDialog::GetNotifier(lparam);
CString m_findstring = pDlg->GetFindString();  //要查找的字符串
int strlen = m_findstring.GetLength(); //获取查到字符串的长度
CString m_Replacestring = pDlg->GetReplaceString();// 要替换的字符串


int placelen = m_Replacestring.GetLength();//要替换的字符串的长度
CString strpos;


if (pDlg->FindNext()){  //按下了“查找”按钮,查找下一个
pos = m_str.Find(m_findstring, pos);
if (pos == -1){
AfxMessageBox(_T("搜索完毕,没有找到指定的字符串"));
pos = 0;
}
else
{
m_ctlEdit.SetFocus();
m_ctlEdit.SetSel(curpos, curpos + strlen);
UpdateData(TRUE);
m_ctlEdit.SetSel(curpos, curpos + placelen);
pos = curpos + placelen;


}




}


if (pDlg->ReplaceCurrent()){ //按下了替换按钮
if (pos == 0){
m_ctlEdit.SetFocus();
m_ctlEdit.SetSel(curpos , curpos+ strlen);
m_ctlEdit.ReplaceSel(m_Replacestring);
UpdateData(TRUE);
m_ctlEdit.SetSel(curpos, curpos + placelen);
pos = curpos + placelen;
}
}


if (pDlg->ReplaceAll()){ //按下了全部替换按钮
m_str.Replace(m_findstring, m_Replacestring);
UpdateData(FALSE);
}


return 0;


}


以上代码就实现了字符串的查找以及字符串的查找和替换功能


代码很简单,但是还是需要一步步的积累。


一步一个脚印,希望自己在c++上走的更远

你可能感兴趣的:(c++,MFC,c++)