Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

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



Dabei seit:
Beiträge: 93

Themenstarter:

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

beantworten | zitieren | melden

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);
             }
          }
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Rico913 am .
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 307

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von JimStark am .
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 93

Themenstarter:

beantworten | zitieren | melden

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 ;-)
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.432

beantworten | zitieren | melden

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).
private Nachricht | Beiträge des Benutzers
Rico913
myCSharp.de - Member



Dabei seit:
Beiträge: 93

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers