WM_ERASEBKGND in der Statusbar



  • Hi,

    Frage: Wie kann ich bei WM_ERASEBKGND bestimmte Bereiche in der Statusbar beim Neuzeichnen des Hintergrunds ausschließen?

    Auslöser meiner Experimente ist der folgende Beitrag: http://www.c-plusplus.net/forum/viewtopic-var-t-is-212678.html wo es um das Flackern in der Statusbar geht.

    Folgendes habe ich probiert:
    -Statusbar subclassing
    -in dieser Prozedur fange ich WM_ERASEBKGND ab und returniere mit 1.

    Ergebnis: Kein Flackern mehr in der Statusbar beim Größenändern des Fensters, korrekte Darstellung der einzelnen Statusbar-Felder, aber dafür auch eine absolut unbefriedigende Darstellung des Statusbar-Rahmens 😞

    Deshalb möchte ich erreichen, daß bei WM_ERASEBKGND weiterhin der ganze Statusbar-Rahmen gezeichnet wird, aber die einzelnen Felder selbst vom Neuzeichnen ausgeschlossen werden müssen.

    Brauche ich dafür Clipping-Funktionen?
    Hat jemand einen Tipp dazu? (Link genügt)

    Martin



  • Hey Jungs,

    mit ExcludeClipRect() scheint das zu funktionieren.

    Allerdings habe ich da eine grundsätzliche Frage: Muß ich diese Exclude-Funktion explizit wieder rückgängig machen?
    Oder macht GDI das automatisch? Besteht da Gefahr von Speicher-Leaks?

    Die Beobachtungen meiner Experimente an der Statusbar lassen zu der Annahme führen, daß GDI das Clippen automatisch beendet.
    Was mir aber noch unklar ist: Wann genau wird das per ExcludeClipRect() definierte Exclude-Clippen eigentlich beendet?

    In der MSDN steht leider nichts dergleichen zu diesen Fragen drin *seufz*

    Vielleicht erbarmt sich jemand von Euch und kann mir da irgendwie weiterhelfen?
    Martin


  • Mod

    Du bekommst einen DC, wenn dieser von die manipuliert wird (ExcludeClipRegion), dann hält diese Manipulation solange vor, wie dieser DC verwendet wird. Also spätestens wenn der DC stirbt, stirbt auch das Clipping.

    Du solltest tunlichst alle Änderungen nur solange vorhalten wir diese benötigt werden.



  • Alles klar,
    Danke für die Info! Das erleichtert mich schon ungemein.

    Das erklärt auch, warum ExcludeClipRect() bei WM_ERASEBKGND greift, aber (kurze Zeit später) bei WM_DRAWITEM nicht mehr wirkt (das ist auch gut so, sonst hätte ich nichts Sichtbares zeichnen können).

    Somit lasse ich die Schlußfolgerung zu, daß der DC irgendwann zwischen WM_ERASEBKGND und WM_DRAWITEM "stirbt".

    Damit bin ich meinem Ideal "flickerfreie Statusbar" ein Stück nähergekommen.

    Martin


  • Mod

    Glaube ich an sich nicht.
    Oft genug haben gesetzte Clip Regions später unangenehme Nebeneffekte. Evtl. wirdnur eine neue Clipregion gesetzt. Ich würde die Clip-Region setzen, die Basis Fensterklasse aufrufen und danach die Clip-Regon zurücksetzen.

    Oft genug ist hier das Verhalten zwischen themed und unthemed auch noch extrem!


Anmelden zum Antworten