web-dev-qa-db-fra.com

Dessine un rectangle en un clic de souris

Puis-je dessiner un rectangle avec un clic de souris? Mon code ne fonctionne pas jusqu'à présent. Pouvez-vous m'aider?

private void panel1_MouseClick(object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen pen = new Pen(Color.Black, 2);

    g.DrawRectangle(pen, 100,100, 100, 200);
}
10
Dinu

Version éditée:

Sans supposer grand-chose de ce que vous essayez de faire:

private void panel1_Click(object sender, EventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackgroundColor);

        g.DrawRectangle(pen, 100,100, 100, 200);

        pen.Dispose();
    }
}

Votre code ne fonctionnait pas car il dessinait le rectangle sur la fenêtre (celle-ci) et le rectangle dessiné était alors masqué par votre panneau.

Généralement Remplacer Paint pour un cas aussi simple demande trop d'efforts pour dessiner un rectangle sur un panneau. Cependant, dessiner le rectangle de cette manière fonctionne, mais le rectangle disparaîtra lorsque le formulaire sera redessiné (par exemple, en le minimisant et en le montrant à nouveau. Si le rectangle doit être persistant, vous devrez utiliser la méthode Paint. Par exemple, créez le rectangle dans l'événement click, puis dessinez-le dans l'événement Paint (voir la solution de roygbiv pour une telle approche). Remarque: Si vous vous conformez à la méthode Paint , vous devriez le garder aussi efficace que possible, car la méthode Paint est appelée très souvent.

Modifier 2

Vous n'avez pas besoin d'effacer l'arrière-plan, car votre rectangle sera toujours tracé au même endroit. Pour tracer le rectangle à l'endroit où l'utilisateur a cliqué ( c'est une supposition que c'est ce que vous voulez ), vous devez déplacer le code vers l'événement de souris enfoncé, par exemple:

private void panel1_MouseDown(object sender, MouseEventArgs e) {
    using (Graphics g = this.panel1.CreateGraphics()) {
        Pen pen = new Pen(Color.Black, 2);
        Brush brush = new SolidBrush(this.panel1.BackColor);

        g.FillRectangle(brush, this.panel1.Bounds);  // redraws background
        g.DrawRectangle(pen, e.X, e.Y, 20, 20);

        pen.Dispose();
        brush.Dispose();
    }
}
11
AxelEckenberger

Essayez ce code avec une PictureBox à la place (juste pour commencer - il y a plusieurs façons de le faire):

private void pictureBox1_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image == null)
    {
            pictureBox1.Image = new Bitmap(pictureBox1.width, 
                    pictureBox1.height);
    }
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        // draw black background
        g.Clear(Color.Black);
        Rectangle rect = new Rectangle(100, 100, 200, 200);
        g.DrawRectangle(Pens.Red, rect);
    }
    pictureBox1.Invalidate();
}

Cette technique "persistera" automatiquement votre dessin, ce qui signifie qu'il ne disparaîtra pas si une autre fenêtre est déplacée. Lorsque vous dessinez directement sur un contrôle (ce que vous essayez de faire avec l'appel de CreateGraphics ()), vous rencontrez généralement le problème de la non-persistance.

Update : voici une autre réponse avec un exemple plus détaillé de dessin de quelque chose en réponse à l'endroit où la souris est cliquée:

comment dessiner des dessins dans une boîte d'image

3
MusiGenesis

Puis-je dessiner un rectangle avec mouseClick?

Si vous voulez dire "Lorsque la souris est cliquée sur mon panneau, je veux afficher un rectangle", vous pouvez le faire comme ceci:

        private bool displayRectangle = false;

        private void panel1_MouseClick(object sender, MouseEventArgs e)
        {
            displayRectangle = true;
            panel1.Invalidate(false);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (displayRectangle)
            {
                using (Pen p = new Pen(Color.Black, 2))
                {
                    e.Graphics.DrawRectangle(p, 100, 100, 100, 200);
                }
            }
        }

Si vous voulez dire "Je veux faire glisser la souris sur mon panneau pour créer des rectangles", vous avez un peu plus de travail à faire.

Vous devez gérer les événements de déplacement, de déplacement et d'abaissement de la souris en suivant le delta entre le point bas de la souris et la position actuelle. Enfin, avec votre souris, vous dessineriez votre rectangle. Cela devient plus compliqué parce que vous devez utiliser un double tampon ou un rectangle «xor» pour dessiner le rectangle «glisser».

Ces deux discussions peuvent aider:

faire glisser picturebox dans winform au moment de l'exécution

Accrochage du verrouillage de la souris

1
user113476

Vous devez le dessiner dans l'événement "Paint" du contrôle (panel1 dans ce cas).

0
TcKs