欢迎光临
我们一直在努力

CRichEditCtrl中实现查找功能-.NET教程,评论及其它

建站超值云服务器,限时71元/月

在我的一个程序中,需要提供类似于记事本的查找功能。如图:

 

我写此文的目的是想向初学mfc的朋友们介绍

  1. 如何通过cricheditctrl来实现文本查找
  2. 如何在窗体间发送消息

实现文本查找功能,大致分为以下几步:

  1. 创建一个包含有cricheditctrl的窗体资源以及该窗体对应的处理类
  2. 创建一个录入查找文本的窗体资源以及该窗体对应的处理类
  3. 处理文本查找的消息传递
  4. 处理文本查找

创建一个包含有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,希望能够认识更多热爱程序设计的朋友!

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » CRichEditCtrl中实现查找功能-.NET教程,评论及其它
分享到: 更多 (0)