Flackernde Childfenster, kann das mit doublebuffer behoben werden?
-
Ok ich habe in meiner Anwendung 5 gedockte Childfenster im Hauptfenster. Diese Fenster sind erstellt im Treeview und im Listview(Report) Style. Ausserdem verfügt mein Hauptfenster über eine Toolbar. Beim Re-sizen flackerten diese Fenster extrem. Dieses Flackern habe ich jetzt teilweise behoben indem ich für das Hauptfenster den Code folgendermassen geändert habe
WNDCLASSEX wndclass; voerher: wndclass.style = CS_HREDRAW | CS_VREDRAW; nachher: wndclass.style = 0;Das Hauptfenster wurde mit "WS_CLIPCHILDREN" erstellt. Das Flackern ist fast weg. Es tritt beim Re-sizen nur noch in der Toolbar und in nicht gefüllten Listview Fenstern auf. Da die Listviewfenster im Reportstyle erstellt sind und Columns besitzen sind sie daher nicht völlig leer und das flackern wird bei der Schrift der Columns sichtbar. Sind diese Fenster jewdoch mit Items gefült flackert dort nichts. Die Toolbar flackert nach wie vor. Ich hab irgendwo gelesen, daß das mit dem Doublebuffer und Childfenster nicht so funktioniert. Wer kann helfen?
-
Probier mal obs was hilft beim Erzeugen deines Hauptfensters WS_EX_COMPOSITED mit anzugeben bei CreateWindowEx()
-
Wie machst Du das Resizen? Selber manuell mit MoveWindow/SetWindowPos?
Versuch es mal mit BeginDeferWindowPos, DeferWindowPos, EndDeferWindowPos...
Doublebuffering kann man in bestehende Fenster nicht integrieren. Dabei zerstörst Du deren Paint und Redraw Mechanismen. Das geht nur für eigene Fenster.
-
geeky schrieb:
Probier mal obs was hilft beim Erzeugen deines Hauptfensters WS_EX_COMPOSITED mit anzugeben bei CreateWindowEx()
Hat leider nix gebracht, ausser daß die Childfenster extrem flackerten, wenn ich mit den Mauscursor drüber bewege.
@Martin
naja ich fange WM_SIZE ab und rufe 2 Funktionen auf, die eine berechnet mir anhand der momentanen Größe des Hauptfensters die jeweiligen neuen Koordinaten der einzelnen Childfenster die zweite bringt per "MoveWindow(....,TRUE);" die Fenster an ihre Position. Hmm mit BeginDeferWindowPos etc. habe ich noch nicht gearbeitet, ich werde mir das gleich mal anschauen, Danke für den Tip.
-
So ich hab mir mal einen Code geschrieben als Denkanstoß diente mir ein Beispiel aus einem msdn blog, leider ändert nun keines der Fenster mehr seine Größe. Hat einer eine Idee was ich falsch mache? Hier der Code:
void Resize_ChildWindows(void){ HDWP MultiWnd; RECT rcl; MultiWnd = BeginDeferWindowPos(8); SendMessage(Wnd_StatusBar, SB_SETPARTS, (WPARAM)4, (LPARAM)dim.sbar_xpos); MultiWnd = DeferWindowPos(Wnd_StatusBar, MultiWnd, NULL, dim.xpos_sbar, dim.ypos_sbar, dim.xwidth_sbar, dim.yheight_sbar, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_TabControl, MultiWnd, NULL, XPOS_TABCONT, dim.ypos_tabcontrol, XWIDTH_TABCONT, dim.yheight_tabcontrol, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_Child1, MultiWnd, NULL, dim.xpos_child1, dim.ypos_child1, dim.xwidth_child1, dim.yheight_child1, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_Child2, MultiWnd, NULL, dim.xpos_child2, dim.ypos_child2, dim.xwidth_child2, dim.yheight_child2, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_Child3, MultiWnd, NULL, dim.xpos_child3, dim.ypos_child3, dim.xwidth_child3, dim.yheight_child3, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_Child4, MultiWnd, NULL, dim.xpos_child4, dim.ypos_child4, dim.xwidth_child4, dim.yheight_child4, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_Child5, MultiWnd, NULL, dim.xpos_child5, dim.ypos_child5, dim.xwidth_child5, dim.yheight_child5, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); MultiWnd = DeferWindowPos(Wnd_ToolBar, MultiWnd, NULL, -1, -1, dim.xwidth_tbar, dim.yheight_tbar, SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE); EndDeferWindowPos(MultiWnd); GetClientRect(Wnd_Main, &rcl); InvalidateRect(Wnd_Main, &rcl, TRUE); }die Werte für die Coordinaten sind auf jedenfall uptodate, da meine alte MoveWindow-Funktion damit noch einwandfrei arbeitet.
-
Guck nochmal nach was die ersten beiden Parameter von DeferWindowPos () sind.
-
Danke Kollege, manchmal sieht man den Wald vor lauter Bäumen nicht. Das Flackern ist jetzt schon merklich besser, fast akzeptabel. Leider ist da nach wie vor das Problem mit den nicht gefüllten Listviewfenstern. Wenn kein Item drin ist flackern die Columns, sobald ein Item drin ist flackert da nichts mehr. Hat da jemand eine Idee?
-
Keiner eine Ahnung? Btw was mir so aufgefallen ist, so bekannte Programme wie z.B. Total Commander oder WinSPC da flackern ja die einzelnen Fenster wie wild beim resizen. Jedoch eine Excel Tabelle läßt sich smooth resizen. Sind die Programmierer einfach zu faul oder wissen nicht wie's geht oder ist es denen egal? Also bei einer kommerziellen Software störrt mich das schon gewaltig. So gesehen kann ich mit meiner Anwendung zufrieden sein, da liegen ja Welten im Vergleich mit ersteren und weit weg von einem Excel Ergebnis bin ich auch nicht. Hab halt gehoft ich bekomms genausogut hin wie MS :), muss ich wohl noch etwas üben.
-
Das Problem sind eher die Controls, die Du verwendest und evtl. was Deine Client Area invalidiert. Und da bist Du vermutlich selber schuld.
Alle Deine gedockten Fenster liegen in der Client Area, die invalidierst Du am Ende komplett und erzwingst ein Neuzeichnen.
Alleine das ist schon evtl. der Grund. Warum machst Du das überhaupt?
Zudem wird evtl auch noch zusätzlich ein Neuzeichnen durch die Klassenflags ausgelöst...