Hallo Werte Kollegen,
Ich habe folgendes Problem.
Ich möchte fortlaufend grüne oder rote Linien in ein Panel zeichnen, abhängig davon, ob das Ergebnis einer Sensorprüfung 1 oder 0 ist.
Im Prinzip habe ich das schon erledigt und es funktioniert, jedoch ist die Lösung nicht gerade performant/hübsch.
Ich schreibe mir jedes Ergebnis der Sensormessung in ein Array und rufe bei jedem Schreibvorgang in das Array die Funktion Panel.Invalidate auf, damit das PaintEvent des Panels gefeuert wird.
Das PanelPaintEvent zeichnet dann für jeden Wert im Array eine grüne oder rote Linie in das Panel.
Da die Wertanzahl im Array stetig steigt, füllt sich das Panel allmählich.
Dadurch, dass ich aber für das zeichnen der Linie das Panel immer für ungültig erklären muss, muss ich immer wieder alle Linien aus dem Array zeichnen statt einfach eine hinzuzufügen.
Hat jemand eine Idee, wie ich die lines zeichnen kann ohne jedes Mal das ganze Panel für ungültig zu erklären (Invalidate).
Das sieht in der Praxis nämlich blöd aus, wenn das Panel die ganze Zeit beim schreiben flackert.
Die Anwendung soll eine Livedarstellung der Ergebnisse liefern, daher kann ich leider nicht warten, bis das array eine bestimmte größe hat und dann alles schreiben.
Wäre für Hilfe dazu sehr dankbar
Hier nochmal die beiden wichtigsten Methoden / Event
Programmiert wird in c# mit dem VS2010 Prof.
Schreiben in das Array und Anstoss des Zeichnens
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void DrawLine() { if (panel.InvokeRequired) { received = Client.Receive(ref RemoteIpEndPoint); result = Encoding.UTF8.GetString(received); results.Add(result); bufferPanel1 = results.ToArray(); panel.Invoke(new Action(() => panel.Invalidate())); } } |
PaintEvent des Panels
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| private void panel_Auswertung1_Paint(object sender, PaintEventArgs e) { int i1 = 0; if (bufferPanel1 != null) { foreach (int ie in bufferPanel1) { i1++; if (ie == 1) { Pen Greenpen = new Pen(Color.Green, 5); Graphics g = e.Graphics; g.DrawLine(Greenpen, 0 + i1, 49, 0 + i1, 0); } else { Pen Greenpen = new Pen(Color.Red, 5); Graphics g = e.Graphics; g.DrawLine(Greenpen, 0 + i1, 49, 0 + i1, 0); } } } } |