Frage

Okay, also in meiner Anwendung, gibt es eine Reihe von winapi und ein paar Custom Controls. Yay ...

Nun, in der Regel werden sie nur sich leise neu zeichnen für Animationen, Zustand zu ändern, ect .... und es funktioniert gut.

Aber ich habe eine Methode der Klasse Fenster namens Fix (). Dies wird aufgerufen, wenn das gesamte Fenster muss aktualisiert werden. Es ändert die Größe der Kontrollen und Ungültigmachungseinträge das Fenster.

Wenn dies geschieht, ist der Hintergrund gezeichnet wird, dann auf die Registerkarte Steuerung, dann alle anderen an der Spitze. Dies verursacht sehr irritierend zu blinken, vor allem, wenn das Fenster (wegen der ständigen Anrufe Fix ()) Ändern der Größe.

Was habe ich versucht:

  • WS_EX_COMPOSITED. Dies ist nur doppelt puffert die einzelnen Steuerungen. Seine eine Verbesserung, aber das Flimmern unvermeidlich bleibt.
  • Ausschalten Hintergrund Zeichnung. Kaum löst das Problem, und tatsächlich macht die Sache noch schlimmer.

Also: Ich brauche eine Technik / Methode / was auch immer mir zu erlauben, das Fenster in seiner Gesamtheit zu verdoppeln-Puffer. Ich stellte dar, dass die WM_PAINT-Nachricht von mir Handhabung könnte eine Lösung sein, aber ich würde nicht wissen, wo man anfangen soll. Ich habe eine schreckliche Gefühl, dass dies auch gar nicht möglich ist ...

Bitte helfen Sie, das ist ein kritischer Punkt. Ich werde sehr erleichtert, wenn dieses dumme kleine Problem behoben wird.

War es hilfreich?

Lösung

Es ist zu diesem Zeitpunkt, dass man die Tiefen von Microsofts Missachtung für native Entwickler realisiert. Man könnte in der Tat beginnt paranoide Wahnvorstellungen zu hegen, dass Microsoft absichtlich gebrochen nativen Malerei, um einheimische Entwickler zu zwingen, hat WPF zu bewegen.

Zunächst betrachten WS_EX_COMPOSITED. WS_EX_COMPOSITED scheint der Senf zu sein: - es sagt, dass es eine Botton nach oben Farbe, um für ein Kind Kontrollen erzwingt, und im Grunde, dass WM_PAINT-Nachrichten in einem Batch behandelt bekommen. Sie sagt, sie wurde in Windows 2000 (5.0) und ein paar Zeilen nach unten hinzugefügt, dass es nicht der Arbeit mit Desktop-Zusammensetzung nicht aktiviert. das heißt es nicht mehr funktioniert ab Windows Vista (6,0), es sei denn, aero Glas ausgeschaltet ist und wer das tut?

Dann gibt es zwei mögliche „Hacks“ zu versuchen und zu erhalten flimmerfreie Malerei zur Arbeit:

  • Zuerst müssen Sie die Menge der Übermalung mimimize. WS_EX_CLIPCHILDREN | WS_EX_CLIPSIBLINGS sind notwendig, um sicherzustellen, dass ein bestimmte Bereich des Fensters nur einmal gemalt. BeginDeferWindowPos ist auch notwendig, um Batch-Operationen Ändern der Größe, dass die Übergangszustände zu gewährleisten -, wo ein Fenster einer anderen überlappt -. nicht passieren (das heißt, wenn Fenster A wurde verkleinert, aber Fenster B hat nicht)

Natürlich, wenn Sie versuchen, ein gehäutet Dialog zu zeichnen oder Gruppenrahmen verwenden, oder Registerkarten, oder eine beliebige Anzahl anderer Einschränkungen, ist WS_EX_CLIPSIBLINGS einfach nicht angemessen.

  • WM_SETREDRAW ist eine magische Nachricht. Es gibt keine API diese Funktionalität zuzugreifen: WM_SETREDRAW direkt behandelt durch DefWindowProc im Wesentlichen aus dem Fenster zu markieren, wie für die Dauer verborgen. Nach WM_SETREDRAW, FALSE gesendet wird, Anrufe zu GetDC / GetDCEx / GetWindowDC etc das übergeordnete Fenstergriff mit (und alle seine Kinder) eine DC zurück, die auf dem Bildschirm nicht ziehen. Dies gibt Ihnen die Möglichkeit, alle möglichen Dinge zu den untergeordneten Fenster zu tun, wenn Sie senden eine WM_SETREDRAW,TRUE fertig sind, (und dann das Fenster neu gezeichnet manuell). Alle der untergeordneten Fenster werden - natürlich -. Farbe in ihrer eigenen Zeit, und nach dem übergeordneten Fenster hat seinen Lösch Hintergrund getan, so WM_SETREDRAW ist keine Art von Allheilmittel

Nach WS_EX_COMPOSITED brechen, in .NET der WinForms und WPF neu schrieben die Kontrollen vom Boden bis zu nicht die nativen Steuerelemente zu verwenden, so dass sie in gepufferte Malerei dort backen konnten. Und Alpha-Unterstützung zu.

Andere Tipps

Hm. Bevor die Menschen eilen in und in der Nähe dieses Thema als Duplikat, würde ich besser zu erwähnen, dass Ihr Problem per se nicht das doppelte Pufferung, sondern flackert, wenn Kontrollen Neupositionierung, für die „manuelle“ doppelte Pufferung nur eine von mehreren Lösungen ist.

Es könnte sein, dass z.B. BeginDeferWindowPos & Freunde können das Flimmern beheben.

Disclaimer: Ich kannte fast alle Details des Win16-API, aber es ist einige Jahre her, seit ich API-Level-Programmierung tat

.

Prost & hth.

- Alf

Ohne Code stelle ich mir kaum, was die tatsächliche Situation ist ... Aber man kann versuchen WM_ERASEBKGND zu handhaben, gibt TRUE zurück, wenn Sie sie empfangen Löschen überspringen.

Handle WM_ERASEBKGND für Ihre Fenster und bei der Umsetzung ausschließen die Rects jedes Ihrer untergeordneten Steuerelemente, dann die restlichen Hintergrund füllen angemessen und den Rahmen sagen, dass Sie den Hintergrund urself true durch Rücksendung gemalt haben. Machen Sie dasselbe für alle anderen untergeordneten Steuerelemente, die wiederum halten andere Steuerelemente wie Registersteuer in Ihrem Fall.

Siehe hier für ein Beispiel unter Verwendung von MFC.

In .net gibt es ControlStyle.AllPaintingInWmPaint, die auf jeden Container Fenster festgelegt werden sollen (so das Hauptfenster und die Registerkarten). Ich konnte kein winapi Äquivalent finden. Aber was dies tut, ist das Bild des Hintergrunds von WM_ERASEBKGND zu WM_PAINT zu bewegen. es zieht auch den Bereich der Kinder Steuerung von dem Elternteil zu vermeiden Flackern, könnte es sein, dass Sie dies manuell tun müssen, um.

Ich bin überrascht WS_EX_COMPOSITED nicht hilft. Das sollte funktionieren, wenn Sie, dass auf dem Fenster der obersten Ebene festgelegt und nicht nennen RedrawWindow auf den Unter Kontrollen.

Auch sicher sein, zu Test mit und ohne DWM / Aero. Sie können unterschiedliche Ergebnisse erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top