-
问题内容:【交流】手把手教你写Undo、Redo程序
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5096964
- 所属论坛:基础类
审核组:VC/MFC
- 提问者:laiyiling
解决者:laiyiling
- 感谢:
- 关键字:VC/MFC 基础类 操作 模板 保存 算法 图像 可逆 旋转 undo redo 软件所
- 答案:
Undo、Redo操作是很多具体编辑功能的软件所不能缺少的。最典型两种类型就是文本编辑和图像编辑软件。然而它的实现在某种程度上来说也不是很简单。我也废话少说。要在程序中支持Undo、Redo操作,就需要保存一些必要的信息,这个是众所周知的。如果想支持无限级的Undo、Redo操作,保存的信息就会无限的膨胀,问题来了,如何设计才能使每一步操作保存的数据尽可能少。
下面我就以图像编辑软件为例。说明如何在图像编辑中添加Undo、Redo功能。在我们开始进行编码设计前,对一些问题进行简单说明:
1、如何保存图像编辑操作中的操作信息。图像编辑可简单分为两类:一类是可逆的。也就是我们施加在图像上的操作可以根据操作算法进行逆操作。比如旋转,在旋转某个角度后如果需要Undo我们可以直接按相反的方向再旋转同样的角度;另一类是不可逆的。这里的不可逆不是绝对的。比如我们根据某个模板算法对图像的每个象素进行修改。这时我们就直接把此类操作归为不可逆。因为即使它可能是可逆的,但是实现起来的难道如果很大,这里只是为了方便说明。
2、对操作有了基本分类后。我们可以发现不可逆操作的Undo、Redo功能实现应该比较容易一些。为什么呢?因为操作不可逆,我们必须在操作前把全部的象素保存起来。这就相当于对原来的信息做了一份拷贝。所有的不可逆操作保存的信息可以认为是相同的:都是整个图像象素。此类操作实现简单,但是代码却高。而对于可逆操作,不同的操作算法就对应不同的Undo、Redo。每次操作保存的信息不同,但是我们只需要保存操作的算法。此类操作实现稍微麻烦。但是所需空间较小。对比两种操作,正如鱼和熊掌不能兼得。
3、在我们打开一副图像后,通常在软件的文档类中应该有一个最基本的图像数据类。所有的操作都是基于此类的数据。而且在我们进行Undo、Redo操作时,需要传递一个外部(也就是文档的图像数据)作为Undo、Redo的对象。
好了,我们开始对一些类进行说明。
这里我就不贴了,请参考下面的地址:
http://blog.csdn.net/laiyiling/archive/2006/10/20/1342519.aspx
---------------------------------------------------------------
在第一篇文章“手把手教你写Undo、Redo程序”里,我介绍了如何实现一个基于图像操作的Undo, Redo框架结构。但是我们现在所讲的还只是Undo类的结构。还有一个非常重要的部分没有说明:我们的这些Undo类应该在什么地方使用呢?另外还实现了如果改进这个结构。
http://blog.csdn.net/laiyiling/archive/2006/10/22/1345716.aspx
- 评价:
给朵鲜花(110)
扔个鸡蛋(55)