请教高手,关于Undo/Redo的实现 本帖最后由 guo_linda 于 2010-07-19 18:04:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看这几篇吧,也许会有帮助http://topic.csdn.net/t/20021115/20/1180794.htmlhttp://topic.csdn.net/t/20020715/11/874809.html 最简单的是用doc/view结构中的序列化,doc下有一个关于undo、redo的变量可以设置!不过,这样做的缺陷是,如果你的数据量大,那么,可能占用空间挺多的;好的作法是自己实现一个,每次改变数据,都带有数据的改变,这样做的好处是,只保存改变的部分,但是,不好的地方是,每种操作都要自己做!如果没有搞过,建议就用最简单的序列化吧,反正现在机器配置都挺好! 参考设计模式中的commandhttp://www.cnblogs.com/k-sharp/archive/2010/06/25/1765191.html 最好使用Command模式,不同的操作,都做成一个具体的Command来处理。比如移动 就是一个 MoveCommand,删除就是DeleteCommand。这些Command都有一个基类Command,这个基类必须有2个方法Execute(执行命令),UnExecute(撤销命令的执行)。我以Move Command为例,Move的时候,你必须知道的事这个操作所影响到的对象。比如你的图形对象叫做ShapeComponent(及其派生类)。Move的时候,你需要new 一个MoveCommand,然后设置影响到的Shape对象和Move的Offset。 写MoveCommand的Execute方法,让Shape对象Offset 一个位移。UnExecute的时候,就Offset (0-位移)。所有的Command都记录在Document 这个类中。 可以用两个Stack来保存,UndoStack与RedoStack。当你Execute了一个Command后,加这个Command到UndoStack。Undo的时候,从UndoStack Pop一个Command执行UnExecute,然后将此Command加入到RedoStack。当Redo一个Command时,首先从Redo Stack中Pop栈顶Command,调用此Command的Execute方法,然后将此Command加入Undo Stack。 debug版本的pdb文件为什么比release版的pdb要大? 等我辞职时,我散300分 谁能帮算一下字符数组的CRC16校验? 用MFC编写的程序,运行可执行程序需要安装什么软件 关于DirectX的两个问题 有没有异步的发出声音的函数,最好能够指定频率???? 怎么得到某个文件的信息? 为什么我的程序用不同的打印机打印是坐标位置不一样? 关于在ADO中调用ORACLE存储过程 !^_^! 如果在用ATL向导时,没有钩选“merge the proxy/stub code”怎样手动添加该支持? 小弟初学VC 做了个模拟时钟 但想让他跟电脑上的时间一样 该怎么办? 驱动程序调用应用程序
http://topic.csdn.net/t/20021115/20/1180794.htmlhttp://topic.csdn.net/t/20020715/11/874809.html
好的作法是自己实现一个,每次改变数据,都带有数据的改变,这样做的好处是,只保存改变的部分,但是,不好的地方是,每种操作都要自己做!
如果没有搞过,建议就用最简单的序列化吧,反正现在机器配置都挺好!
http://www.cnblogs.com/k-sharp/archive/2010/06/25/1765191.html
比如移动 就是一个 MoveCommand,删除就是DeleteCommand。这些Command都有一个基类Command,这个基类必须有2个方法Execute(执行命令),UnExecute(撤销命令的执行)。我以Move Command为例,Move的时候,你必须知道的事这个操作所影响到的对象。比如你的图形对象叫做ShapeComponent(及其派生类)。Move的时候,你需要new 一个MoveCommand,然后设置影响到的Shape对象和Move的Offset。 写MoveCommand的Execute方法,让Shape对象Offset 一个位移。UnExecute的时候,就Offset (0-位移)。所有的Command都记录在Document 这个类中。 可以用两个Stack来保存,UndoStack与RedoStack。
当你Execute了一个Command后,加这个Command到UndoStack。
Undo的时候,从UndoStack Pop一个Command执行UnExecute,然后将此Command加入到RedoStack。
当Redo一个Command时,首先从Redo Stack中Pop栈顶Command,调用此Command的Execute方法,然后将此Command加入Undo Stack。