Dialog mit Farbverlauf



  • Hallo!

    Ich zeichne einen Farbverlauf mit GradientFill in der OnEraseBkgnd Methode meines Dialogs. Wenn ich jetzt allerdings das Fenster maximiere, wird der Farbverlauf zwar korrekt gezeichnet, allerdings ist immer noch der alte Verlauf in der vorigen Fenstergröße zu sehen. Ich verstehe nicht ganz warum das so ist. Löscht OnEraseBkgnd denn ganzen Hintergrund?

    Edit:

    Wenn ich in der OnSize Methode ein CDialog/CWnd::Invalidate(); einfüge ist logischerweise alle Ok. Gibt es keine andere Möglichkeit?


  • Mod

    Ob das gesamte Fenster neu gezeichnet wird bei Größenänderung hängt von dem Stil der Klasse ab. Nur wenn CS_VREDRAW und CS_HREDRAW gesetzt sind wird das gesamte Fenster neu gezeichnet, sprich auch der Hintergrund.

    Wird CS_VREDRAW und CS_HREDRAW wie bei einem Dialog nicht gesetzt, dann wird nur der neu sichtbar werdende Teil neu gezeichnet bei einer Größenänderung.

    Also ein Dialog hat IMHO diese Stile nicht. Bleibt Dir nur OnSize zu überschreiben und dort einfach einen Invalidate auszuführen.



  • Martin Richter schrieb:

    Also ein Dialog hat IMHO diese Stile nicht. Bleibt Dir nur OnSize zu überschreiben und dort einfach einen Invalidate auszuführen.

    Der Dialog flackert dann aber wie verrückt bei einer "manuellen" Größenänderung trotz Pufferung. Gibt es da irgendwie Abhilfe, also *wirklich* flackerfrei zu zeichnen?


  • Mod

    Das ist eben der Nachteil mit dem Neuzeichnen. Aber wie soll es sonst gehen, da Dein ganze Hintergrund eben neu gezeichnet werden muss!
    Evtl. WS_CLIPCHILDREN setzen!



  • Martin Richter schrieb:

    Das ist eben der Nachteil mit dem Neuzeichnen. Aber wie soll es sonst gehen, da Dein ganze Hintergrund eben neu gezeichnet werden muss!
    Evtl. WS_CLIPCHILDREN setzen!

    Danke, das hat schon mal etwas gebracht. Aber wie entwickelt man denn "echte" GUIs. Bei Microsofts Innovationen flackert auch nichts und hexen können die auch nicht. 😉


  • Mod

    MS macht aber auch nicht so einen Hintergrund schnickschnack wie Du 🙂

    WS_CLIPCHILDREN und DeferWindowPos macht beim Resize viel...
    Ich bekomme damit ein 100% flackerfreien Resize hin.



  • Martin Richter schrieb:

    MS macht aber auch nicht so einen Hintergrund schnickschnack wie Du 🙂

    WS_CLIPCHILDREN und DeferWindowPos macht beim Resize viel...
    Ich bekomme damit ein 100% flackerfreien Resize hin.

    Klasse das hat das Flackern schon echt minimiert. Herzlichen Dank.

    Btw: Das UI von 2007 Microsoft Office System hat auch Farbverläufe. 😉


  • Mod

    1. Ist das in 99% der Fälle kein Dialog.
    2. Sind darin keine Child-Windows mit eigenen DCs.
    3. Die Dialoge erlauben keinen Resize und haben keinen Gradient Fill! Wenn ist dieser nur in der Caption, und ich vermute mal schwer das auch nur die neu gezeichnet wird.
    5. Mach Office da was ganz eigenes. Gehe mal mit dem Spy++ drauf. Du wirst sehen, dass die Diaogobjekte nicht als eigene Fenster dort auftauchen.
    6. Verwendet MS in seinen Produkten immer die DfeerWindowsPos Funktionen und WS_CLIPCHILDREN, wen ds nicht möglich ist, erzeugt MS in WM_ERASEBKGND eine Clippingregion, die bestimmte Teile auslässt!

    HTH


Anmelden zum Antworten