Fensterinhalt von Listview neu zeichnen lassen
-
Wie kann ich den Inhalt eines Fensters, in meinem Fall ist es ein Listviewfenster, neu zeichnen lassen. Der Hintergrund ist, ich entferne einen Item aus dem Listview und da bleibt was stehen, wenn ich jedoch jetzt die Sortierfunktion schicke, dann wird der Item und die "Faraktale" die sich im LV Fenster befinden schön aussortiert. Welche Möglichkeit habe ich noch den Listviewinhalt neu zeichnen zu lassen ohne jedoch die Sortierfunktion zu benutzen? Mit "UpdateWindow(...)" geht es nicht, warschienlich weil
The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.
die Clientarea die upgedatet werden soll ja eigentlich leer ist oder? Hmm was mach ich da jetzt?
-
Schon mal mit InvalidateRect() probiert?
-
Offtopic: Funktioniert das Sortieren bei dir mit 2 Spalten? Also das du beim Klick auf Header 1 die Spalte 1 sortierst und beim Klick auf Header 2 die Spalte 2? Mich interessiert das, weil ich schon eine halbe Ewigkeit an dem Problem sitze, es aber nie hinbekomme bei 2 oder mehr Spalten eben eine bestimmte Spalte zu sortieren...
Wenn das bei dir so funktioniert, könntest du mir vllt. zeigen wie? Danke schonmal.Ansonsten zu deiner Frage: InvalidateRect () (wie ungültig schon gesagt hat).
-
@Fake oder Echt
ich mach das so, im eventhadle meines hauptfensters siehst so aus:case LVN_COLUMNCLICK:{ SendMessage(Wnd_Listview, LVM_SORTITEMS, ((LPNMLVDISPINFO)lParam)->item.iItem, (LPARAM)SortFunc_Wnd_Listview); break; }und die Sortierfunktion sieht so aus:
int CALLBACK SortFunc_Wnd_Listview(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort){ switch((int)lParamSort){ case 0: return _stricmp(info[(int)lParam1].name, info[(int)lParam2].name); case 1: return _stricmp(info[(int)lParam1].city, info[(int)lParam2].city); case 2: if (info[(int)lParam1].age < info[(int)lParam2].age){ return 1; }else if (info[(int)lParam1].age > info[(int)lParam2].age){ return -1; }else{ return 0; } } }ich hab das jetzt mal als abgespeckte Version aus meinem Quellcode herausgeschrieben. Natürlich ist es noch sinnvoll eine Variable zu haben die die Sortierrichtung festlegt und eventuell einen richtunsabhängigen Sortindicator in die Headercontroll einzufügen. Natürlich bringt dir die ganze Sortierfunktion mal garnix, wenn du nicht schon beim Einfügen des Items in den Listview den lParam des Items belegt hast, ich hab da einfach mal den Index von meiner Datenstruktur verwand und so gehts ganz gut.
Naja und zu InvalidateRect funtzt net so, hmm mal sehn was ich da mchen kann um das Fenster upzudaten.
-
UpdateWindow ()...
glaub zwar nicht, aber vllt in Kombination mit InvalidateRect ()...und dann zu der Sortierfunktion: Kannst du das mit dem Belegen von lParam vllt. genauer erklären oder einfach zeigen? Weil ich weiß an sich, dass da mein Problem liegt aber weiß nicht, was ich da genau falsch mache...
EDIT: habe falsch gelesen, muss mal gucken, dass ich das i-wie hinkriege...
-
Grundsätzlich sollte jede Operaion auf ein ListControl (Einfügen/Ausfügen) auch ein InvalidateRect auslösen. Wenn etwas stehen belibt vermute ich eher, dass Du selbst in dem ListCtrl herumzeichnest.
Keines der Standardwindow Controls benötigt solch einen Extra Aufruf von InvalidateRect. Ausnahme: Man verwendet WM_SETREDRAW!
-
ListView_Update ()
-
@Fake oder Echt: und haste die Sortierfunktion hinbekommen? Hier noch mal eine Ergänzung zum Einfügen des Items
LVITEM lv_item; memset (&lv_item, 0, sizeof(LVITEM)); lv_item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_IMAGE; lv_item.iItem = ListView_GetItemCount(Wnd_Listview); //einfügen am Ende lv_item.iImage = 0; lv_item.iSubItem = 0; lv_item.lParam = (LPARAM)index; //das hier ist ganz wichtig, diese Variabele wird der Sortierfunktion übergeben lv_item.pszText = LPSTR_TEXTCALLBACK; //den Text der Items/Subitems hole ich mir in meinem eventhandle unter "LVN_GETDISPINFO" //sehr großer Vorteil: der Listview aktualisiert sich zur Laufzeit selbern, wenn sich meine Datenstruktur ändert! //daher meine Frage zur Aktualisierung des LV ohne Aufruf der Sortierfunktion SendMessage(Wnd_Listview, LVM_INSERTITEM, 0, (LPARAM)(const LPLVITEM)&lv_item);