我正在制作一个图像编辑器,有点让自己享受,并想知道如何制作一个撤消按钮来撤消我做的最后一个画面?我想知道我对此的看法,教程或示例代码会很好,或者至少有些东西指向我正确的方向。
谢谢!
答案 0 :(得分:3)
看起来像这样:
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 :(得分:1)
http://en.wikipedia.org/wiki/Command_pattern
命令对象非常有用 实施
多级撤消 如果程序中的所有用户操作都实现为命令对象, 程序可以保持一堆 最近执行的命令。什么时候 用户想撤消命令, 程序只是弹出最新的 命令对象并执行其undo() 方法
编辑:透视这是如何有用的如果我要解决这个问题,我会做的就是记录每个“动作”,用户就像绘制一条线等作为命令一样在将该操作应用于绘图上下文之前,存储有关在该命令中完成该操作的所有相关信息。
所以每个动作都被推到一个堆栈上,这样你就可以弹回项目了。
为了提高速度,我也可能会考虑记录一系列动作的绘图对象的状态。由于它是绘图的上下文,因此可能更容易从已知的绘图状态开始并重新应用命令来创建当前版本。
作为一个例子,我将有一个正在运行的命令堆栈和一个正在运行的绘图对象堆栈。每5个命令我会将绘图对象的状态推到它的堆栈上,因此当用户按下撤消时,我会抓住绘图对象的顶部状态并将最新的命令应用于对象,保存为最后一个。要撤消10个动作,我将返回绘制对象的2种状态,而不需要对它应用任何新命令。
您很可能希望限制在程序中可以执行的撤消/重做状态的深度,否则它将在内存中无限增长。
答案 2 :(得分:1)
一种基本方法是保持一个Stack,它将保存你所做的每一个新笔刷。
当您点击撤消按钮时,弹出堆栈并反转您的更改(取决于您的应用程序的细节,可能通过重新绘制背景颜色购买?)