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

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
扩展Edit Box控件的功能(二)

六、多重UnDo/ReDo功能:Edit Box控件提供了UnDo功能,但只能撤销一次操作,要想实现多重UnDo/ReDo功能需要自己设计。UnDo:撤销上一次修改操作,实现时应保存最近几次修改。ReDo:重做上一次撤销的操作,如果你撤销后后悔了,就ReDo吧。1、数据结构利用一个结构数组作为栈保存最近几次修改操作,定义如下:#define?UNDOMAX????????30//栈深度(最大Undo次数)//可撤销的操作名#define?OP_DELSEL?????1//删除选择(剪切)#define?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;//新内容}STACKNODE;private:?STACKNODE?m_Stack[UNDOMAX];//工作栈?int?utop;//Undo栈顶指针?int?ubottom;//Undo栈底指针?int?rtop;//Redo栈顶指针?int?rbottom;//Redo栈底指针?BOOL?b_DelFlag;//删除标志 UNDOMAX是预定义的栈深度,这里定义为30,表示可撤销最近的30步操作。STACKNODE结构用来定义栈节点,对每一次修改操作,需要纪录修改的位置,修改前的内容和修改后的内容。而且不同的修改操作在撤销时会略有不同,所以还需纪录修改操作名。所有修改可归结为5种:OP_DELSEL:删除选择的文本,此时str1保存被删除的文本,str2为空;OP_REPLACE:替换选择的文本,str1为被换掉的文本,str2为新文本;OP_DELETE:用Del键删除文本,str1保存被删除的文本,str2为空;OP_BACK:用BackSpace键删除文本,str1保存被删除的文本,str2为空;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;?iUNDOMAX;?i++?)//栈空间?{?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?=?utop;//清空Redo栈?rbottom?=?utop;?if(?utop==ubottom?)//如果栈满?ubottom?=?(ubottom+1)%UNDOMAX;//修改栈底指针?m_Stack[utop]?=?*pNode;//入栈} 每次修改操作时,把纪录修改的节点推入栈中。栈采用环形结构,当栈满时,新入栈的节点覆盖栈底节点,也就淘汰了最早进入栈内节点。③UnDo出栈STACKNODE?*CEditBox::UnDoPop(){?if(?utop==ubottom?)//栈空?return?NULL;?STACKNODE?*p?=?m_Stack[utop];?rtop?=?utop;//Redo入栈?utop?=?utop-1;//退栈?if(?utop0?)?utop?=?UNDOMAX-1;?return?p;//返回退栈节点} 当进行UnDo操作时,从utop指示的栈顶弹出记录最近一次修改的节点,但这个节点并不删除,通过修改rtop使它进入ReDo栈,供ReDo操作时重做被撤销的操作。所以,这个操作既是UnDo出栈,也是ReDo进栈。④ReDo出栈STACKNODE?*CEditBox::RedoPop(){?if(?rtop?==?utop?)?return?NULL;?STACKNODE?*p?=?m_Stack[rtop];?utop?=?(utop+1)%UNDOMAX;//Undo入栈?if(?rtop==rb

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档