Listenfeld: Verspätete Aktualisierung
-
Moin,
ich habe mir ein Listenfeld erstellt.
Das Listenfeld wird innerhalb einer Schleife mit Daten gefüttert.
Das Problem ist, dass diese Daten erst nach dem Beenden der Schleife erscheinen und nicht direkt.
Anhand des vertikalen Scrollbalkens weiß ich ,dass die Liste die Daten schon innerhalb der Schleife erhalten hat, da sich dieser vergrößert. Nur die Anzeige bleibt eben leider konstant.Hab schon:
- Invalidate();
- liste.ShowWindow;
- liste.UpdateWindow;
- liste.Invalidate;
- liste.InvalidateRect;
ausprobiert (Hab sie einfach ohne Hintergedanken durchprobiert).Hat jemand nen Rat parat??
Danke im Voraus
chackie-lee
-
Keiner eine Idee??
Das Problem tritt sowohl bei CListBox als auch bei CListCtrl auf.
Der "eigentliche" Inhalt dieser Liste wird stets aktuell gehalten, nur leider wird dies nicht direkt auf dem Bildschirm angezeigt.ip = jobListe.getItemIP(0); // Liest IP aus nem Array m_Info.InsertString(0,"Job geladen: " + conIpToString2(ip) + ":" + conIntToString(jobListe.getItemPort(0)) + " "+ jobListe.getItemFile(0)); //Sollte Ip + Port + Dateiname direkt ausgeben. SetDlgItemText(IDC_STATIC_FILE,"Datei: " + jobListe.getItemFile(0)); // Wird direkt angezeigt SetDlgItemText(IDC_STATIC_FILESIZE,"Datei-Größe: 10,23 MB"); // Wird direkt angezeigt SetDlgItemText(IDC_STATIC_SPEED,"Geschwindigkeit: 23,4 kb/s"); // Wird direkt angezeigt for(int i=0; i<=100; i++) //Einfache Progress Simulation { m_pr_Job.SetPos(i); // Progress-Balken _sleep(50); } jobListe.delItemFirst(); m_Job.DeleteItem(0); // Listenfeld: Löscht obersten Eintrag, nachfolgende Rücken nach, aber was außerhalb des schtbaren Feldes ist, rückt nicht nach SetDlgItemText(IDC_STATIC_JOBS,"Jobs: " + conIntToString(jobListe.size())); // Wird direkt angezeigt m_Info.InsertString(0,"Job verarbeitet und gelöscht"); // Wird in m_Info geladen aber nicht direkt angezeigt
Also nochmal zusammengefasst:
IDC_STATIC - wird direkt angezeigt
ICD_LIST - wird bearbeitet aber erst nach Funktionsende angezeigtIch glaub ja, dass die Lösung ziemlich simpel ist, aber ich komm einfach nicht drauf.
In voller Hoffnung
chackie-lee
-
Vielleicht m_Info.RedrawWindow() ?
-
Du musst die Messages abholen. In deinem Falle einfach nur die WM_Paint.
Z.B. so:
void DoPaintMessageLoop()
{
MSG message1;
while(::PeekMessage(&message1,NULL,WM_PAINT,WM_PAINT, PM_REMOVE))
{
::TranslateMessage(&message1);
::DispatchMessage(&message1);
}
}
-
Juppie, es funktioniert.
Vielen Dank euch beiden.
Gruß
chackie-lee
-
Ist keine Lösung.
GUI und Schleifen vertragen sich nunmal nicht.
Informiere dich hier über Threads.
GUI und Funktion sollte sowieso getrennt werden.