Einzelnen Beitrag anzeigen

HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
21 Beiträge
 
Delphi XE2 Professional
 
#7

AW: GDIPlus (Erik van Bilsen) mit ‘(GDI+Error) Generic Error’ nach Zugriff auf WinCon

  Alt 23. Dez 2018, 19:07
Gewöhne Dir an nur im WM_Paint zu zeichnen.
Das ist in meinen Augen einer der grössten DesignFehler von Windows das außerhalb des PaintEvents gezeichnet werden kann.
So ähnlich hatte ich es auch im ersten Ansatz programmiert. Über den Methodenzeiger TPaintBox.OnPaint wird gezeichnet und mit einem Aufruf von TPaintBox.Repaint wird der Inhalt aktualisiert. Wenn nur eine Darstellung benötigt wird, dann genügt dies. Es handelt sich bei dem richtigen Programm um eine Lady mittlerer Komplexität (ein Charting-Tool), siehe beigefügte Abbildung. In der oberen Leiste befinden sich 3 Auswahllisten für Finanztitel, Darstellungsbreite eines Intervalls und Variante der Darstellung. Mit den Ankreuzkästchen des offenen Menüs „Darstellungsoptionen“ lassen sich Linien in dem Diagramm ein- und ausblenden, wobei bei der Aktualisierung das Menü geöffnet bleibt. Es gibt 3 Methoden, die eine Ausgabe produzieren, und 2 davon wurden nicht über TPaintBox.OnPaint aufgerufen. Die 3. war die PaintBox.OnPaint selbst. Damit die beiden anderen auch von TPaintBox.OnPaint aufgerufen werden, ist der Code dahin gehend angepasst worden, dass über das Feld TPaintBox.Tag festgelegt wird, welche Methode innerhalb von PaintBox.OnPaint aufgerufen werden soll. Um die Sache zum Laufen zubringen, muss dann statt TPaintBox.Repaint tatsächlich TPaintBox.Invalidate verwendet werden. Wenn es nur um Teilbereiche geht, dann sollte man InvalidateRect verwenden. Eine der Routine zeichnet eine vertikale Positionsmarke in Form eines schmalen Rechteckes, die von der Mausposition abhängig ist. Diese Positionsmarke ist in der Abbildung nicht zu sehen. Für das Zeichnen einer solchen Positionsmarke hat sich gezeigt, dass die Blitting-Methode (BitBlT-Routine) mit dem direkten Speicherzugriff und das Zeichnen außerhalb von TPaintBox.OnPaint besser ist. Die Darstellung über TPaintBox.OnPaint reagiert hier zu träge, sodass man hier besser die Programmiertechnik der alten Dinosaurier verwendet. Man muss dabei dafür sorgen, dass vor der Initialisierung von IGPGraphics die benötigten Inhalte aus den Steuerelementen ausgewertet sind.

Vielen Dank für Deinen Beitrag, der mich effektiv weiter gebracht hat.
Miniaturansicht angehängter Grafiken
bild-1.png  
Wolfgang Sauer
  Mit Zitat antworten Zitat