CSDN=>FAQ=>FAQ 展示
  • 问题内容:【交流】手把手教你写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)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo