使用MFC中自带的CFindReplaceDialog类实现字符串查找和替换
2014-11-30 10:25
471 查看
首先,我们给出本次的demo
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++上走的更远
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++上走的更远
相关文章推荐
- 通过excel自带的VLOOKUP函数实现字符串自动查找替换
- Python 字符串操作实现代码(截取/替换/查找/分割)
- UE/US正则表达式查找搜索替换,查询的字符串未找到(UE studio/ultraEdit)/修改UE使用Perl正则引擎
- shell字符串操作(长度,查找,替换,匹配)详解(shell内置一系列操作符号实现)
- 用MFC实现“查找/替换”对话框
- oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)
- 利用Linux 自带的GNU正则表达式库实现查找字符串中全部匹配左右边界限定的子串
- 实现字符串的查找和替换
- 直接使用默认设置进行打印:(2)使用MFC编程实现打印中文字符串
- Python 字符串操作实现代码(截取/替换/查找/分割)
- 使用wxString实现字符串在一个文件里面的替换
- 使用C语言实现字符串中子字符串的替换
- oracle实现字符串截取,查找,替换
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- 在c++Builder中使用boost正则表达式实现的查找double和int类型的字符串,并实现StringToInteger和StringToDouble函数
- Notepad++ 使用正则表达式查找替换字符串
- PHP使用正则表达式查找替换字符串
- oracle中实现截取字符串(substr)、查找字符串位置(instr)、替换字符串(replace)
- MFC实现Windows自带的任务管理器性能使用记录功能
- (二)C#使用DsoFramer操作Excel实现查找、替换的功能