Laden...

Einfaches Zeichenprogramm - Linie zieht nach

Erstellt von dunkelziffer vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.740 Views
D
dunkelziffer Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren
Einfaches Zeichenprogramm - Linie zieht nach

Hallo Leute!

Bin neu in dem Forum, also erst mal viele Grüße an alle! 🙂

Also, mein Problem ist Folgendes: Ich versuche mich ein wenig in C# und möchte (als Testlauf zu einem größeren Programm) ein einfaches Zeichenprogramm schreiben. Es soll Polygone zeichnen. Die Eckpunkte bestimmt man durch Mausklick. Dabei werden die ausgewählten Punkte jeweils als blaue Vorschaupunkte angezeigt, zudem soll eine rote "Vorschaulinie" vom letzten Punkt des Polygons zur aktuelle Mausposition gezogen werden (wie man das halt von Zeichenprogramm so kennt). aktionen ist eine BMP, auf die die Vorschaubilder gezeichnet werden, aktionenPB die PictureBox, die die Vorschaubilder darstellen soll.


   private void aktionenPB_MouseMove(object sender, MouseEventArgs e)
        {
            
            aktionen.Dispose(); // Altes "Vorschaubild" löschen
            aktionen = new Bitmap(aktionenPB.Width, aktionenPB.Height); // Neues Vorschaubild erstellen
            g_aktionen = Graphics.FromImage(aktionen);

            if (polygon_punkte.Count > 0)
            {
              // Hier werden Linien und Punkte auf aktionen gezeichnet mit DrawLine und FillEllipse
                zeichneAllePunkte(polygon_punkte.ToArray(), g_aktionen);
                zeicheLinieZumNeuenPunkt(polygon_punkte.Last(), g_aktionen, e);
            }

            aktionenPB.Image = aktionen; // Vorschaubild darstellen

        }

Die Zeichenvorgänge sind mit den dafür vorgesehenen Methoden des Graphics-Objekts gemacht (FillEllipse für die Punkte und DrawLine für die Vorschaulinie). Mein Problem: Wenn man die Maus schnell über das Fenster zieht, "hängt die Linie etwas nach", das eine Ende der Linie beginnt also nicht am Cursor, sondern etwas daneben.

Woran liegt das und gibt es eine Möglichkeit, das Problem zu beheben?

LG, dunkelziffer

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo dunkelziffer,

willkommen bei myCSharp.de

Was das Zeichnen in WinForms angeht ist das so einen Sache wo man viel falsch bzw. nicht richtig machen kann.
Damit geht dann die Performance in den Keller.

Guck dir mal dieses Tutorial an: [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen
Und speziell diesen Artikel: [Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox)

Dort findest du viele Tipps und Tricks wie du es schneller bekommst.

Gruß
Michael

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo und auch beste Grüße,

das liegt daran dass zu aufwändige Operationen im Mouse-Move-Handler erledigt werden. Das Programm kommt einfach nicht nach.

Ich würde daher einfach in einem Panel zeichnen (im Paint-Ereignis) ohne dabei jedesmal einen Bitmap erstellen zu müssen. Das Erstellen der Bitmap ist nich nur aufwändig, sondern es werden auch sehr viele (bei jeder Mausbewegung eines) erstellt und somit ist auch für GarbageCollector viel zu tun - das ist alles nicht nötig. Erst wenn die Zeichnung gespeichert werden soll erstell 1x das Bitmap und schreib den Inhalt rein.

Sont/zusätzlich siehe auch [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen (hat auch michlG schon genannt 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
dunkelziffer Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

Besten Dank für die Antworten! Bin gerade dabei, mich in die Tuts einzulesen. Sehr aufschlussreich! LG, dunkelziffer 👍