Zeichnen von CListCtrl sperren während gefüllt wird



  • Hallo zuzammen!

    Wie es aus dem Titel ersichtlich ist, möchte ich das Zeichnen von CListCtrl beim Füllen sperren. Wenn ich grosse Datenmenge in das CListCtrl bei der Laufzeit lade, verschwindet es von der Oberfläche und man sieht nur das Scrollbalken. Das sieht ziemlich häßlich aus. Wie kann ich das sperren oder zumindest sichtbar machen, wie das Control gefüllt wird?

    Danke im voraus.



  • evtl. nach jeder gefüllten Zeile neu zeichnen lassen



  • Ja, danke.
    Darauf bin ich schon gekommen:

    m_ListCtrl.Update(i);
    

    Das bremst aber unheimlich. Ich neige immer mehr dazu, das Control zu sperren. Aber wie...?



  • Falls du das
    m_ListCtrl.Update(i);
    für alle Datensätze machst:
    vielleicht kannst du mit GetCountPerPage() feststellen lassen, wie viele Zeilen angezeigt werden können, und dann machst du das Update(i) nur für diese Anzahl.

    Ansonsten habe ich keine Ahnung, was du mit "sperren" meinst...



  • Vielleicht kannst es damit versuchen:

    m_ListCtrl.EnableWindow( FALSE );
    

    oder ein 2. ListCtrl erzeugen, was nicht angezeigt wird und diesen Füllen.
    Danach die beiden ListCtrls vertauschen.



  • Hi, bei CListCtrl mit sehr großen Datenmengen ist es häufig ratsam, mit der Option "Benutzerdaten" (Owner Data, LVS_OWNERDATA) zu arbeiten.

    Wenn Du die Nachricht LVN_GETDISPINFO bearbeitest, fütterst Du das Listcontrol immer nur mit den Daten, die gerade in der Liste angezeigt werden müssen. Auf diese Weise ist die Liste extrem schnell, auch wenn Du sehr viele Einträge hast.

    Habe hier gerade ein Projekt mit über 550.000 DB-Records in einer Ansicht und die Anzeige des CListCtrl kommt sofort nach Aufruf.

    Link: http://www.codeguru.com/Cpp/data/mfc_database/article.php/c1127/

    Gruß T. 🙂



  • Danke an alle!

    Ich werde mich jetzt bestimmt mit einigen lüstigen Themen beschäftigen müssen 😋



  • Versuch's mal so:

    CWaitCursor wait;
    m_ListCtrl.SetRedraw(FALSE); // verhindert Neuzeichnen
    
    ... // Liste füllen
    
    m_ListCtrl.SetRedraw(TRUE); // Neuzeichnen wieder ermöglichen
    m_ListCtrl.Invalidate();    // Neuzeichnen auslösen
    

Anmelden zum Antworten