2010-05-27 73 views
3

我正在为自己的享受制作一个图像编辑器,并想知道如何才能制作撤消按钮来撤消我最后一次使用的涂料?我想知道我会怎么做,教程或示例代码会很好,或者至少有一些东西指向正确的方向。System.Drawing的撤销按钮?

谢谢!

+0

你如何定义“最后”画画吗?说我通过拖动画笔绘制一条线。这是'一个'还是很多?如果你正在寻找一个可以为你做这个的.NET类,你可能会倒霉。 – 2010-05-27 18:12:01

+0

这将是一个油漆。我不是真的在找班。 – Tanner 2010-05-27 18:21:39

回答

3

在真正非硬如嘿撤消听起来。在这里你应该记录每个动作作为在列表或队列中绘制的对象的魔力,f.ex,用户绘制一条线,所以你的记录可能看起来像x,y的起始点,x,y的终点或使用方法Draw()来对它自己进行操作,所以撤消操作只会删除该对象。

代码可能是这个样子:

interface IDrawObject 
{ 
    public void Draw(); 
} 

class Line : IDrawObject 
{ 
    private Point _startP; 
    private Point _endP; 

    public Line(Point startPoint; Poing endPoint) 
    { 
     _startP = startPoint; 
     _endP = endPoint; 
    } 

    public void Draw() 
    { 
     //* call some generic draw processor to perform the action with your given parameters. 
    } 
} 

class Rectangle : IDrawObject 
{ 
    //* your code. 
    public void Draw() 
    { 
     //* call some generic draw processor to perform the action with your given parameters. 
    } 
} 

//* then in your code, you could have something like this. 
List<IDrawObject> myObjectsINeedToDraw = new List<IDrawObject>(); 
myObjectsINeedToDraw.Add(new Line(new Point(0, 0), new Point(10, 10)); 

foreach(IDrawObject objectToDraw in myObjectsINeedToDraw) 
{ 
    //* will draw your object. 
    objectToDraw.Draw(); 
} 

//* in this way you will have unlimited history of your objects, and you will always can remove object from that list. 
1

http://en.wikipedia.org/wiki/Command_pattern

Command对象是有用的 实施:

多级撤消 如果程序中所有用户操作的命令对象实现, 程序可以保持的一叠 最近执行的命令。当用户想要撤消命令时, 程序仅弹出最近的命令对象并执行其撤销() 方法。

编辑:要正确看待如何。如果我要解决这个我会做什么,这可能是有用的是记录每个“动作”用户不喜欢画一条线等为命令和存储所有在将该命令应用于绘图上下文之前关于在该命令内完成该动作的关联信息。

因此,每个动作都被压入堆栈,以便您可以弹出物品。

为了提高速度,我也可能会看到类似于记录一系列动作的绘图对象的状态。由于它是绘图的上下文,从一个已知绘图状态开始并重新应用命令来创建当前版本可能会更容易。

所以作为一个例子,我将有一个运行的命令堆栈和一个正在运行的绘图对象堆栈。每5条命令我都会将绘图对象的状态推送到它的堆栈中,所以当用户按下撤消按钮时,我将抓取绘图对象的顶部状态,并将最新的命令应用到最后一个对象的保存位置。为了撤消10个动作,我将返回2个绘图对象的状态,而不需要对它应用任何新的命令。

你很可能想要限制你在程序中可以做的撤消/重做状态的深度,否则它将在内存中无限增长。

+1

每次询问有关撤消的问题时,我都会看到此链接。但它是解决方案的1/4。其他3/4是如何跟踪**状态的应用程序以及如何恢复它。 (并且高效地实现它!) – Andrey 2010-05-27 18:12:36

+0

@Andrey编写软件并不容易,这就是为什么我们都有工作,创建软件模式以便为问题提供可重复的解决方案,这是软件开发人员能够实现模式的角色满足他们特定的业务需求。不过,我会修改我的答案,增加更多的方向。 – 2010-05-27 18:17:03

1

一个基本的方法是保持一个堆栈,它将保存你所做的每一个新的笔画。

你打的撤销按钮,弹出堆栈和反向的变化(取决于您的应用程序的细节,在背景颜色重新粉刷买也许?)