myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grafik und Sound » Wie kann ich in einer PictureBox die 2te-Nte Linie Zeichnen, ohne dass die erste gelöscht wird?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

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

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 55


Rico913 ist offline

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

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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:

C#-Code:
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;
        }

C#-Code:
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 09.07.2020 12:33.

09.07.2020 12:31 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
JimStark
myCSharp.de-Mitglied

avatar-1005.jpg


Dabei seit: 10.03.2020
Beiträge: 73
Entwicklungsumgebung: Visual Studio 6.0 Enterprise


JimStark ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 09.07.2020 12:46.

09.07.2020 12:43 Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 55

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke ....konnte das "Egal" auch nicht richtig deuten großes Grinsen
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 ;-)
09.07.2020 13:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.672
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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).
09.07.2020 14:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rico913
myCSharp.de-Mitglied

Dabei seit: 29.04.2020
Beiträge: 55

Themenstarter Thema begonnen von Rico913

Rico913 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für die Hinweise Daumen hoch

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.
10.07.2020 12:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.418
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
10.07.2020 17:31 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 09.08.2020 18:50