MDI + SetWindowPos + Flimmer
-
Hallo.
Ich arbeite ja gerade mit MDI und will meine Fenster jedesmal, wenn Mein Hauptfenster seine Groesse aendert meine 3 Childfenster Anpassen.
In einem der 3 Fenster gebe ich ein Schachbrett mit double-Buffering aus!
Wenn der Benutzer dieses eine Fenster vergrössert oder verkleinert aendert sich auch das Brett mit den Figuren und das klappt wunderbar!Wenn ich aber die Groesse des Childfenster mit SetWindowPos, bei einer WM_SIZE von meinem Hauptfenster, aendere dann malt Windows zuerst mit der Backgroundfarbe drueber, obwohl ich bei der WNDCLASS der Fenster beim Style 0 und nicht CS_HREDRAW|CS_VREDRAW angegeben habe, und das flimmert extrem.
Meine SetWindowPos:
SetWindowPos(m_Brett.GethWnd(), HWND_TOP, 0, 0, xb, yb, SWP_SHOWWINDOW);
Ich habe auch schon versucht statt SWP_SHOWWINDOW etwas anderes anzugeben, aber ich merke keine änderung. Villeicht habe ich nicht alle versucht?
Oder ist das eine "Programmierfehler" von Windows, den man nicht beheben kann?
Danke.
-
hmm, interessant wäre noch zu wissen wo und welcher form du dein brett malen lässt.
nicht desto trotz empfehle ich dir, bei aufwendigen malaktionen immer back-buffering zu verwenden ...
ein kleines beispiel gibts hier -> (see signature)
rocknix ///
-
Hallo RockNix!
Ich habe ja oben eh schon geposted, dass ich Double ("Back")-Buffering verwende!
Jedes mal, wenn mein Brett-Fenster seine groesse aendere erstellen ich eine BackBuffer die so groß ist wie mein Bildschirm. Wenn ich dann eine Figur (mit Bitmasken) hinmale, baue ich zuerst den ganzen Bildschirm in diesem Backbuffer auf um ihn anschießend als ganzen auf den Bildschirm zu BitBlt en!
Das Problem mit dem flimmern tritt nur bei SetWindowPos auf!
Nach einem solchen Aufruf der Funktion SetWindowPos malt Windows löscht windows zuerst immer den Bildschirm.Ich habe herausgefunden, dass dieses Flimmern nur dann Stattfindet, wenn ich das Brettfenster vergroessere! Menn ich es verkleinere läuft alles wie geschmiert.
Vielleicht kann ich das nicht umgehen, weil Windows wenn das Fenster vergroessert wird das löschen muss.
Dagegen spricht aber, dass es ohne SetWindowPos, Wenn das Child-Fenster von Hand vergroessert wird auch ohne flimmern geht.
-
Ich habe ja oben eh schon geposted, dass ich Double ("Back")-Buffering verwende!
ups, wer lesen kann ist klar im vorteil
so far ...
-
WM_ERASEBKGND mit return (1); schon versucht?
-
Danke TKool!
Das ist die Lösung meines Problems.