[C#] Draw "speichern"

DexXxtrin

Erfahrenes Mitglied
Hallo zusammen
Ich habe ein Problem mit der Draw-Funktion. Und zwar zeichne ich einen Graphen auf aus Messwerten, welche vorzu eingelesen werden.
Nun möchte ich zwischen zwei Graphen wechseln können. Das Problem ist jetzt, dass wenn ich die Ansicht wechsle, alles was gezeichnet wurde gelöst ist.
Kann man da etwas machen?

Gruss DexXxtrin

Erklärung:
Aktuelle Ansicht: Graph 1
Wechsle Ansicht zu Graph 2 (Visible = true bzw. false) => dieser Zeichnet erst ab jetzt auf
Wechsle wieder zu Graph 1 => die aufgezeichneten Werte sind weg und er zeichnet wieder erst ab jetzt.
 
in ein Bitmap zeichnen
C#:
Bitmap bmp=new Bitmap(100, 100);
using(Graphics g = Graphics.FromImage(bmp))
{
   //tu was
}
 
Zuletzt bearbeitet von einem Moderator:
Wie und wann zeichnest du denn? Wenn du im Paint-Event des entsprechenden Controls zeichnest wird das Bild bei Bedarf immer wieder neu gezeichnet.
 
Hallo,

du musst zu jeder Ansicht die zugrundeliegenden Messdaten speichern, um die Ansicht daraus wiederherstellen zu können.
Die Ansicht selbst zu speichern halte ich für schlechtes Programmdesign.

Gruß
MCoder
 
Dieser Code wird bei jedem erfassten Messwert aufgerufen:

C#:
        private void panelX_Paint(object sender, PaintEventArgs e)
        {
            Graphics GraphicsX = panelX.CreateGraphics();
            if (start)
            {
                if (erase)
                {
                    GraphicsX.DrawLine(delete, 0, 125, 950, 125);
                }
                GraphicsX.DrawLine(mainblack, 30, 150, 950, 150);
                for (int i = 50; i < 250; i = i + 40)
                {
                    GraphicsX.DrawLine(black, 30, i, 950, i);
                    GraphicsX.DrawLine(helpblack, 30, i + 20, 950, i + 20);
                }
            }
            if (BtnStart && !erase)
            {
                float pointX = (float)x1;
                GraphicsX.DrawLine(red, pointX, (float)point[0, (int)pointX], pointX + 1, (float)point[0, (int)pointX + 1]);
            }
        }

Ich möchte, dass ich die Fenster switchen kann und es im "Hintergrund" immer noch weiter zeichnet... (Show() & Hide() beim switch)
 
Zuletzt bearbeitet von einem Moderator:
Hallo DexXxtrin,

bitte nicht CreateGraphics() verwenden! Das Graphics-Objekt bekommst du von den PaintEventArgs!

Im Paint-Handler muss immer der Inhalt des kompletten Fensters gezeichnet werden. So wie es aussieht, zeichnest du immer nur die Grafik für einen einzelnen Messwert. Nachdem das Fenster aber mal verdeckt oder unsichtbar war, muss ein Teil oder das komplette Fenster neu gezeichnet werden. Das passiert in der Paint-Routine, die also alles "wissen" muss.
Du könntest alle ankommenden Messwerte in einer dynamischen Liste speichern und in der Paint-Routine dann diese Liste verarbeiten.

Gruß
MCoder
 
Also dass ich dich richtig verstanden habe:
Ich soll nicht jedes mal einfach den neuen Messwert dazu zeichnen, sondern immer wieder das Ganze!?

Zu nicht CreateGraphics() verwenden...:
Wie soll ich es dann machen bzw. wie spreche ich das Graphics-Objekt an?

****Edit****
Ich habe jetzt mal so gemacht, dass die Messwerte alle in einem Array sind und ich den Graph immer neu zeichne. Allerdings führt dies gegen Ende zu einer sehr grossen verzögerung... (sind momentan 950 Werte, werden noch mehr)
 
Zuletzt bearbeitet:
Ich soll nicht jedes mal einfach den neuen Messwert dazu zeichnen, sondern immer wieder das Ganze!?
Korrekt.
Alles was du mit dem Graphics-Objekt zeichnest wird nicht gespeichert. Versuch mal dein Programm laufen zu lassen und dann zum Beispiel das Fenster vom Windows-Explorer darüber zu schieben und wieder weg zu schieben. Du wirst sehen dass dein künstlerisches Meisterwerk zerstört worden ist, du hast es sozusagen "weggewischt". Deswegen musst du immer alles neu zeichnen.

Du könntest natürlich alles in einer Bitmap zwischenspeichern, in welche du nur die Veränderungen reinmalst und diese dann bei jedem Paint-Ereignis lädst, also sozusagen "abmalst". Weiß aber nicht ob das unbedingt schneller ist. Du kannst sonst auch mal mit "OptimizedDoubleBuffer" herumspielen:
Code:
DeinePictureBox.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)

Was MCoder meinte:
Code:
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles PictureBox1.Paint
        Dim g As Graphics = e.Graphics
    End Sub

Ok das war jetzt VB-Code aber ich denke du wirst es nach C# übersetzen können.
 
Zuletzt bearbeitet:
A Allerdings führt dies gegen Ende zu einer sehr grossen verzögerung... (sind momentan 950 Werte, werden noch mehr)
Hmm, macht das überhaupt Sinn, alle Werte in einer Ansicht darzustellen? Das lässt sich doch grafisch kaum noch vernünftig auflösen. Ich würde dir empfehlen, statt DrawLine() die Methode DrawLines() zu verwenden. Der übergibst du ein Array mit allen Positionen, die dann in einem Rutsch gezeichnet werden. Das sollte schneller gehen.

Gruß
MCoder
 

Neue Beiträge

Zurück