当前位置:C++技术网 > 资讯 > 完美记事项目:3 CRichEditCtrl控件类重载

完美记事项目:3 CRichEditCtrl控件类重载

更新时间:2015-06-26 12:27:51浏览次数:1+次

    富文本框控件类的重载,和其他基本控件的重载类似。但是在开发过程中,还是需要对它进行介绍,以备查询修改。
    在主对话框中拖入一个富文本框控件。然后在主窗口初始化或者在应用实例初始化时对控件对富文本框进行初始化。参考文章《CRichEditCtrl富文本框控件使用入门》和《Windows富文本框控件CRichEditCtrl版本问题》。
    在类视图中,右击添加一个类,选择MFC类,在弹出的对话框中,填入类名【wmRichText】,基类选择【CRichEditCtrl】,完成即可。
    设置富文本框控件ID为【IDC_RT_CUR】。右击富文本框控件,添加变量,在弹出的对话框中,变量类型输入【wmRichText】,变量名设置为【m_RichText】,完成即可。
    添加完变量后,要在主对话框类头文件中,添加一个头文件,就是我们重载的富文本框类头文件,即wmRichText.h。在主对话框的头文件中就生成了一个成员变量:wmRichText m_RichText;// - 这就是重载富文本框后的成员变量
    使用富文本框控件时就直接使用此成员变量即可。此变量就是一个控件类对象,操作控件就只需要调用类成员函数即可,不需要直接使用API函数。
    既然我们重载了控件类,也就是想将控件的事件响应都放在重载的控件类中,方便移植和管理。所以下面要说说富文本框的事件响应。
    因为富文本框控件不是公用控件,有些地方需要说一下。再者,对重载后的控件类,不熟的一开始都不知道如何添加事件响应。
    右击重载的类,选择属性,有如下图所示的属性页。

    事件响应、消息响应、重载
    方框中的从左到右,依次是添加事件、标准消息、重载函数。因为重载控件后,这个类就是窗口类了,因此可以直接接受标准消息。此时就没有事件的说法了。事件是针对于控件来说的,如果是窗口,那么就显示该窗口中的控件的可以响应的事件列表。标准消息则只针对标准的窗口,而重载则是重载基类的虚函数。那么我们的重载后的富文本框则可以添加标准消息。因为是重载的控件,控件提供了一些借口供我们使用,这些接口类似于控件的事件响应。实际上窗口对窗口的控件的事件响应就是通过这些控件提供的事件接口来处理的。控件的接口事件使用=号开头,事件名称和常见的控件的事件一样的。然后在事件接口条目上单击,即可选择添加一个事件响应。
    这里特别提醒一下,不要在主窗口的控件中右击添加事件,这样添加后就是在父窗口中响应消息。事实上,消息会现在控件的派生类中先处理,然后又回到父窗口处理。既然我们派生一个类,那么就都在派生类中处理,那么都在派生类类名中右击属性这种方式添加,或者如果你很熟悉,可以手动添加。
    对于普通的一些事件响应,直接添加就行了。但是,富文本框有些事件则需要做额外的操作,否则事件无法响应。比如文本改变事件,需要在主窗口初始化时设置一个事件触发标志,否则无法触发。这个在添加此事件会自动提示,如果没有提示,表明不需要额外做什么,如果有提示需要做什么,才需要做什么,按照提示做就是了。
    以文本改变事件触发为例,添加事件后,自动生成下面的提示:

    // TODO:  如果该控件是 RICHEDIT 控件,它将不
    // 发送此通知,除非重写 CDialogEx::OnInitDialog()
    // 函数并调用 CRichEditCtrl().SetEventMask(),
    // 同时将 ENM_CHANGE 标志“或”运算到掩码中。

    // TODO:  在此添加控件通知处理程序代码

    这是什么意思呢?就是说,只添加这个事件是不够的,不会响应这个事件。需要我们做一些额外的操作。要在初始化对话框时,调用富文本框的SetEventMask()成员函数,并设置触发事件的标识。设置后,此事件响应就生效了。因为主对话框就是继承自CDialogEx的,主对话框的OnInitDialog也是重载CDialogEx的虚函数OnInitDialog的,所以在主对话框的OnInitDialog进行设置就行了。
    设置方法如下:
     m_RichText.SetEventMask(EM_SETEVENTMASK|ENM_SELCHANGE);

    在参数中传入EM_SETEVENTMASK|ENM_SELCHANGE表示要设置事件掩码,设置的掩码是ENM_SELCHANGE,这个怎么填写就看提示就可以了。其他的事件都可以参考这个就行了。
    到此就基本上介绍完了富文本框控件类的重载,完美记事富文本框是按照这样的方式重载的。