Effacer une Rectangle dessiné avec DrawRectangle() [Résolu]

cAlebcore 3 Messages postés mercredi 3 décembre 2003Date d'inscription 30 avril 2008 Dernière intervention - 29 avril 2008 à 10:26 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 1 mai 2008 à 01:03
Salut

Ca fait au moins une bonne heure que je cherche la solution à mon problème, et à mon avis ça doit être très simple:

J'ai une PictureBox sur laquelle l'utilisateur peut dessiner un rectangle. J'utilise DrawRectangle() et les quatres coordonnées (X, Y, Width, Height) viennent de 4 NumericUpDown. Dès que l'utilisateur modifie un de ces quatre NumericUpDown, j'appelle la fonction qui dessine mon rectangle:

private
void RefreshRect(){

Pen pPen =
new
Pen(
Color.Red, 1);picVideoPreview.CreateGraphics().DrawRectangle(pPen, X, Y, cWidth, cHeight);

pPen.Dispose();

}

Tout fonctionne bien, sauf que seulement, lors ce qu'on dessine le deuxième triangle, le premier est toujours là et je voudrais qu'il disparaisse... Vous voyez ce que je veux dire?
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 30 avril 2008 à 00:16
2
Merci
Salut, non sérieusement Disposer la PictureBox juste avant de dessiner dessus c'est n'importe quoi.. Dispose ça revient quasiment à supprimer la PictureBox de la mémoire. Suffit juste d'invalider la zone à redessiner :

public Form1( )
{
    InitializeComponent( );


    PictureBox pb = new PictureBox( );
    pb.Parent = this;
    pb.Dock = DockStyle.Fill;
    //pb.Image = this.Icon.ToBitmap( ); // pour l'exemple.
    //pb.SizeMode = PictureBoxSizeMode.StretchImage;


    Button b1 = new Button( );
    b1.Parent = this;
    b1.Text = "Draw";
    b1.Dock = DockStyle.Bottom;
    b1.Click += delegate
    {
        using ( Graphics g = pb.CreateGraphics( ) )
        {
            g.DrawRectangle( Pens.Red, 10, 10, 50, 50 );
        }
    };


    Button b2 = new Button( );
    b2.Parent = this;
    b2.Text = "Erase";
    b2.Dock = DockStyle.Bottom;
    b2.Click += delegate
    {
        pb.Invalidate( pb.ClientRectangle ); // ou un rectangle plus petit.
        pb.Update( );
    };
}

Merci Lutinore 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Lutinore
Liverion 296 Messages postés mardi 22 avril 2008Date d'inscription 18 août 2008 Dernière intervention - 29 avril 2008 à 13:42
0
Merci
Tu as essayé en faisant un Dispose de ta pictureBox avant de tracer le nouveau rectangle ? (enfin je connais pas trop les pictures box et j'essaie de voir avec l'interface de VS2005 version allemande  :P  )
Commenter la réponse de Liverion
cAlebcore 3 Messages postés mercredi 3 décembre 2003Date d'inscription 30 avril 2008 Dernière intervention - 29 avril 2008 à 15:49
0
Merci
Ach, es geht nicht!

J'ai essayé de mettre un picVideoPreview.Dispose() juste avant de faire mon rectangle, mais j'ai une exception:

L'exception System.ObjectDisposedException n'a pas été gérée
  Message="Impossible d'accéder à un objet supprimé.\r\nNom de l'objet : 'PictureBox'."

Faut dire que là je nage un peu, je vois pas le rapport... Néanmoins, j'ai essayé avant chaque dessins de rectangles de recharger mon image dans ma PictureBox puis de faire un DoEvents(). Ca marche à moitier, car dès que je clique plusieurs fois de suite rapidement sur mes NumericUpDown (ceux qui dessinent le rectangle, donc) j'ai une exception. (NullReferenceException sur la ligne Application.DoEvents()).

Une autre idée?
Commenter la réponse de cAlebcore
cAlebcore 3 Messages postés mercredi 3 décembre 2003Date d'inscription 30 avril 2008 Dernière intervention - 30 avril 2008 à 05:31
0
Merci
Magnifique ça marche parfaitement. Merci beaucoup!

Je met mon code final au cas oú ça intéresserait quelqu'un:

private
void RefreshRect(){

X = System.

Convert.ToInt64(numX.Value);Y = System.

Convert.ToInt64(numY.Value);cWidth = System.

Convert.ToInt64(numWidth.Value);cHeight = System.

Convert.ToInt64(numHeight.Value);

Pen pPen =
new
Pen(
Color.Red, 1);picVideoPreview.Invalidate(picVideoPreview.ClientRectangle);

picVideoPreview.Update();

picVideoPreview.CreateGraphics().DrawRectangle(pPen, X, Y, cWidth, cHeight);

pPen.Dispose();

}
Commenter la réponse de cAlebcore
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 1 mai 2008 à 01:03
0
Merci
Salut,

Sinon pour un rectangle de ce genre les fonctionnalités exposées par ControlPaint sont peut être à envisager.

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.