CListCtrl Virtual



  • Hallo,

    ich bin gerade dabei, ein CListCtrl auf Virtual umstellen. Dafür behandle ich die Nachricht LVN_GETDISPINFO.
    Das funktioniert auch perfekt. Nun habe ich aber ein Problem. In der alten Implementierung wurden
    in OnInitDialog erst alle Listenelement eingefügt und danach mit SetItemState und EnsureVisible ein bestimmtes
    Listenelement ausgewählt.

    Mit der neuen Implementierung wird erst OnInitDialog verlassen und dann kommen die LVN_GETDISPINFO-Nachrichten.
    Gibt es irgendeine Nachricht, die darauf hinweist, dass das Laden der Elemente erstmal fertig ist, solange man nicht
    scrollt? Dort könnte ich dann das SetItemState und EnsureVisible machen. Das darf natürlich auch nur beim erstmaligen
    Aufbau erfolgen, dazu könnte ich ja ein Flag einbauen.

    Danke und Gruß
    Christian


  • Mod

    Verstehe ich nicht. Du kannst doch jederzeit set item State aufrufen, oder EnsureVisible, solange das Item eben im korrekten Range ist.



  • Angenommen ich habe eine Liste mit 100 Elementen und möchte initial Eintrag 20 Angewählt haben:

    Wenn ich das SetItemstate und EnsureVisible in OnListGetDispInfo (Nachrichtenhandler-Methode für LVN_GETDISPINFO) mache, startet es erst einmal korrekt.

    Wenn ich dann aber Scrolle, "hakt" es bei 20 und ich kann nicht weiter Scrollen. Ist ja auch klar, weil beim Nachladen
    weiterer Items immer wieder EnsureVisible auf Element 20 aufgerufen wird.



  • Das ist ja auch die falsche Codestelle dafür.



  • @Th69 Genau. Daher ja meine Frage, wo ich das einbauen kann.



  • Warum nicht in OnInitDialog (wie bisher)?
    Du solltest vorher SetItemCountEx aufrufen.



  • @Th69 Klasse, vielen Dank!! Ich dachte, das ginge nicht.

    In der alten Methode FillItems wurde der zu setzende Index ermittelt. Den Code habe ich dann verschoben
    in meine OnListGetDispInfo. Daher war der Index natürlich in OnInitDialog noch nicht korrekt gesetzt und es hat nicht
    funktioniert. Und mir war nicht klar, dass man SetItemstate auch dann schon aufrufen kann, wenn die Listenelemente
    noch nicht gefüllt sind.

    Jetzt ermittle ich den Index im Vorfeld in OnInitDialog und alles funktioniert! Danke, mein Nachmittag ist gerettet. 🙂

    Bei der alten Methode FillItems wurde auch noch getrickst, um in einer anderen Klasse in der CustomDraw-Methode
    die schreibgeschützten Zeilen einzufärben:

    lvItem.mask |= LVIF_PARAM;
    lvItem.lParam = MhMskIsSpaReadOnly(nItem+1, m_pMkGena->m_nActCol) ? 1 : 0;

    Das kann aber m.E. jetzt nicht mehr funktionieren und tut es auch nicht.
    Oder gibt es da einen Trick?

    (Habe ich mit einem Workaround gelöst, indem ich einfach, anstatt lParam abzufragen, die Funktion
    MhMskIsSpaReadOnly direkt aufrufe.)


Anmelden zum Antworten