Probleme mit InvalidateRect
-
Hallo Leute!
Schreib grad an meinem ersten WinAPI-Programm, funktioniert bisher auch ganz gut, hab da nur ein Problem: Ich hab so ne Art zweigeteilten Bildschirm - links Menü, rechts Ausgabebereich. Im Ausgabebereich soll sich was bewegen, dazu ruf ich immer InvalidateRect für den Ausgabebereich auf:
RECT rect = {230,0,700,500}; InvalidateRect(hWnd, &rect, false);Aber aus irgendeinem Grund flackert das Menü lustig mit... Kann mir jemand erklären, was ich falsch gemacht habe? Oder wie ich es anders lösen könnte (Double-Buffering find ich hier etwas übertrieben, im Ausgabebereich fällt das flackern im Prinzip überhaupt nicht auf, da hier keine gefüllten Flächen auftauchen)
Bye, Ghan
-
Hm, ich kann dir zwar jetzt so aus dem FF nicht sagen warum, aber ich kann dir eine andere Variante Vorschlagen:
RedrawWindow(hWnd,&rect,NULL, RDW_ERASE | RDW_INVALIDATE)
-
Du musst natuerlich den WM_PAINT-Handler so schreiben, dass er Deine Update-Region beruecksichtigt. Wie das geht, siehe BeginPaint() Dokumentation, und die Links, die dort sind. Notfalls musst Du eine eigene Clip-Region setzen. Aber i.d.R. reicht auch GetUpdateRgn() und GetRegionRects().
-
Jo, danke, werde das dann mal versuchen!
-
lad doch mal den ganz projekt irgendwo hoch.
-
Power Off schrieb:
Du musst natuerlich den WM_PAINT-Handler so schreiben, dass er Deine Update-Region beruecksichtigt.
Quatsch, dafür ist doch Clipping da, damit du das nicht berücksichtigen musst, sondern das sowieso nur das neugezeichnet wird, was sich im Clippingbereich befindet.
@Ghan: Ich würds mir auch mal anschauen, solltest du dein Projekt irgendwo hochladen.
-
Sind das Menü und der Arbeitsbereich ein und dasselbe Fenster?
-
??????? schrieb:
Sind das Menü und der Arbeitsbereich ein und dasselbe Fenster?
Normalerweise ist das sichtbare Fenster unterteilt in Non-Client-Area und in Client-Area. Das Client-Area verfuegt ueber eigene Clip-Region, die das Ueberschreiben des Non-Client-Area verhindert.
Verarbeitet ein Programm WM_NCxxx Messages (Non-Client-Area-Messages), kann es durchaus dafuer sorgen, dass auch das Non-Client-Area beschreibbar wird.
In so einem Fall muss man natuerlich achtgeben, wohin man zeichnet.
So oder so, GetUpdateRgn() und GetRegionRects() helfen dabei, die Update-Region naeher einzugrenzen, und das Zeichnen dahingehend zu beschraenken, was nicht nur das WM_PAINT Handling deutlich beschleunigt.
Zeichnet man in WM_PAINT immer alles neu, wird das Programm unter Umstaenden sehr langsam und blockiert unnoetig die Oberflaeche. (Sieht man deutlich, wenn man ein anderes Fenster mit der Maus ueber das betreffende Fenster zieht und schnell hin- und her-bewegt)
Das Beruecksichtigen der Clip-Region beim normalen Clipping-Prozess ist keineswegs schnell. Deswegen kann sich manuelles Einschraenken auf die tatsaechliche Update-Region durchaus lohnen.