WS_CLIPCHILDREN: wie Child-Fenster zeichnen?



  • Hallo,

    um flackern beim Resize zu verhindern, habe ich WS_CLIPCHILDREN gesetzt und der Effekt ist auch super (gar kein flackern mehr bei meinen GDI+-Operationen). Jetzt werden aber die Child-Fenster nicht mehr neu gezeichnet (das war mir auch klar). Ich habe jetzt versucht, bei WM_SIZE die Childs neuzuzeichnen, um den weißen Hintergrund wegzubekommen (verschiedene Kombinationen von InvalidateRect und RedrawWindow), allerdings tut sich gar nichts. Muss ich die Controls subclassen und dann noch zusätzlich die RedrawWindow/InvalidateRect aufrufen oder wie macht man das richtig?

    Danke schonmal.



  • Ich habe es zwar jetzt hinbekommen, aber schön finde ich es nicht. Habe alle Controls subclassen müssen, die vom weißen Hintergrund betroffen waren. Bei dem einem Control, dass durch das GDI+-Bild überlagert wird, lasse ich eine Region erstellen, die das Control minus das Areal vom Bild umfasst und die ich dann in WM_ERASEBKGND aktualisiere. Ergebnis super, Umsetzung fragwürdig. Gibt es da nichts "elegantes"?



  • Benutze "BeginDeferWindowPos", "DeferWindowPos" und "EndDeferWindowPos" zum Resizen von Childfenstern. Das lediglich Toolbar und Statusbar zeichne ich herkömmlich, da "DeferWindowPos" bei mir da nix bringt.



  • Danke für den Tipp, aber es flackert trotzdem. Der einzige Unterschied ist, dass ich nicht mehr WS_CLIPCHILDREN setzen muss. Es gibt also die Fälle:

    1. Mit DeferWindowPos:
    a) Flackern wenn WS_CLIPCHILDREN nicht gesetzt ist und der Fenster-Hintergrund nicht manuell gezeichnet wird.
    b) Kein Flackern wenn WS_CLIPCHILDREN nicht gesetzt ist und der Fenster-Hintergrund manuell gezeichnet wird.

    2. Ohne DeferWindowPos:
    a) Flackern, wenn WS_CLIPCHILDREN nicht gesetzt ist, egal ob Fenster-Hintergrund manuell gezeichnet wird oder nicht,
    b) Kein Flackern, wenn WS_CLIPCHILDREN gesetzt ist und der Fenster-Hintergrund manuell gezeichnet wird

    Soll heißen: bei beiden Varianten muss ich den Hintergrund bei den entsprechenden Childs selbst zeichnen. Mit DeferWindowPos spare ich mir nur das WS_CLIPCHILDREN.

    Aber dennoch werde ich DeferWindowPos zusätzlich verwenden, da ich das für das "schönere" Resizing halte.


  • Mod

    Wann werden die Child Windows nicht neu gezeichnet.
    Das ist in keiner Weise normal wenn man den Stil WS_CLIPCHILDREN setzt.

    Es ist nur eindeutig klar, dass eben ein Invalidate des Parents nicht unbedingt ausreicht um ein Neuzeichnen der Children auszulösen.
    Das ist eben auch klar. Das ist ja genau das Problem mit dem Flackern. Das Parent übermalt das Child, das später sich selbst erst neu zeichnet.

    Entsprechend gibt es ja auch RedrawWindow Argumente die die Childs einschließen oder eben nicht.



  • Sie haben die ganze Zeit einen weißen Hintergrund, sobald WS_CLIPCHILDREN gesetzt ist, das meine ich mit nicht neu gezeichnet. Wenn ich den Hintergrund selbst zeichne (bei WM_ERASEBKGND), dann funktioniert das, ansonsten bleibt der weiß.



  • Achso, das betrifft auch nur Buttons mit BS_GROUPBOX-Stil. Alle anderen Controls werden normal angezeigt und müssen nicht manuell behandelt werden.


Anmelden zum Antworten