Formular zum Neuzeichnen erzwingen?
In C# - WinForms - ich bin zeichnen einer Linie Diagramm in Echtzeit, basierend auf den empfangenen Daten über die serielle Schnittstelle alle 500 ms.
E.Grafik.DrawLine Logik ist innerhalb des Formulars Sie einen OnPaint-handler.
Einmal erhalte ich die Daten aus der seriellen Schnittstelle, die ich brauche zu rufen, etwas, das bewirkt, dass die form neu zu zeichnen, so dass die OnPaint-handler aufgerufen wird. Ich habe dies ausprobiert.Aktualisieren und dieser.Zu entkräften, und was passiert, ist, dass ich verlieren das, was gezogen wurde, die zuvor auf dem Formular.
Gibt es einen anderen Weg um dies zu erreichen, ohne zu verlieren, was gezogen wurde, auf Ihre form?
InformationsquelleAutor der Frage Chris | 2010-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Punkt ist, dass Sie denken sollten, speichern Sie Ihre Zeichnung Daten irgendwo. Wie schon gesagt, ein buffer-bitmap ist eine Lösung. Allerdings, wenn Sie nicht zu viel zu machen, manchmal ist es einfacher und besser zu speichern Sie Ihre Zeichnung Daten in eine variable oder ein array und alles neu zeichnen in OnPaint-Ereignis.
Angenommen, Sie erhalten einige zeigen Daten, die zum Diagramm Hinzugefügt. Tannen aller erstellen Sie eine point-Liste:
Dann jedes mal, wenn Sie einen neuen Punkt, den Sie zur Liste hinzufügen und aktualisieren Sie die form:
In der OnPaint-Ereignis den folgenden code:
Funktioniert das ziemlich schnell bis auf irgendwie 100 000 Punkte und braucht viel weniger Speicher als Puffer bitmap-Lösung. Aber Sie sollten entscheiden, welchen Weg es nach der Zeichnung Komplexität.
InformationsquelleAutor der Antwort Zenya
Als erneut sagte, Sie müssen die Puffer Ihre form (da es scheint, dass Sie sind, verwerfen die Daten, nachdem Sie Sie ziehen).
Dies ist im Grunde, wie ich es tun würde:
Dieser sagte, werden Sie wahrscheinlich wollen, um cache der Daten, so dass Sie können ändern Sie die Größe des Puffers, wenn die form, die Größe ändert und dann neu zeichnen die alten Daten drauf.
InformationsquelleAutor der Antwort Zach Johnson
Kann die Lösung sein
this.Invalidate()
InformationsquelleAutor der Antwort edu feliu
den Standard-Weg zu handhaben, ist zum erstellen einer Speicher-bitmap und zeichne auf, dann setzen Sie die Eigenschaft Bild des Bild-Feld, um die Speicher-bitmap.
InformationsquelleAutor der Antwort rerun
Benötigen Sie zum speichern von historischen Daten irgendwo und nur repaint es.
Wird viel einfacher als zu sagen, caching-und clipping-bitmaps.
InformationsquelleAutor der Antwort leppie