Seite 1 von 1

GUI - WM_SETREDRAW

Verfasst: 04.11.2012 15:41
von Lambda
Ich möchte beim Wechsel eines Tabs (kein Windows Panel) das Flackern unterbinden.

Code: Alles auswählen

  SendMessage_(GadgetID(#GADGET), #WM_SETREDRAW, 0, 0)
Und anschließend...

Code: Alles auswählen

    SendMessage_(GadgetID(#GADGET), #WM_SETREDRAW, 1, 0)
    InvalidateRect_(GadgetID(#GADGET), 0, 1)
    RedrawWindow_(GadgetID(#GADGET), 1, 1, 0)
...scheint theoretisch optimal zu sein, aber InvalidateRect_() macht es wiedermal zunichte. Kann es nicht gelöst werden dass Windows den Bereich statt zu löschen und neu zu zeichnen ihn überzeichnet? (wodurch das flackern entsteht)

Mir geht es weniger um die optische Perfektion, als um die Schmerzen die im Vollbild enstehen.

lG

Re: GUI - WM_SETREDRAW

Verfasst: 04.11.2012 18:10
von Danilo
cOoki3druqs hat geschrieben:Und anschließend...

Code: Alles auswählen

    SendMessage_(GadgetID(#GADGET), #WM_SETREDRAW, 1, 0)
    InvalidateRect_(GadgetID(#GADGET), 0, 1)
    RedrawWindow_(GadgetID(#GADGET), 1, 1, 0)
...scheint theoretisch optimal zu sein, aber InvalidateRect_() macht es wiedermal zunichte. Kann es nicht gelöst werden dass Windows den Bereich statt zu löschen und neu zu zeichnen ihn überzeichnet? (wodurch das flackern entsteht)
Setze mal den Parameter 'bErase' von InvalidateRect_() auf 0, dann wird der Hintergrund nicht neu gezeichnet.
Schlimmeres flackern kommt meist, wenn der Hintergrund mit gelöscht wird, da die meisten Windows-Controls
kein Double-Buffering verwenden. Wenn das Control den ganzen Vordergrund überschreibt, muss der Hintergrund
nicht auch noch extra gelöscht werden - kommt aber auf das jeweilige Control an.

Deine RedrawWindow_()-Parameter solltest Du noch einmal prüfen. Wo Du "1, 1" übergibst, gehört es nicht hin.
Vielleicht UpdateWindow_() nehmen, dann wird die Updateregion gleich neu gezeichnet.