IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Dessiner une rectangle sur un picBox


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut Dessiner une rectangle sur un picBox
    Bonjour,
    je cherche le moyen de dessiner un rectangle ou ellipse sur une pictureBox mais je n'obtiens qu'une succession de rectangles.
    Le rectangle ou ellipse dessiner doit en suite faire partie de l'image de la Pictubox.
    Voici comment j'ai fais, ça fonctionne mais j'ai plusieurs rectangles qui se superposent.
    Merci pour votre aide!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            private void picture_MouseMove(object sender, MouseEventArgs e)
            {
                if (mouseDown)
                {    
                    size = new Size(e.X - startPoint.X, e.Y - startPoint.Y);
                    this.Invalidate(); 
                    gr = Graphics.FromImage(Pic1Resize); //Bitmap "Pic1Resize"
                    gr.DrawRectangle(p, new System.Drawing.Rectangle(startPoint, size));
                }
    }
            private void picture_MouseDown(object sender, MouseEventArgs e)
            {
                mouseDown = true;
                startPoint = new Point(e.X, e.Y);
            }

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    il ne faut pas dessiner ton rectangle sur le mouseMove mais plutot sur le MouseUp puisque c'est à ce moment là que se termine la sélection.

    Il y a une fonction, DrawSelection qui permet de faire ce que je pense tu essayes de faire.

    Si je comprends bien ton problème, tu voudrais selectionner une zone et sur le click up de la souris, dessiner un rectangle ou une ellipse inscrit dans ta selection ?

    Est-ce bien celà que tu veux faire ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    voici un bout de code qui devrait t'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    public partial class ExtPictureBox : PictureBox
        {
            private Rectangle selectedRec = new Rectangle(0, 0, 10, 10);
            private bool drawSelection = false;
     
            public ExtPictureBox()
            {
                InitializeComponent();
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
     
                if (drawSelection)
                {
                    DrawSelection(pe.Graphics);
                }
            }
     
            private void DrawSelection(Graphics graphics)
            {
                //HatchBrush brush = new HatchBrush(HatchStyle.DottedGrid, Color.Black);
                //Pen pen = new Pen(brush);
     
                Rectangle inside = selectedRec;
                inside.Inflate(-5, -5);
                ControlPaint.DrawSelectionFrame(graphics, true, selectedRec, inside, Color.Black);
                Trace.WriteLine(selectedRec.ToString());
                //graphics.DrawRectangle(pen, selectedRec);
                //pen.Dispose();
                //brush.Dispose();
            }
     
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
                if (drawSelection)
                {
                    selectedRec.Width = e.X - selectedRec.X;
                    selectedRec.Height = e.Y - selectedRec.Y;
                    Invalidate();
                }
            }
     
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
                drawSelection = true;
                selectedRec.X = e.X;
                selectedRec.Y = e.Y;
                selectedRec.Width = 0;
                selectedRec.Height = 0;
                Invalidate();
            }
     
            protected override void OnMouseUp(MouseEventArgs e)
            {
                base.OnMouseUp(e);
                if (drawSelection)
                {
                    Graphics g = Graphics.FromImage(this.Image);
                    Pen p = new Pen(Color.Black,2);
                    g.DrawRectangle(p, selectedRec);
                    p.Dispose();
                    g.Dispose();                
                    drawSelection = false;
                    Invalidate();
                }
            }
        }
    Il s'agit d'une petite classe qui autorise la sélection d'une zone dans ton image et qui dessine un rectangle correspondant à la selection.

    Pour une ellipse, il suffit de faire un DrawEllipse() à la place du drawRectangle !!!

    Attention, il faut que tu es une image dans ta pictureBox....

    J'ai crée une UserControl.. et j'hérite de la PictureBox comme tu peux le voir dans le code fourni !!!

    Bon courage !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    Je veux faire la même chose comme dans Paint, c'est à dire dessiner un rectangle qui fera partie de l'image de ma picBox.
    Si je fais ce que tu dis ça fonctionne mais on ne vois pas le rectangle se dessiner.
    Merci pour ta réponse rapide !!

  5. #5
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Tiens, j'avais aussi un petit bout de code pour toi....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
          e.Graphics.DrawRectangle(new Pen(Color.Black, 1f), rect);
        }
     
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
          mouseDown = true;
          startPoint = new Point(e.X, e.Y);
        }
     
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
          if (mouseDown)
          {
            size = new Size(e.X - startPoint.X, e.Y - startPoint.Y);
            pictureBox1.Invalidate();
            rect = new Rectangle(startPoint, size);
          }
        }
     
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          Graphics.FromImage(pictureBox1.Image).DrawRectangle(new Pen(Color.Black, 1f), rect);
          mouseDown = false;
        }

  6. #6
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 194
    Points
    5 194
    Par défaut
    ton code finalement pphil revient au même

    Après, on peut dessiner avec ControlPaint() ou bien dans le OnPaint() la mise à jour du rectangle ou de l'ellipse en cours de dessin

    et dans le MouseUp, intégrer le résultat dans l'image de fond...

    Le principe de toute façon reste le même

  7. #7
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    ton code finalement pphil revient au même
    Absolument ! et ce n'étais pas pour marcher dans tes plate-bandes...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    la méthode de ppphil fonctionne à merveille pour le rectangle mais pas pour l'ellipse malgré mes modifs.
    Pour résumer on dessine une rectangle sur la picBox, puis dans le mousUp on on dessine graphiquement ce rectangle dans l'image.
    En tout merci à tous les deux !!

  9. #9
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par lolo81 Voir le message
    la méthode de ppphil fonctionne à merveille pour le rectangle mais pas pour l'ellipse malgré mes modifs.
    Si avec ça ça ne fonctionne pas, dessine l'ellipse avec un marker sur l'écran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
          e.Graphics.DrawEllipse(new Pen(Color.Black, 1f), rect);
        }

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e.Graphics.DrawEllipse(new Pen(Color.Red, 2f), rect);
    ne m'affiche une ellipse que si un rectangle est préalablement dessiné ??
    Dans le paint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private void picture_Paint(object sender, PaintEventArgs e)
            {
                if ((mouseDown == true)&&(ComboOutil.SelectedText=="Rectangle"))
                {
                  e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), rect);
                }
     
                else  if ((mouseDown == true)&&(ComboOutil.SelectedText=="Ellipse"))
                {
                    e.Graphics.DrawEllipse(new Pen(Color.Red, 2f), rect);
     
                }
    et dans le MouseMove
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                         if ((mouseDown) && (ComboOutil.SelectedText == "Rectangle"))
                          {
                              size = new Size(e.X - startPoint.X, e.Y - startPoint.Y);
                              picture.Invalidate();
                              rect = new System.Drawing.Rectangle(startPoint, size);
                          }
                         else if ((mouseDown) && (ComboOutil.SelectedText == "Ellipse"))
                          {
                              size = new Size(e.X - startPoint.X, e.Y - startPoint.Y);
                              picture.Invalidate();  
                              gr = Graphics.FromImage(Pic1Resize);
                              gr.DrawEllipse(new Pen(Color.Red, 2f), rect);
                         }

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    On y est presque !!!

    l'Ellispe se forme au mouseUp mais pas dans le Paint. ??
    si je remplace "cercle" par " Rec" c'est l'inverse !!??
    j'ai rajouté un label pour m'informé de ComboOutil , le résultat est bon, ne peut on pas mettre plusieur graphique dans Paint?


    Le paint:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
            private void picture_Paint(object sender, PaintEventArgs e)
            {
     
                if ((mouseDown==true)&&(ComboOutil.SelectedText == "cercle"))
                {
                    e.Graphics.DrawEllipse(new Pen(Color.Red, 2f), startPoint.X, startPoint.Y, Wl, Wh);
     
                }
                if ((mouseDown==true)&&(ComboOutil.SelectedText == "Rec"))
                {
                    e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), rect);
                }
                label2.Text = ComboOutil.SelectedText;
            }
                }
    le MouseMove
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            {
     
                if (Pic1Resize != null)
                {
                    if((mouseDown==true)&&(ComboOutil.SelectedText == "Rec"))
                    {
                        Graphics.FromImage(Pic1Resize).DrawRectangle(new Pen(Color.Red, 2f), rect);
                        mouseDown = false;
                        picture.Refresh();
                    }
                   if ((mouseDown==true)&&(ComboOutil.SelectedText == "cercle"))
                    {
                       gr = Graphics.FromImage(Pic1Resize);
                      gr.DrawEllipse(new Pen(Color.Red, 2f), startPoint.X, startPoint.Y, Wl, Wh);
                      mouseDown = false;
                      picture.Refresh();
                    }
                }
           }

    le mouseUp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            {
     
                if (Pic1Resize != null)
                {
                    if((mouseDown==true)&&(ComboOutil.SelectedText == "Rec"))
                    {
                        Graphics.FromImage(Pic1Resize).DrawRectangle(new Pen(Color.Red, 2f), rect);
                        mouseDown = false;
                        picture.Refresh();
                    }
                   if ((mouseDown==true)&&(ComboOutil.SelectedText == "cercle"))
                    {
                       gr = Graphics.FromImage(Pic1Resize);
                      gr.DrawEllipse(new Pen(Color.Red, 2f), startPoint.X, startPoint.Y, Wl, Wh);
                      mouseDown = false;
                      picture.Refresh();
                    }
                }
           }

  12. #12
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Tu ne modifie que dans le Paint si tu as un rectangle ou une ellipse
    Le deuxième paramètre est dans les deux cas un rectangle...
    Ailleurs tu ne touches à rien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
          if(ComboOutil.SelectedText == "cercle")
          { 
            e.Graphics.DrawEllipse(new Pen(Color.Black, 1f), rect);
          }
          else
          {
            e.Graphics.DrawRectangle(new Pen(Color.Black, 1f), rect);
          } 
        }

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par ppphil Voir le message
    Tu ne modifie que dans le Paint
    J'ai testé aussi sans succès, on ne peut mettre qu'un seul e.Graphics si non le deuxième n'est pas pris en compte.
    Si le premier est DrawRectancle ce sera un rectangle, et si c'est DrawEllipse se sera une ellipse.
    Même sans mettre de condition If et else c'est pareil.
    J'ai créer un nouveau projet avec seulement une picBox et un combo, le problème est identique.

  14. #14
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Je ne sais pas ce que tu bricoles....
    Utilise ce code et uniquement celui-ci dans un nouveau projet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
          if (checkBox1.Checked)
          {
            e.Graphics.DrawEllipse(new Pen(Color.Black, 1f), rect);
          }
          else
          {
            e.Graphics.DrawRectangle(new Pen(Color.Black, 1f), rect);
          } 
        }
     
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
          mouseDown = true;
          startPoint = new Point(e.X, e.Y);
        }
     
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
          if (mouseDown)
          {
            size = new Size(e.X - startPoint.X, e.Y - startPoint.Y);
            pictureBox1.Invalidate();
            rect = new Rectangle(startPoint, size);
          }
        }
     
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
          Graphics graph;
     
          graph = Graphics.FromImage(pictureBox1.Image);
          graph.DrawRectangle(new Pen(Color.Black, 1f), rect);
     
          mouseDown = false;
        }
    En mettant un picturebox et un checkbox dans ta form...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut

    Bonjour,
    j'y ai bossé tard hier soir sans trouver la source du problème, ce matin sans rien faire ça fonctionne????
    La seule modif entre hier soir et ce matin est : reboot du PC
    Vu le temps que j'y ai passé pour y arriver (4 jours entiers), je voudrai comprendre d'où vient l'erreur.

    Question: est il possible de beuguer VisualStudio(2005) à force de faire des test de fonctions?
    Dans VisualStudio si on clique sur Générer la solution,Régénérer la solution puis sur Nettoyer la solution on ne remet pas tout en phase?

    Merci pour ta patience envers un débutant comme moi!!

  16. #16
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par lolo81 Voir le message
    Question: est il possible de beuguer VisualStudio(2005) à force de faire des test de fonctions?
    Dans VisualStudio si on clique sur Générer la solution,Régénérer la solution puis sur Nettoyer la solution on ne remet pas tout en phase?
    J'ai déjà eu affaire à des comportements bizarres. Quant à répondre avec précision à la question....
    Citation Envoyé par lolo81 Voir le message
    Merci pour ta patience envers un débutant comme moi!!
    C'était un plaisir !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. dessiner un rectangle sur une video
    Par titou08 dans le forum Images
    Réponses: 5
    Dernier message: 02/06/2011, 02h43
  2. Dessiner un rectangle sur une plage de cellules donnée
    Par artisous43 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/09/2010, 20h06
  3. Dessiner un rectangle sur une image
    Par pika84 dans le forum 2D
    Réponses: 5
    Dernier message: 11/06/2007, 21h45
  4. [Image]Dessiner des rectangles sur une image
    Par navona dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 09/03/2006, 22h51
  5. Dessiner un rectangle sur une forme
    Par Neo41 dans le forum MFC
    Réponses: 6
    Dernier message: 13/08/2005, 01h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo