![]() |
Abziehen von WS_EX_COMPOSITED = Flicker
Hallo, es könnte sein, dass es keine Möglichkeit gibt.
Ich optimiere gerade meine ListBox. Ich sende je nach Aktion WM_SETREDRAW mit TRUE oder FALSE. Das geht schneller und besser als:
Delphi-Quellcode:
Aber bei manchen Aktionen nützt mir WM_SETREDRAW nicht (bzw. es geht wohl nicht wegen dem setzen von columns - genau hab ich da noch nicht geschaut). Da wäre wieder WS_EX_COMPOSITED besser. Das kann ich ja machen (das geht ohne Probleme) aber ich muss den Wert wieder abziehen. Das erreiche ich wohl so:
NewExStyle := GetWindowLong(LB.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED;
SetWindowLong(LB.Handle, GWL_EXSTYLE, NewExStyle);
Delphi-Quellcode:
Aber dann flickert die ListBox 1x auf. Das ist unschön. Habe auch schon "LockWindowUpdate" probiert. Geht leider nicht. Wenn es beim abziehen von WS_EX_COMPOSITED immer 1x flickert, dann nützt mir das ganze anschalten nicht. Ich kann leider nicht WS_EX_COMPOSITED immer an lassen. Dann macht WM_SETREDRAW wieder kein Sinn.
NewExStyle := GetWindowLong(LB.Handle, GWL_EXSTYLE);
SetWindowLong(LB.Handle, GWL_EXSTYLE, NewExStyle and not WS_EX_COMPOSITED); Jemand ne Idee wie ich beim abschalten von WS_EX_COMPOSITED das flickern wegbekomme? |
AW: Abziehen von WS_EX_COMPOSITED = Flicker
Hi,
ich kann noch nicht so ganz nachvollziehen, was Du genau erreichen willst. In delphi würde ich mit BeginUpdate ... EndUpdate arbeiten. Tomy |
AW: Abziehen von WS_EX_COMPOSITED = Flicker
SetRedraw=False ist eine Art von BeginUpdate bzw. DisableControls
und Composited entspricht einem DoubleBuffered. Also im Prinzip will er wohl "viele" Änderungen machen und dabei das übermäßige Zeichnen unterbinden. Hast es so mal versucht?
Code:
SetRedraw(False)
SetStyle(GetStyle and not Composited) SetRedraw(True) |
AW: Abziehen von WS_EX_COMPOSITED = Flicker
Danke noch für die Tipps.
Hab sehr viel ausprobiert. Auch durch einen Tipp inzwischen mit diesem SetRedraw gearbeitet. Ob nun SetRedraw, WS_EX_COMPOSITED, DoubleBuffered... ich kam schon an mein Ziel. Null Flackern aber der Aufbau wurde recht langsam. Alles hat so seine Vor- und Nachteile. Letztendlich nutze ich nichts mehr direkt bzw. WS_EX_COMPOSITED entsprechend auf Aktionen. Verarbeite "wm_erasebkgnd" selber und nur in einer Scroll-Aktion wird speziell "WS_EX_COMPOSITED" abgeschaltet. Das kurze Flickern/Flackern mancher Items bekommt man dann gar nicht mit (zumindest in meinem Fall). Das einschalten von WS_EX_COMPOSITED flackert dagegen nicht. Ist halt alles einfacher, wenn man mit den Komponenten nicht so viel macht. Bei einer größeren Anwendung mit viel Source und Möglichkeiten braucht man hier und da schon so manch Zaubertrick. Da hilft es dann nicht mehr, nur DoubleBuffered (als Beispiel) einzuschalten. Ich muss mich aber im großen Ganzen immer herantasten und viel ausprobieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz