Probleme mit Fensteraktualisierung bei aktiviertem Aero
-
Hallo!
Ich hoffe, meine Frage ist hier einigermaßen passend aufgehoben.
Da einige Buchläden die 5. Auflage des Werkes "Programming Windows" von Charles Petzold geradezu verramschen, konnte ich nicht widerstehen.
In seinen Beispielen ist Petzold sehr darauf bedacht, so wenig wie möglich neu in ein Fenster zu zeichnen.
Beispiel clock.c (eine Analoguhr):case WM_TIMER: GetLocalTime( &st ); fChange = st.wHour != stPrevious.wHour || st.wMinute != stPrevious.wMinute ; hdc = GetDC( hwnd ); SetIsotropic( hdc , cxClient , cyClient ); //-----------------relevanter Bereich--------------------------------- SelectObject( hdc , GetStockObject( WHITE_PEN )); DrawHands( hdc , &stPrevious , fChange ); SelectObject( hdc , GetStockObject( BLACK_PEN )) ; DrawHands( hdc , &st , TRUE ); //-------------------------------------------------------------------- ReleaseDC( hwnd , hdc ); stPrevious = st ; return 0 ;Falls es nicht offensichtlich ist: Petzold zeichnet in der Hintergrundfarbe über alte Fensterinhalte (hier die Zeiger einer Uhr), um diese dann in Schwarz (Vordergrundfarbe) neu zu zeichnen.
Diese mehr oder weniger elegante Lösung funktioniert auch einwandfrei, solange unter Windows7 aero nicht aktiviert ist. Bei aktiviertem aero, werden die Zeiger nur sporadisch aktualisiert.Nun meine Fragen:
-Ist das problem hier bekannt?
-Lässt es sich lösen? ( InvalidateRect hilft natürlich, aber genau das wollte Petzold ja offensichtlich verhindern ).
-Ist das vielleicht sogar nur ein hardwarespezifisches Phänomen?
-
In WM_TIMER zu zeichnen, ist absolut unsauber. Das gehört in WM_PAINT.
-
in WM_TIMER solltest Du "InvalidateRect" aufrufen...
http://msdn.microsoft.com/en-us/library/dd145002
-
Jochen Kalmbach schrieb:
in WM_TIMER solltest Du "InvalidateRect" aufrufen...
http://msdn.microsoft.com/en-us/library/dd145002Das es mit InvalidateRect funktioniert, sagte ich ja bereits schon. Da der ganze Schotter dann in WM_PAINT landen würde, wäre der Code vielleicht auch "sauberer", aber irgendwie auch weniger elegant.
-
theHorst schrieb:
Jochen Kalmbach schrieb:
in WM_TIMER solltest Du "InvalidateRect" aufrufen...
http://msdn.microsoft.com/en-us/library/dd145002Das es mit InvalidateRect funktioniert, sagte ich ja bereits schon. Da der ganze Schotter dann in WM_PAINT landen würde, wäre der Code vielleicht auch "sauberer", aber irgendwie auch weniger elegant.
Weniger elegant?
Nur in WM_PAINT soll gezeichnet werden. Was hat das mit Eleganz zu tun in allen Deinen Routinen zu zeichnen wo Du denkst das Zeichnen Sinn macht, wenn man genau nur eine einzige Stelle dafür benötigt.
-
Martin Richter schrieb:
Weniger elegant?
Nur in WM_PAINT soll gezeichnet werden. Was hat das mit Eleganz zu tun in allen Deinen Routinen zu zeichnen wo Du denkst das Zeichnen Sinn macht, wenn man genau nur eine einzige Stelle dafür benötigt.Die Debatte ist ziemlich sinnfrei, da ich selbst nicht auf die Idee gekommen wäre, außerhalb von von WM_PAINT herumzupönen.
Elegant deshalb, weil man sich hier das InvalidateRect schenken kann. Zugegeben, die Beantwortung der Frage ist damit von rein akademischen Interesse.