Nachricht von der ListView
-
Ich möchte die Position in einer ListView auslesen sobald ein Item bzw. Zeile ausgewählt wurde.
Die Funktion ist klar:
ListView_GetSelectionMark(GetDlgItem(hDlg, MeineListe));
Aber welche Nachricht sendet die ListView wenn etwas makiert wurde? Ein MouseClick macht nur bedingt Sinn weil man in der ListView auch per Tastatur auswählen kann. Hat jemand ne Idee?
Gruß Martin
-
Das Elternfenster bekommt eine WM_NOTIFY-Nachricht, LPARAM zeigt jeweils auf mindestens einen NMHDR. Wenn idFrom der ID der Listview und code LVN_ITEMCHANGED entspricht, dann wurde ein anderes Item ausgewählt.
Um Code nur einmal auszuführen (die Nachricht wird natürlich jeweils mehrfach gesendet, nicht nur für Items die an-, sondern auch für die, die abgewählt wurden), kannst du den LPARAM als Zeiger auf eine NMITEMACTIVATE-Struktur interpretieren und uNewState per Bitand auf LVIS_SELECTED überprüfen.
-
War es so gemeint?
if( (((NMHDR *)lParam)->idFrom) == MeineListe & (((NMHDR *)lParam)->code) == LVN_ITEMCHANGED ) i = ListView_GetSelectionMark(GetDlgItem(hDlg, MeineListe));
Das Notify wird jetzt nur noch 3 mal bearbeitet. Das ist schonmal gut. Allerding wird bei jeder Änderung der vorhergehende Wert (Zeilennummer der ListView) ausgegeben..??
-
case WM_NOTIFY: { LPNMHDR hdr = reinterpret_cast<LPNMHDR>(lParam); if(hdr->idFrom==/*ID*/ && hdr->code==LVN_ITEMCHANGED) { LPNMITEMACTIVATE act = reinterpret_cast<LPNMITEMACTIVATE>(lParam); if(act->uNewState & LVIS_SELECTED) { // act->iItem ist der Index des angewählten Items } } return 0; }
In einer single-selection listview kannst du auch erreichen, dass der Code nur durchlaufen wird, wenn sich der Status auch wirklich geändert hat:
if((act->uNewState & LVIS_SELECTED) && !(act->uOldState & LVIS_SELECTED))
-
Prima! Vielen Dank!
Die erste Variante funktioniert schon perfekt. Die Nachricht wird nur einmal empfangen. Die Zweite probier ich noch aus. Das reinterpretcast wurde von meinem Compiler nicht akzeptiert. Sicher ein Fehler von mir. Aber so gings dann:
case WM_NOTIFY: if ( ((NMHDR *)lParam)->idFrom == MeineListe && ((NMHDR *)lParam)->code == LVN_ITEMCHANGED ) { if ( ((NMITEMACTIVATE *)lParam)->uNewState & LVIS_SELECTED) { i = ((NMITEMACTIVATE *)lParam)->iItem; // Index der Liste } } return TRUE;
Gruß Martin