Laden...

Wie kann ich in einer PictureBox die 2te-Nte Linie Zeichnen, ohne dass die erste gelöscht wird?

Erstellt von Rico913 vor 3 Jahren Letzter Beitrag vor 3 Jahren 2.056 Views
R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren
Wie kann ich in einer PictureBox die 2te-Nte Linie Zeichnen, ohne dass die erste gelöscht wird?

Komm mal wieder nicht weiter 😦

Ich habe ein Bild in einer PictureBox, welches ich bemaßen möchte. Dazu soll der Nutzer die Start- und Endpunkte per Mausklick markieren und das Maß wird gesetzt (Linie gezeichnet)
Für eine Linie funktioniert das auch wunder bar, aber wenn ich die nächste zeichne, wird die vorhergehende gelöscht.
Wie kann ich das realisieren? Im Netz wird leider immer nur eine Linie behandelt 😦
Mein Code bisher:

User startet Messung mit Button:


private void button2_Click(object sender, EventArgs e)
        {
            Check_MessenEnde = false;
            pictureBox1.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
            pictureBox1.Paint += new PaintEventHandler(panel1_draw);
            pictureBox1.Refresh();
            Click_First = true;
        }


private void panel1_draw(object sender, PaintEventArgs e)
        {
                Pen pen = new Pen(Color.Green, 1);
                pen.StartCap = LineCap.SquareAnchor;
                pen.EndCap = LineCap.RoundAnchor;
                e.Graphics.DrawLine(pen, MousePosition_Start_X_picBox, MousePosition_Start_Y_picBox, MousePosition_Ende_X_picBox, MousePosition_Start_Y_picBox);
                int current_Row = dGV_ImageList.CurrentCell.RowIndex;
                var text = dGV_ImageList.Rows[current_Row].Cells[7].Value;
                double Laenge = (Convert.ToDouble(MousePosition_Ende_X) - Convert.ToDouble(MousePosition_Start_X)) * Convert.ToDouble(text);
                e.Graphics.DrawString(Laenge.ToString(), Font, Brushes.Black, new Point(14, 5));
         
        }

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {

            if (Click_First == true)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                MousePosition_Start_X_picBox = e.X;
                MousePosition_Start_Y_picBox = e.Y;
                MousePosition_Start_X = (b.Width * e.X / pictureBox1.Width);
                MousePosition_Start_Y = (b.Height * e.Y / pictureBox1.Height);
                label8.Text = "StartX:  " + MousePosition_Start_X;
                label7.Text = "StartY:  " + MousePosition_Start_Y;
                Click_First = false;
                label3.Text = Click_First.ToString();
            }
            else if (Click_First == false)
            {
                Bitmap b = new Bitmap(pictureBox1.Image);
                MousePosition_Ende_X_picBox = e.X;
                MousePosition_Ende_Y_picBox = e.Y;
                MousePosition_Ende_X = (b.Width * e.X / pictureBox1.Width);
                MousePosition_Ende_Y = (b.Height * e.Y / pictureBox1.Height);
                label6.Text = "Ende_X:  " + MousePosition_Ende_X;
                label5.Text = "Ende_Y:  " + MousePosition_Ende_Y;
                Click_First = true;
                pictureBox1.Refresh();
                label3.Text = Click_First.ToString();
            }
            
            if (e.Button == MouseButtons.Right)
            {
             Check_MessenEnde = true;
             pictureBox1.MouseDown -= new MouseEventHandler(pictureBox1_MouseDown);
             }
          }

309 Beiträge seit 2020
vor 3 Jahren

sorry hab falsch gedacht,

ich glaube die Grafiken werden jedesmal neu gezeichnet,
es gibt immer nur die eine Linie, siehst du ja im Code, das müsstest du ändern, dass die Pfade gespeichert werden, in einer Liste, etc.

R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

Danke ....konnte das "Egal" auch nicht richtig deuten 😁
Also ungefähr so:

Speicher Click1 + Click2 in Liste, Zeige an, Speicher Click3+Click4 in Liste, Zeige Linie1 + Linie2 .....

Das ist ein guter Ansatz, da ich den Vorteil habe, die Maße direkt in einer Liste auszugeben und dem User die Möglichkeit geben kann, diese anzuzeigen.
Es sei denn es geht noch einfacher auf die Schnelle 😉

4.931 Beiträge seit 2008
vor 3 Jahren

Da ist aber einiges am Code noch optimierbar:

  • Du solltest nicht jedesmal beim Button-Click die Ereignishandler registrieren (ansonsten sind diese mehrfach registriert und werden dann jedesmal x-fach ausgeführt).
  • Warum erzeugst du in der MouseDown-Methode jedesmal eine neue Bitmap? Auf die Eigenschaften kannst du auch direkt über die Image-Klasse zugreifen.
  • Deine Controls solltest du besser benennen (anstatt nur labelX).
R
Rico913 Themenstarter:in
95 Beiträge seit 2020
vor 3 Jahren

Danke für die Hinweise 👍

Die Labels sind für mich nur Dummy-Anzeiger zur Kontrolle, ob die Funktion das tut, was sie soll. Die fallen am Ende weg und ich benutze sie für jede Problemstellung wieder neu.

5.657 Beiträge seit 2006
vor 3 Jahren

Hier gibt es eine ausführliche Anleitung: [Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

Du solltest auch darauf achten, Resourcen wie Pens und Bitmaps wieder freizugegeben. Sonst bekommst du irgendwann eine OutOfMemoryException.

Weeks of programming can save you hours of planning