Listbox flackern verhindern



  • Hi, und gleich kommt noch eine Frage hinterher 😉 Hoffentlich wird die so gut gelöst wie die letzte!

    Ich habe eine Listbox deren Inhalt ständig aktualisiert wird. Ein Eintrag wird so verändert:

    // wparam = index, lparam = text
     SendMessage(listbox, LB_DELETESTRING, wparam, 0);
     SendMessage(listbox, LB_INSERTSTRING, wparam, lparam);
    

    Das Ganze flackert bei vielen Einträgen / hohen "Aktualisierungsraten" leider sehr, gibt es eine Möglichkeit das zu unterbinden?
    WM_SETREDRAW hilft nicht wirklich, genauso wie auch LockWindow(). Ich bin da gerade etwas mit meinem Latein am Ende..


  • Mod

    Der einzige Weg hier ist wirklichnur WM_SETREDRAW FALSE setzen, alle Updates durchführen, TRUE setzen und ein RedrawWindow nachzusenden.

    Besser smoother in der Grafik ist ein List-Control/View.



  • Das Problem ist dass wenn ich SETREDRAW an die Listbox selbst sende, scheint das nicht wirklich viel Einfluss zu haben. Wenn ich an das main Window sende muss ich danach InvalidRect oder sowas aufrufen und dann flackert das eher mehr als vorher..


  • Mod

    WM_SETREDRAW an eine Listbox hat definitv Wirkung, aber sicher den Nachteil, dass Du RedrawWindow (InvalideRect/UpdateWindow) ausführen musst.



  • MSDN sagt zu WM_SETREDRAW:
    This message sets or clears the redraw flag. If the redraw flag is cleared, the content of the given window is not updated after each change, and the window is not repainted until the redraw flag is set. For example, an application that must add several items to a list box can clear the redraw flag, add the items, and then set the redraw flag. Finally, the application can call the InvalidateRect function to cause the list box to be repainted.


  • Mod

    Und die MSDN Doku stimmt nicht für alle COMCTL32-Controls.
    Wenn man auf die SetRedraw anwendet bekommt man oft genug nur Schrott heruas und falsche Anzeigen.



  • Aha ... naja, die MSDN sagt auch:
    This message can be useful if an application must add several items to a list box.

    Jetzt wo Du es so sagst, sehe ich das erste Mal, daß es laut MSDN offensichtlich auch für andere Controls außer Listbox eingesetzt werden kann ...

    Aber für Listboxen habe ich es schon erfolgreich benutzt.


Anmelden zum Antworten