扩展Edit Box控件的功能(二)

扩展Edit Box控件的功能(二)

ID:38787617

大小:49.15 KB

页数:12页

时间:2019-06-19

扩展Edit Box控件的功能(二)_第1页
扩展Edit Box控件的功能(二)_第2页
扩展Edit Box控件的功能(二)_第3页
扩展Edit Box控件的功能(二)_第4页
扩展Edit Box控件的功能(二)_第5页
资源描述:

《扩展Edit Box控件的功能(二)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、六、多重UnDo/ReDo功能:EditBox控件提供了UnDo功能,但只能撤销一次操作,要想实现多重UnDo/ReDo功能需要自己设计。UnDo:撤销上一次修改操作,实现时应保存最近几次修改。ReDo:重做上一次撤销的操作,如果你撤销后后悔了,就ReDo吧。1、数据结构利用一个结构数组作为栈保存最近几次修改操作,定义如下:#define UNDOMAX        30    //栈深度(最大Undo次数)//可撤销的操作名#define OP_DELSEL     1     //删除选择(剪切)#defin

2、e OP_REPLACE    2     //替换选择#define OP_DELETE     3     //删除#define OP_BACK       4     //Backspace#define OP_INPUT      5     //输入//Undo/Redo栈结构typedef struct{    int   op;        //操作名    int   pos;       //操作的位置    CString str1;    //旧内容    CString str2;   

3、 //新内容}STACKNODE;private:    STACKNODE m_Stack[UNDOMAX];     //工作栈    int utop;          //Undo栈顶指针    int ubottom;       //Undo栈底指针    int rtop;          //Redo栈顶指针    int rbottom;       //Redo栈底指针    BOOL b_DelFlag;    //删除标志UNDOMAX是预定义的栈深度,这里定义为30,表示可撤销最近的3

4、0步操作。STACKNODE结构用来定义栈节点,对每一次修改操作,需要纪录修改的位置,修改前的内容和修改后的内容。而且不同的修改操作在撤销时会略有不同,所以还需纪录修改操作名。所有修改可归结为5种:OP_DELSEL:删除选择的文本,此时str1保存被删除的文本,str2为空;OP_REPLACE:替换选择的文本,str1为被换掉的文本,str2为新文本;OP_DELETE:用Del键删除文本,str1保存被删除的文本,str2为空;OP_BACK:用BackSpace键删除文本,str1保存被删除的文本,str2

5、为空;OP_INPUT:键盘输入新文本,str1为空,str2为新输入的文本。其它的操作都可归纳到这5种之内,如剪切就是OP_DELSEL,粘贴就是OP_REPLACE。m_Stack是长度为UNDOMAX的栈,它既是UnDo栈,也是ReDo栈,栈指针utop、ubottom确定UnDo栈位置,rtop、rbottom确定ReDo栈位置。2、栈操作①初始化工作栈void CEditBox::InitStack(){    for( int i=0; i

6、     m_Stack[i].op = -1;        m_Stack[i].str1 = _T("");        m_Stack[i].str2 = _T("");    }    utop = 0;        //栈指针    ubottom = 0;    rtop = 0;    rbottom = 0;}②入栈void CEditBox::Push(STACKNODE *pNode){    utop = (utop+1)%UNDOMAX;    //修改栈顶指针    rtop = u

7、top;                //清空Redo栈    rbottom = utop;    if( utop==ubottom )            //如果栈满        ubottom = (ubottom+1)%UNDOMAX;    //修改栈底指针    m_Stack[utop] = *pNode;        //入栈}每次修改操作时,把纪录修改的节点推入栈中。栈采用环形结构,当栈满时,新入栈的节点覆盖栈底节点,也就淘汰了最早进入栈内节点。③UnDo出栈STACKNODE *CE

8、ditBox::UnDoPop(){    if( utop==ubottom )        //栈空        return NULL;    STACKNODE *p = &m_Stack[utop];    rtop = utop;              //Redo入栈    utop = utop-1;            //退栈 

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。