Flimmerfreie Listbox durch virtuellen Bereich ?



  • Hallo,

    ich muss eine Listbox mit mehreren Spalten und Reihen alle 50ms Updaten.
    Leider flimmert mir das Dingen jetzt durch die Erease Background Methode
    immer recht stark. Das XP flickerfree Flag scheint auch nicht wirklich
    zu funktionieren. (doublebuffer)
    Nun habe ich davon gehört, das man die Listbox irgendwo ausserhalb des Dialoges
    verschieben soll und dort nach einem Neuzeichnen 1:1 in den Dialog an die
    gewohnte Stelle kopieren sollte (ohne den lästigen Erase background).
    Wie macht man sowas ?
    Also ich denke mir das so: movewindow mit der Tabelle ausserhalb des Dialoges
    Aber dann habe ich nicht mehr die alte Possition in der ich was reinmalen könnte.
    Ausserdem: wie kopiert man denn den ganzen Inhalt ?

    Gruss
    thenoname


  • Mod

    Sicher das Du ListBox meinst und nicht ListView?

    Das verschieben und neu anzeigen flimmert genauso, denn auch in diesem Fall wird ein WM_ERASEBKGND gesendet.

    Wie hast Du Double Bufering impülementiert für dieses Fenster?



  • Hi, CListCtrl mein ich.
    Doublebuffer hab ich mit .SetExtendedStyle implementiert.
    Also Dragdrop einer Listbox aus der Toolbox, Membercontrolvariable und dann den set.
    Ich hab jetzt ne Klasse abgeleitet und bei Erasebackground der neuen CListCtrl
    ein return True (oder False, macht dasselbe).
    Dadurch sind jetzt die Werte flimmerfrei, aber aus irgendeinem Grund flackern
    ab und zu die Linien ?

    Gruss


  • Mod

    thenoname schrieb:

    Hi, CListCtrl mein ich.
    Doublebuffer hab ich mit .SetExtendedStyle implementiert.
    Also Dragdrop einer Listbox aus der Toolbox, Membercontrolvariable und dann den set.

    Verstehe ich nicht. Was gibt es für einen Extended Style der was mit Double Buffering zu tun hat. Vor allem beim Anzeigen?

    thenoname schrieb:

    Ich hab jetzt ne Klasse abgeleitet und bei Erasebackground der neuen CListCtrl
    ein return True (oder False, macht dasselbe).
    Dadurch sind jetzt die Werte flimmerfrei, aber aus irgendeinem Grund flackern
    ab und zu die Linien ?

    Du meinst Gridlines?
    Die werden IMHO erst nach dem Paint Zyklus (also nach dem Anzeigen) aller Daten angezeigt. Dies ist natürlich verzögert und man meint dadurch ein flimmern zu sehen. Würde ic als ByDesign sehen.

    Aber müssen soviele Updates wirklich sein?



  • Ja, es ist eine Echtzeitanzeige eines integer Arrays.
    Ich habe schon einen Thread gemacht der sie "nur" alle 50ms anzeigt.
    Aber drüber ist leider nicht 😞

    m_tablebox.SetExtendedStyle(LVS_EX_DOUBLEBUFFER);
    

    wenn du einen anderen Weg kennst -> raus damit !!

    Wieso werden die Gridlines kurze Zeit weiss ? oder ist das nur ein optischer Effekt ?
    Ich meine, wenn der Hintergrund nicht mehr gelöscht wird, was macht die weiss ?
    Der reingepinselte Text mit Hintergrund ?


  • Mod

    Dir ist klar, dass dies nur ab XP und mit Manifest funktionieren kann?



  • XP -> Ja, ich würde dann halt darauf verzichten, das es unter 2K und 98 gut ausschaut.

    Manifest -> hmmm, wo kann ich nachschauen um sicherzugehen, das es drinne ist ?

    Irgendein "spezielles" Manifest vielleicht ?
    Bleibt dann aber schon abwärtskompatibel ?


  • Mod

    Ohne Manifest für ComCtl32 Version 6 kannst Du dieses Feature nicht verwenden!



  • Hab ich verstanden, nur wie bringt man es nachträglich rein, bzw. wo kann
    man nachschauen ob es evtl. schon vorhanden ist ?
    Im Resourcenexplorer find ich schonmal nichts.



  • Kann es sein, das die 6.0 er Elemente .net und unicode sind ?
    Weil beim Erzeugen in der stdafx.h folgendes steht :

    #ifdef _UNICODE
    #if defined _M_IX86
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_IA64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_X64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #else
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #endif
    #endif
    

    Hab jetzt auch mal Probehalber eine xml mit XPStyle als manifest eingebunden.
    Da tut sich nicht mehr als ohne. (nunja, rundere Komponenten)
    Es flimmert wie gehabt. 😡

    Gruss


  • Mod

    Unter VS2005 werden diese Manifeste nur eingebunden wenn Du Dein Projekt als UNICODE kompilierst. Angeblich ist das by design.
    Ich vermute die wollen die MBCS Probleme im COMCTL32 6.0 damit umschiffen.

    Ansonten wüsste ich jetzt auch nicht weiter.

    Bau Dir ein eigenes Control, dass diesen Anforderungen mit dieser hohen Update Rate entspricht. Wenn es nur ein statisches Grid ohne Scrollbars ist sollte das kein Problem sein.

    Oder Du steigst auf ein anderes Grid um CGridCtrl z.B. Das flackert garantiert nicht 🙂


Log in to reply