2010-05-27 7 views
3

Я делаю редактор изображений для своего удовольствия и задавался вопросом, как я могу сделать кнопку отмены, чтобы отменить последние краски, которые я сделал? Я хочу знать, как бы я это сделал, учебник или образец кода был бы хорош или, по крайней мере, что-то указывало бы мне в правильном направлении.Кнопка отмены для System.Drawing?

Спасибо!

+0

Как бы вы определили «последний» краска? Скажем, я рисую линию, перетаскивая кисть. Это «одна» краска или много? Если вы ищете .NET-класс, который сделает это за вас, вам может быть не повезло. – 2010-05-27 18:12:01

+0

Это будет одна краска. Я действительно не ищу класс. – Tanner

ответ

3

хех отменить в самом деле не так сложно, как звучит. Магия здесь, что вы должны записывать каждое действие как объект, который расписан в списке или очереди, f.ex, пользователь рисует строку, поэтому ваша запись может выглядеть как x, y начала poing и x, y конечной точки или объект it self, у которого есть метод 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

Командные объекты являются полезными для реализации:

Многоуровневая отменить Если все действия пользователя в программе реализованы как командные объекты, программа может держать стек с Самые последние выполненные команды. Когда пользователь хочет отменить команду, программа просто вытаскивает последний командный объект и выполняет его метод отмены() .

Edit: Чтобы поместить в перспективе, как это может быть полезно, если бы я собирался решить эту проблему, что я хотел бы сделать это запись каждого «действие» пользователь делает, как рисовать линии и т.д., как команды и хранить все связанная информация о завершении этого действия внутри этой команды, прежде чем применять ее к контексту рисования.

Таким образом, каждое действие помещается в стек, поэтому вы можете отбрасывать предметы.

Чтобы облегчить скорость, я также, вероятно, посмотрю на что-то вроде записи состояния объекта чертежа для серии действий. Поскольку это контекст рисования, вероятно, было бы легче начать с известного состояния чертежа и повторно использовать команды для создания текущей версии.

Так, например, у меня был бы запущенный стек команд и работающий стек объектов рисования. Каждые 5 команд я бы нажимал состояние объекта чертежа на его стек, поэтому, когда пользователь будет отменять отмену, я бы захватил верхнее состояние объекта рисования и применил новейшие команды к сохранению объекта для последнего. Чтобы отменить 10 действий, я вернусь к двум состояниям объектов рисования и не буду применять к ним какие-либо новые команды.

Скорее всего, вы захотите ограничить глубину состояний отмены/повтора, которые вы можете сделать в своей программе, иначе она будет бесконечно расти в памяти.

+1

всякий раз, когда возникает вопрос об отмене, я вижу эту ссылку. Но это 1/4 решения. другие 3/4 - это как отслеживать ** состояние ** приложения и как его восстановить. (и делать это эффективно!) – Andrey

+0

@ Аndrey писать программное обеспечение нелегко, поэтому у всех нас есть рабочие места, были созданы шаблоны программного обеспечения, чтобы обеспечить повторяющееся решение проблемы. Именно роль разработчика программного обеспечения заключается в возможности реализации шаблонов для отвечают их конкретным потребностям бизнеса. Однако я поправлю свой ответ, чтобы добавить еще несколько направлений. –

1

Одним из основных методов является сохранение стека, в котором будет выполняться каждый новый мазок.

Как вы нажмете кнопку отмены, палить стек и изменить свое изменение (в зависимости от специфики вашего приложения, купить возможно путем перекрашивания в цвет фона?)

Смежные вопросы