CListBox OwnerDrawn



  • Hallo,
    ich nutze unter Visual Studio 6 eine Listbox, die mit LBS_OWNERDRAWVARIABLE erstellt wird, da ich die Einträge farblich etwas gestalten möchte.
    Füge ich nun einen Eintrag hinzu, erhält die Listbox eine EraseBackground Nachricht zeichnet diesen neu und muß dann natürlich alle bereits enthaltenen Listbox Elemente neuzeichnen über drawItem und ans Ende den neuen Eintrag. Dies führt dazu, dass bei jedem Zufügen die Listbox deutlich flackert, da erst der Background neu gezeichnet wird.
    Wenn ich LBS_OWNERDRAWVARIABLE streiche, flackert die Listbox nicht beim Zufügen von Elementen.
    Wer veranlaßt beim Zufügen eines Elementes in einer ownerdrawn Listbox das EraseBackground ?
    Wie kann man diesen Effekt vermeiden ?
    Irgendwelche Ideen ?
    Peter


  • Mod

    Wenn es um das Hinzufügen von vielen Einträgen geht solltest Du WM_SETREDRAW FALSE verwenden.

    Ansonsten: Ist eine Listbox nicht Ownerdrawvariable hat jedes Item eine feste Höhe. Man kann detailiert ausrechnen was neu gezeichnet werden muss. Oder grollt werden muss.
    Bei Onerdraw-Variable wird alles nach unten hin neu angezeigt.

    Ansonsten ist ein CListView mit Customdraw weitaus effektiver, wenn es um Items gleiche Höhe geht.



  • Es werden in der app immer nur einzelne Einträge ergänzt.

    Was mich nur irritiert ist, dass der Background des gesamten ListBox-Fensters neu gezeichnet wird, wenn in einer nicht gefüllten Listbox nur ein Eintrag unten angehängt wird.
    Es wird leider nicht nur der Teil neu gezeichnet, der sich ändert.
    Als ob hinterrücks ein Invalidate() erfolgt.

    Wo kann ich mich denn einklinken, um auszurechnen, was neu gezeichnet werden muß. Nach meinem AddString() wird automatisch ein Paint() aufgerufen, was sinnvoll ist. Doch dieses stößt ein EraseBackground an, welches den background des gesamten Fensters neu zeichnet.
    Wie finde ich heraus, wer das anstößt, bzw. wieso es das gesamte Fenster ist?

    Wenn ich ein anderes Fenster über meine app ziehe und wieder wegziehe, wird nur der verdeckte Bereich neugezeichnet. So sollte es sein.
    Wieso wird alles neu gezeichnet, wenn ein Item in der Listbox ergänzt wird ?

    Peter



  • Alle Tests zeigen, dass sich das ListCtrl bei Ergänzungen immer vollständig neu zeichnet. Dies erzeugt ein ziemlich Flackern.
    Deshalb bin ich jetzt zum CRichEditCtrl gewechselt. Dies ist deutlich performater bezüglich des Neuzeichnens.


Anmelden zum Antworten