在我的一个程序中,需要提供类似于记事本的查找功能。如图:
我写此文的目的是想向初学mfc的朋友们介绍
- 如何通过cricheditctrl来实现文本查找
- 如何在窗体间发送消息
实现文本查找功能,大致分为以下几步:
- 创建一个包含有cricheditctrl的窗体资源以及该窗体对应的处理类
- 创建一个录入查找文本的窗体资源以及该窗体对应的处理类
- 处理文本查找的消息传递
- 处理文本查找
创建一个包含有cricheditctrl的窗体资源以及该窗体对应的处理类
新建一个工程,通过appwizard创建dialog类型的工程,窗体处理类命名为ctestdlg。打开窗体资源文件,通过资源设计器,在窗体上创建一个rich edit control,然后再创建该窗体的成员变量m_richedit。
头文件为:
class ctestdlg : public cdialog
{
public:
….
cricheditctrl m_richedit;
}
创建一个录入查找文本的窗体资源以及该窗体对应的处理类
再新建一个窗体资源,如图:
打开classwizard,创建一个继承于cdialog的雷cfinddlg。
处理文本查找的消息传递
首先在系统的全局头文件中,定义发送查找命令的消息
#define wm_findmessage (wm_user + 1)
在cfinddlg的查找按钮的查找事件中,发送wm_findmessage
void cknfinddlg::onbnclickedfindbutton()
{
cstring str;
lpctstr findstr;
cedit* edit = (cedit*) this->getdlgitem(idc_edit_find);
edit->getwindowtext(str);
findstr = (lpctstr)str;
::sendmessage(this->getparent()->m_hwnd, wm_findmessage,
(wparam)findstr,null);//因为cfinddlg是通过ctestdlg打开的,打开的代码为:cfinddlg finddlg(this);finddlg.domodal();所以这里可以通过this->getparent()->m_hwnd获取它的句柄
}
在这个自定义的消息传递中,我们通过wparam来传递查找字符串的地址。
在ctestdlg的.h文件中,声明wm_findmessage的处理函数
afx_msg lresult onfindmessage(wparam wparam, lparam lparam);
在ctextdlg的.cpp文件中,声明wm_findmessage的消息处理
begin_message_map(ctestdlg,cdialog)
on_message(wm_findmessage,onfindmessage)
end_message_map
…….
处理文本查找
lresult ctestdlg::onfindmessage(wparam wparam, lparam lparam)
{
static findpos = 0;//通过静态变量来保存当前查找到的匹配的字符串的位置
lpctstr str = (lpctstr)wparam;
findtextex f;
f.chrg.cpmin = findpos;
f.chrg.cpmax = -1;
f.lpstrtext = (lpstr)str;
findpos = this->m_richedit.findtext(fr_down, &f);
if (findpos != -1)
{
this->m_richedit.setsel(f.chrgtext);
findpos ++;
}
else
{
afxmessagebox(_t(“没有找到匹配的字符串”));
findpos = 0;
}
return 0;
}
这段查找代码中如果要加上大小写匹配和全字匹配,相应的代码应该写为:
……
findpos = this->m_richedit.findtext(fr_down | fr_matchcase | fr_wholeword, &f);
……
其中不足的地方,还望路过的高手多多指教。
本人的qq为64528619,希望能够认识更多热爱程序设计的朋友!