System.Drawing的撤消按钮?

我正在制作一个图像编辑器,有点让自己享受,并想知道如何制作一个撤消按钮来撤消我做的最后一个画面? 我想知道我对此的看法,教程或示例代码会很好,或者至少有些东西指向我正确的方向。

谢谢!

嘿撤消真的非那么难听起来。 你应该将每个动作记录为在列表或队列中绘制的对象的魔力,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 myObjectsINeedToDraw = new List(); 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. 

一种基本方法是保持一个Stack,它将保存您制作的每个新笔刷。

当您点击撤消按钮时,弹出堆栈并反转您的更改(取决于您的应用程序的细节,可能通过重新绘制背景颜色购买?)

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

命令对象对于实现:

多级撤消如果程序中的所有用户操作都实现为命令对象,则程序可以保留最近执行的命令的堆栈。 当用户想要撤消命令时,程序只会弹出最新的命令对象并执行其undo()方法。

编辑:透视这是如何有用的如果我要解决这个问题,我会做的是记录每个“动作”,用户就像绘制一条线等作为命令并存储关于在里面完成该动作的所有相关信息该命令在应用于绘图上下文之前。

所以每个动作都被推到一个堆栈上,这样你就可以弹回项目了。

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

因此,作为一个例子,我将有一个正在运行的命令堆栈和一个正在运行的绘图对象堆栈。 每5个命令我会将绘图对象的状态推到它的堆栈上,因此当用户按下撤消时,我会抓住绘图对象的顶部状态并将最新的命令应用于对象,保存为最后一个。 要撤消10个动作,我将返回绘制对象的2种状态,而不需要对其应用任何新命令。

您很可能希望限制在程序中可以执行的撤消/重做状态的深度,否则它将在内存中无限增长。