2010-05-27 3 views
3

Je suis en train de faire un éditeur d'image pour mon propre plaisir et je me demandais comment faire un bouton Annuler pour défaire les dernières peintures que j'ai faites? Je veux savoir comment je voudrais à ce sujet, un tutoriel ou un exemple de code serait gentil ou au moins quelque chose me pointant dans la bonne direction.Bouton Annuler pour System.Drawing?

Merci!

+0

Comment définiriez-vous « dernier » la peinture? Dites que je dessine une ligne en faisant glisser la brosse. Est-ce que c'est une peinture ou plusieurs? Si vous cherchez une classe .NET qui fera cela pour vous, vous pourriez être hors de la chance. –

+0

Ce serait une peinture. Je ne cherche pas vraiment un cours. – Tanner

Répondre

3

undo heh dans vraiment non que dur comme ça sonne. La magie ici que vous devez enregistrer chaque action comme objet qui est peint dans une liste ou une file d'attente, f.ex, l'utilisateur trace une ligne, de sorte que votre enregistrement pourrait ressembler à x, y de poing start, et x, y de point final ou objet lui-même qui ont la méthode Draw(), donc ce que l'annulation fera suffit de supprimer cet objet.

dans le code qui pourrait ressembler à ceci:

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

Les objets de commande sont utiles pour mise en œuvre:

multi-niveau undo Si toutes les actions de l'utilisateur dans un programme sont mis en œuvre sous forme d'objets de commande, le programme peut garder une pile de dernières commandes exécutées. Lorsque l'utilisateur souhaite annuler une commande, le programme affiche simplement l'objet de commande le plus récent et exécute sa méthode undo() .

Edit: Pour mettre en perspective comment cela pourrait être utile si j'allais résoudre ce que je ferais est enregistrer chaque « action » l'utilisateur ne aime dessiner une ligne etc comme une commande et stocker tous les informations associes sur l'accomplissement de cette action dans cette commande avant de l'appliquer au contexte du dessin. Par conséquent, chaque action est poussée sur une pile de sorte que vous pouvez ensuite faire défiler les éléments.

Pour faciliter la vitesse je voudrais aussi probablement regarder quelque chose comme l'enregistrement de l'état de l'objet de dessin pour une série d'actions. Puisque c'est le contexte du dessin, il serait probablement plus facile de partir d'un état de dessin connu et de réappliquer des commandes pour créer la version actuelle. Par exemple, j'aurais une pile de commandes en cours d'exécution et une pile d'objets de dessin en cours d'exécution. Chaque 5 commandes je pousse l'état de l'objet dessin sur sa pile, alors quand un utilisateur appuie sur Annuler, j'attrape l'état supérieur de l'objet dessin et j'applique les nouvelles commandes à l'objet sauf le dernier. Pour annuler 10 actions, je reviendrai à 2 états d'objets dessinés et je n'aurai pas besoin d'y appliquer de nouvelles commandes.

Vous voudrez probablement limiter la profondeur des états d'annulation/rétablissement que vous pouvez faire dans votre programme, sinon il augmentera infiniment en mémoire.

+1

chaque fois que la question sur l'annulation est posée, je vois ce lien. Mais c'est 1/4 de solution. autre 3/4 est comment suivre ** l'état ** de l'application et comment le restaurer. (et le faire efficacement!) – Andrey

+0

@Andrey logiciel d'écriture n'est pas facile c'est pourquoi nous avons tous des emplois, des modèles logiciels ont été créés pour fournir une solution reproductible à un problème, il est le rôle d'un développeur de logiciels pour être en mesure de mettre en répondre à leurs besoins spécifiques. Cependant, je vais modifier ma réponse pour ajouter d'autres directives. –

1

Une méthode de base consiste à conserver une pile qui tiendra chaque nouveau coup de pinceau que vous faites.

que vous appuyez sur le bouton Annuler, pop la pile et inverser votre changement (En fonction des spécificités de votre application, peut-être acheter par repeindre dans la couleur d'arrière-plan?)

Questions connexes