现在要做一个类似coreldraw,或者一般的绘图软件中的undo redo的功能。但是不知道怎么一个思路。我自己手中有一个绘图软件的源代码,想在里面实现撤销和重做的功能。如果只是针对单一的操作做撤销好做,比如说我要撤销删除操作,可以吧删除的对象放在缓存中,要做位移操作,可以记录一个相对位移量。但是要对所有的操作,比如删除对象,删除一组对象,删除层,变换线宽 等等,就是对一些普遍的绘图操作来事来实现undo redo,现在思路上不知道怎么来做。我曾想的是用两个ObList 来存放更改对象,但是这只是针对对对象的,如果我对层做操作了,对象的list显然不合适。如果我另外再用一个layerlist,我如何来组织这两个操作的向后次序呢。上面都是我自己考虑的一些问题,也不知道讲没讲清楚。如果有做过这方面功能的能否给个思路呢。谢谢。 

解决方案 »

  1.   

    可以参考Command模式来实现,将需要有undo/redo功能的 操作 使用Command类实例来表示,
    用户下达一个操作就产生一个command实例,该实例应该有do()/undo()两个方法来分别对应
    它代表的更改操作和还原操作.
    所有的Command实例由统一的Manager统一管理,依次取出各个实例调用do方法,如果需要就还原
    就取出最后一个实例调用undo()并从Manager的实例列表中移除.
      

  2.   

    - - 自己写个结构  记录所有的图形操作类型 点。 UNDO就吧UNDO结构的最后一个给REDO 在UNDO结构中删除 REDO同理。 最后软件退出提示一下。你这不是对图的操作简单多了。我有之前做的。 怎么老扯什么什么模式 晕啊 牛B人比较多吧
      

  3.   

    有人问过,看这个贴:
    http://topic.csdn.net/u/20100424/12/22e9ae51-e910-46e5-9e0d-28ec99d93dbb.html
      

  4.   

    不是,别人的一个软件,需要做这个功能。
    但是要对那么多操作在同一个undo redo 中来实现,感觉比较困难
      

  5.   

    http://www.cnblogs.com/nankezhishi/archive/2008/11/18/1336211.html
    看看这个,或许对你有点帮助