本文共 2425 字,大约阅读时间需要 8 分钟。
“查找/替换”对话框都属于“非模态”对话框,在使用查找、替换对话框前,需要在当前窗口类中添加ON_REGISTERED_MESSAGE消息映射宏,用于设置回调函数以处理查找或替换行为。本实例实现了通过査找对话框在文本中进行査找/替换的功能。实例运行结果如下图所示。
关键技术:
CFindDialog类封装了通用的“查找/替换”对话框。它提供了多个方法用于获取査找数据时的选项。 使用Create方法可以创建査找/替换对话框,语法如下:
BOOL Create( BOOL bFindDialogOnly, LPCTSTR IpszFindWhat,LPCTSTR IpszReplaceWith = NULL, DWORD dwFlags = FR_DOWN, CWnd* pParentWnd = NULL);Create语法中的参数说明如表(1)所示。
表(1) Create语法中的参数说明
使用如下:
dlg = new CFindReplaceDialog;
dlg->Create(TRUE,NULL); dlg->ShowWindow(SW_SHOW);或者
dlg = new CFindReplaceDialog;
dlg->Create(FALSE,NULL); dlg->ShowWindow(SW_SHOW);
设计过程:
(1)创建一个基于对话框的应用程序。
(2)向对话框中添加一个RichEdit控件和两个按钮控件。
(3)为RichEdit控件添加变量m_RichEdit,Category选"Control",要使用RichEdit控件必须在显示对话框前调用AfxInitRichEdit()函数;
图(2)添加m_RichEdit变量,种类为Control
图(2.1)在XXX.cpp中添加AfxInitRichEdit()函数
(4)在主窗口的头文件(即XXXDlg.h)中,声明一个CFindReplaceDialog类的对象dlg和一个BOOL类型变量find。
图(3)声明对象dlg 和变量find,还有函数OnFindReplace()
(5)在XXXDlg.cpp中,定义一个新消息WM_FINDMESSAGE,代码如下: static UINT WM_FINDMESSAGE = RegisterWmdowMessage<FlNDMSGSTRING);
图(4)添加新消息:WM_FINDMESSAGE
(6)在对话框的消息映射部分,添加映射宏: ON_REOISTERED_MESSAGE(WM_FINDMESSAOE, OnFindRepUce)
图(5)在BEGIN...END之间添加映射宏
(7)添加WM_FINDMESSAGE消息的处理函数,实现査找和替换操作,代码如下:
long CFindAndReplaceDlg::OnFindReplace(WPARAM wParam, LPARAM lParam){ CString strText,repText; strText = dlg->GetFindString(); CString str; m_RichEdit.GetWindowText(str); int index = str.Find(strText,0); int len; if(find) { len = strText.GetLength(); } else { repText = dlg->GetReplaceString(); len = repText.GetLength(); str.Replace(strText,repText); m_RichEdit.SetWindowText(str); } m_RichEdit.SetSel(index,index+len); m_RichEdit.SetFocus(); return 0;}
8)为“查找”按钮处理单击事件,创建“查找”对话框的代码如下:
void CFindDialogDlg::OnButton1() //“查找”功能按钮,为“非模态”对话框{ // TODO: Add your control notification handler code here dlg = new CFindReplaceDialog; dlg->Create(TRUE,NULL); dlg->ShowWindow(SW_SHOW); find = TRUE;}
9)为“替换”按钮处理单击事件,创建“替换”对话框的代码如下:
void CFindDialogDlg::OnButton2() //“替换”功能按钮,为“非模态”对话框{ // TODO: Add your control notification handler code here dlg = new CFindReplaceDialog; dlg->Create(FALSE,NULL); dlg->ShowWindow(SW_SHOW); find = FALSE;}
10)在XXXDlg.cpp的OnInitDialog()中,添加如下代码:
// TODO: Add extra initialization here CString str=""; str += "花间一壶酒,独酌无相亲。\r\n"; str += "举杯邀明月,对影成三人。\r\n"; str += "月既不解饮,影徒随我身。\r\n"; str += "暂伴月将影,行乐须及春。\r\n"; str += "我歌月徘徊,我舞影凌乱。\r\n"; str += "醒时同交欢,醉后各分散。\r\n"; str += "永结无情游,相期渺云汉。\r\n"; m_RichEdit.SetWindowText(str);