2011-05-20 3 views
2

Je travaille sur une simple application de peinture sous forme de fenêtres. J'ai un problème pour effacer le panneau. Le code que j'utilise pour dessiner estcomment effacer le panneau dans une application de peinture simple

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = Graphics.FromImage(tempDraw); 
    Pen myPen = new Pen(foreColor, lineWidth); 
    g.DrawLine(myPen, x1, y1, x2, y2); 
    myPen.Width = 100; 
    myPen.Dispose(); 
    e.Graphics.DrawImageUnscaled(tempDraw, 0, 0); 
    g.Dispose(); 
} 

Comment effacer le panneau?

+0

Le repeindre pour effacer ne fonctionnera pas. S'il vous plaît voir ma réponse éditée ci-dessous. Vous devez ajuster votre approche à comment et quand les choses sont peintes, et pourquoi. Lisez aussi l'événement Control.Paint. Vous verrez qu'il est appelé automatiquement par le système automatiquement. Donc, si vous peignez toujours dans le gestionnaire, quelque chose apparaîtra toujours. Vous devez donner au gestionnaire d'événements Paint l'option de ne rien peindre du tout. –

Répondre

2

dessinent dans le gestionnaire de peinture de l'exemple de panneau? Si non, alors appeler Invalidate sur le panneau ferait l'affaire.

Mais vous allez probablement persister dans les éléments de dessin et, pour les effacer, vous devrez supprimer ce qui a été dessiné, puis appeler Invalider. Vous pouvez également remplir le panneau avec une couleur particulière en utilisant FillRect, mais ce serait une solution de contournement sale et ne correspond pas à votre conception finale.

Vous devriez également consulter CodeProject.com pour les exemples like this one pour vous donner une idée de ce qui doit être géré lors de la création d'une application de dessin comme celle-ci.

EDIT:

par la réponse éditée, vous ne pouvez pas effacer le panneau avec la logique existante. Vous peignez à l'intérieur de Paint handler de la forme qui se produira chaque fois qu'il doit être redessiné. Cela signifie que vous devez changer votre approche. Vous avez besoin d'une sorte de condition à l'intérieur du gestionnaire de Paint qui décide si oui ou non il peindra quoi que ce soit. C'est là qu'intervient la persistance des objets de dessin. Si vous voulez créer un programme de dessin, vous devrez gérer les événements Down, Up et Move de la souris sur les objets du panneau et stocker les données dans un tableau de points. (Comme un exemple d'un type de dessin.) Ensuite, dans votre gestionnaire de Paint si les Points [] ne sont pas vides, vous dessinez les points. Sinon, vous ne dessinez rien ... qui finit dans un conteneur vide. Ensuite, si vous devez effacer le dessin, supprimez le contenu du tableau Points et appelez Invalidate sur le Panel. Cela effacera les données persistantes et repeindre à rien.

0

Vous devrez à nouveau dessiner sur le panneau avec la couleur de base que vous utilisez par exemple. blanc \ gris avec la méthode Graphics.FillRectangle:

// Create solid brush. 
SolidBrush whiteBrush = new SolidBrush(Color.White); 
// Create location and size of rectangle. 
// Fill rectangle to screen. 
e.Graphics.FillRectangle(whiteBrush, panel.Location.X, panel.Location.Y, panel.Width, panel.Height); 
this.Invalidate(); 
+0

Je l'ai rempli avec le rectangle comme vous l'avez mentionné. Cela effacera l'écran, mais si je le dessine à nouveau, il réapparaîtra. – Kanishka

+0

Qu'est-ce qui réapparaîtra? – w69rdy

+0

Les parties supprimées de l'image. J'ai tracé une ligne et l'ai effacée. Lorsque j'ai essayé de dessiner une autre ligne, la ligne précédente a réapparu – Kanishka

2

Vous pouvez utiliser

Panel1.Invalidate(); 

Mais il y a un problème avec cela, après avoir appelé cette fonction, il efface tous les graphiques du panneau, mais il rappelle aussi la fonction-à-dire

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    //This function is recalled after Panel1.Invalidate(); 
} 

Donc, la solution est de faire votre code de peinture dans une autre fonction

private void MyDrawing() 
{ 
    Graphics g = Graphics.FromImage(tempDraw); 
    // if above line doesn't work you can use the following commented line 
    //Graphics g = Graphics.Panel1.CreateGraphics(); 

    Pen myPen = new Pen(foreColor, lineWidth); 
    g.DrawLine(myPen, x1, y1, x2, y2); 
    myPen.Width = 100; 
    myPen.Dispose(); 
    Panel1.Graphics.DrawImageUnscaled(tempDraw, 0, 0); 
    g.Dispose(); 
} 
Questions connexes