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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    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
    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
    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
    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 très actif
    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
    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 émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    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
    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 émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    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 très actif
    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
    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 émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    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);
        }

+ 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