[C#] Draw "speichern"

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.

Also wenn ich das übersetze würde das bei mir so aussehen:
C#:
private void panelX_Paint(object sender, PaintEventArgs e)
{
     Graphics GraphicsX = e.Graphics;
}
Das das geht nicht:
Code:
Object reference not set to an instance of an object.

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.
Es geht nicht darum, die Werte ganz genau rauszulesen. Man muss einfach sehen, ob ein Wert extrem abweicht. (pro Wert eine Pixelbreite)
Das Problem beim übergeben eines Arrays ist, dass ich ja nicht von Anfang an alle Werte habe...

Ich habe hier noch was gefunden: Graphics.Save()
Wäre das nicht das was ich suche?
Allerdings kommt da die gleiche Meldung wie oben schon... :confused:
 
Zuletzt bearbeitet:
Also ich habe nun rausgefunden, wieso diese Fehlermeldung kommt...
Wie muss ich
C#:
private void panelX_Paint(object sender, PaintEventArgs e)
richtig aufrufen, dass das PaintEventArgs richtig ist?

C#:
panelX_Paint(null,null)
führt zur Fehlermeldung, da ja e = null. Nur per
C#:
Application.DoEvents()
wird es nicht aufgerufen...

*******EDIT*******
Habe es schon gefunden ;)
C#:
panelX.Invalidate();

Jetzt brauch ich nur noch einen guten Tipp, wie ich das mit Graphics.Save() machen kann. Da ich am Anfang das Bild laden möchte und am Schluss speichern wird das einwenig kompliziert, sprich es kommt immer die Meldung beim Debuggen, dass ich etwas undefiniertes verwenden will... (ich habe das ganze so gemacht, dass es beim erstendruchlauf nur abspeichert und nicht lädt, was dem Debugger aber egal ist bzw. er erkennt es nicht)
 
Zuletzt bearbeitet:
Das das geht nicht:
Code:
Object reference not set to an instance of an object.
Die Event-Mothode panelX_Paint() darf direkt aufgerufen werden , sondern für das Neuzeichnen muss die Invalidate()-Methode des jeweiligen Controls bzw. Fensters aufgerufen werden.

Das Problem beim übergeben eines Arrays ist, dass ich ja nicht von Anfang an alle Werte habe...
Macht doch nichts, zum Sammeln der Messwerte nimmst du eine dynamische Liste, z.B. List<> oder Dictionary<>.

Gruß
MCoder
 
Irgendwie habe ich da ein Problem mit dem Syntax. Was ist da falsch:
C#:
...
public List<PointF> listX = new List<PointF>();
listX.Add(new PointF(wertX,wertY));
...

e.Graphics.DrawLines(red, listX.ToArray());


******EDIT******

Syntax stimmt so. Habe nur vergessen einen Anfangspunkt zu setzten (kann schlecht eine Linie zeichnen, wenn er nur ein Punkt hat).
Leider ist das noch fast langsamer, als wenn ich alles in einer for-Schleife zeichnen lasse... und zudem Flackert die Anzeige auch noch.

Ist das Graphics.Save() welches ich schon erwähnt hatte, keine Möglichkeit?
 
Zuletzt bearbeitet:
Gegen das Flackern sollten zunächst erst mal diese Zeilen im Konstruktur des Fensters helfen:
C#:
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
Ansonsten ist es sicherlich sinnvoll, bei Invalidate() nicht das ganze Fenster aktualisieren zu lassen, sondern einen Bereich (Rectangle) mit zu übergeben. Es muss ja im Prinzip nur ein schmaler Streifen mit dem neu hinzugekommenen Messwert neu gezeichnet werden. Dann sollte es auch schneller gehen.

So wie ich das sehe, speichert Graphics.Save() nicht den Zeichnungsinhalt sondern nur bestimmte Eigenschaften des Graphics-Objekts, z.B. Transformations- oder Rotationseinstellungen.

Gruß
MCoder
 
Irgendwie funktioniert das mit nur den einen Streif aktuallisieren nicht. Ich habe das Gefüh, dass immer noch das ganze Feld aktuallisiert wird... ausser ich habe es falsch verstanden...

C#:
Rectangle rc = new Rectangle(new Point(x-1,0), new Size(3,250)); // x = aktueller Stand in x-Richtung
panelX.Invalidate(rc);
 
im Graphics Objekt gibt es eine Eigenschaft VisibleRectangle welches dir den akt. sichtbaren bereich zeigt, mit dem müsstest du prüfen ob deine Linien gezeichnet werden dürfen.
Und Graphicspath schon probiert?
 
Zurück