webentwicklung-frage-antwort-db.com.de

Zeichnen Sie bei Mausklick ein Rechteck

Kann ich mit mouseClick ein Rechteck zeichnen? Mein Code funktioniert bisher nicht. Kannst du mir helfen?

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

Bearbeitete Version:

Ohne viel Annahmen von dem, was Sie versuchen zu tun:

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();
    }
}

Ihr Code hat nicht funktioniert, da das Rechteck im Fenster gezeichnet wird (dieses Fenster). Das gezeichnete Rechteck wird dann von Ihrem Bedienfeld ausgeblendet.

Allgemein Wenn Sie Paint für einen so einfachen Fall überschreiben, ist das Zeichnen eines Rechtecks ​​auf einem Panel einfach zu aufwendig. Das Zeichnen des Rechtecks ​​auf diese Weise funktioniert jedoch, aber das Rechteck verschwindet, wenn das Formular neu gezeichnet wird (z. B. durch Minimieren und anschließendes erneutes Anzeigen des Formulars. Wenn das Rechteck dauerhaft sein muss, müssen Sie dazu die Paint-Methode verwenden.) muss das Rechteck (zB) im click -Ereignis erstellen und dann im Paint -Ereignis zeichnen (siehe roygbiv s Lösung für einen solchen Ansatz) Hinweis: Wenn Sie die Paint-Methode verwenden Sie sollten es so effizient wie möglich halten, da die Paint-Methode häufig als "sehr" bezeichnet wird.

Bearbeiten 2

Sie müssen den Hintergrund nicht löschen, da Ihr Rechteck immer an derselben Stelle gezeichnet wird. Um das Rechteck an der Stelle zu zeichnen, an der der Benutzer geklickt hat ( es wird davon ausgegangen, dass Sie dies möchten ), sollten Sie den Code zum Mouse-Down-Ereignis verschieben, z. B .:

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

Versuchen Sie diesen Code stattdessen mit einer PictureBox (um Ihnen den Einstieg zu erleichtern - es gibt viele verschiedene Möglichkeiten, dies zu tun):

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();
}

Diese Technik wird Ihre Zeichnung automatisch "beibehalten", was bedeutet, dass sie nicht verschwindet, wenn ein anderes Fenster darüber gezogen wird. Wenn Sie direkt auf ein Steuerelement zeichnen (was Sie mit dem Aufruf CreateGraphics () versuchen möchten), stoßen Sie normalerweise auf das Problem der Nicht-Persistenz.

Update : Hier ist eine weitere Antwort mit einem detaillierteren Beispiel für das Zeichnen als Reaktion darauf, wo die Maus geklickt wird:

Wie zeichnet man Zeichnungen in einer Bildbox

3
MusiGenesis

Kann ich mit mouseClick ein Rechteck zeichnen?

Wenn Sie meinen: "Wenn Sie mit der Maus auf mein Panel klicken, möchte ich ein Rechteck anzeigen", können Sie dies folgendermaßen tun:

        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);
                }
            }
        }

Wenn Sie "Ich möchte die Maus auf mein Panel ziehen, um Rechtecke zu erstellen" meinen, dann müssen Sie etwas mehr Arbeit erledigen.

Sie müssen die Maus nach oben bewegen, nach unten bewegen und nach unten bewegen, um das Delta zwischen dem unteren Mauspunkt und der aktuellen Position zu verfolgen. Zum Schluss würden Sie beim Hochfahren mit der Maus Ihr Rechteck zeichnen. Es wird komplizierter, weil Sie Doppelpufferung oder ein "xor" -Rechteck verwenden müssen, um das "Ziehen" -Rechteck zu zeichnen.

Diese zwei Threads können helfen:

Picturebox zur Laufzeit in Winform ziehen

An Rastern der Maus fangen

1
user113476

Sie sollten es in "Paint" -Ereignis des Steuerelements (in diesem Fall Panel1) zeichnen.

0
TcKs