Flickerndes ListView



  • Hallo,
    ich habe folgendes Problem: In einer MFC-Anwendung habe ich eine System::Windows::Forms::ListView (also eine .NET-Klasse) integriert, in die regelmäßig neue Daten hinzugefügt werden. Diese Daten kommen zeilenweise an und müssen auch Zeilenweise angezeigt werden, zwischen zwei Zeilen liegen aber oft nur Bruchteile von Sekunden. Nun flickert aber die ListView extrem, sobald ich eine Zeile einfüge, was es sehr unangenehm macht, die Daten zu betrachten - selbst wenn die Zeile außerhalb des sichtbaren Bereichs eingefügt wird.

    Ich benutze MS Visual Studio .NET 2003 und programmiere für Windows XP. Eine Manifest-Datei habe ich in den Ordner, in dem die EXE erstellt wird, hineinkopiert, ich weiß nicht, ob sie richtig ist.

    Die Datenzeilen haben jeweils eine eigene Vorder- und Hintergrundfarbe (die sich von Zeile zu Zeile ändert, abhängig vom Inhalt). Ich habe bereits einige Stunden damit verbracht, eine Lösung zu suchen, und dabei folgende Ansätze gefunden und implementiert, leider ohne Erfolg:

    a) Per Message DoubleBuffering anschalten

    ::SendMessage(this->GetDlgItem(IDC_FRAMEWIN)->m_hWnd,(int) LVM_SETEXTENDEDLISTVIEWSTYLE,  LVS_EX_DOUBLEBUFFER,  LVS_EX_DOUBLEBUFFER);
    

    b) Die Klasse System::Windows::Forms::ListView ableiten und im Konstruktor den Style zu setzen, um DoubleBuffer einzuschalten und dazu noch die Message WM_ERASEBKGND abzufangen

    SetStyle( (ControlStyles)(ControlStyles::AllPaintingInWmPaint | ControlStyles::DoubleBuffer | ControlStyles::ResizeRedraw), true );
    
    SetStyle( ControlStyles::EnableNotifyMessage, true);
    
    protected: void OnNotifyMessage (Message m) {
      if(m.Msg != 0x14) ListView::OnNotifyMessage(m);
    }
    

    Dazu gibt es noch ein OnPaint, welches nur ListView::OnPaint aufruft, und ein OnPaintBackground, welches nichts tut. Diese werden jedoch nur aufgerufen, wenn ich auch ControlStyles::UserPaint setze, dann wird der Inhalt der ListView aber gar nicht mehr angezeigt - auch nicht, wenn mein OnPaintBackground ListView::OnPaintBackground aufruft.

    Hat irgendwer noch eine Idee, was ich gegen das Flickern machen könnte?

    Bevor Fragen kommen: Ich nutze ein ListView, weil die Daten in einer Tabelle und farbig (Vorder- und Hintergrund) dargestellt werden müssen und sowohl hinten Zeilen angefügt als auch vorne bei Bedarf wieder gelöscht werden müssen. Außerdem muss einstellbar sein, dass die Daten scrollen bzw. nicht scrollen (also bei neuen Daten die Ansicht nach unten springt), womit ich beim RichEdit Probleme hatte.

    Vielen Dank im Voraus!

    Gruß
    Jan



  • Das Problem hat sich erledigt. Die nötige manifest-Datei hieß nicht programm.exe.manifest, wie es sein soll, sondern nur programm.manifest - und deswegen ging die Lösung nicht 😡 . Nach Aktivierung des Manifest-Files ging alles.
    Sorry.


Anmelden zum Antworten