CListCtrl Mehrfachselektion
-
Hallo,
ich möchte innerhalb eines Dialogs auf Selektion (und Deselektion) der Items eines CListCtrl reagieren.
In folgender Art habe ich das implementiert:void CMyDialog::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if (pNMListView->uNewState & LVIS_SELECTED) { int selectedItem = pNMListView->iItem; // Mache etwas mit selektiertem Item } else { // Mache etwas mit deselektiertem item } *pResult = 0; }
Wenn ich einzelne Items selektiere, funktioniert das auch wie gewünscht. Wenn ich allerdings mehrere Items selektiere, ergeben sich falsche "Item-States".
Ein Beispiel: Wenn ich das erste Item innerhalb des Controls per Mausklick selektiere, funktioniert obiger Code. Wenn ich dann (mittels gedrückter Shift-Taste) die nächsten 3 Items "hinzuselektiere", ergeben sich korrekte States (LVIS_SELECTED) für die neu hinzugekommenen Items, für das erste Item hingegen nicht.
Ich habe bereits überprüft, dass
GetSelectedCount()
die korrekte Anzahl selektierter Items liefert.
Und mir ist ebenfalls klar, dass ich in diesem Message-Handler natürlich auch lande, wenn z.B. ein Item seinen Fokus verliert. Aber trotzdem sollte ich doch im if-Block landen, wenn ein Item (nach welch einer Zustandsänderung auch immer) anschließend noch selektiert ist und im else-Block, wenn das nicht der Fall ist.Mache ich da einen Denkfehler?
Es wäre nett, wenn mir jemand auf die Sprünge helfen könnte.Edit: vielleicht noch eine kleine Ergänzung:
Es handelt sich um ein CListCtrl mit LVS_REPORT Style, aber ich denke, das sollte keinen Unterschied machen...
-
Hat sich inzwischen erledigt.
Falls jemand mal ein ähnliches Problem hat oder einen ähnlichen Fehler macht. In meinem Fall habe ich das folgendermaßen gelöst:void CMyDialog::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uNewState & LVIS_SELECTED) != (pNMListView->uOldState & LVIS_SELECTED)) { if (pNMListView->uOldState & LVIS_SELECTED) { // item wurde deselektiert } else { // item wurde selektiert } } *pResult = 0; }
-
IMHO musst Du auch testen ob in uChanged überhaupt LVIF_STATE erwähnt wird!
-
Martin Richter schrieb:
IMHO musst Du auch testen ob in uChanged überhaupt LVIF_STATE erwähnt wird!
Also so ungefähr(?)
void CMyDialog::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uChanged & LVIF_STATE) != LVIF_STATE) return; if ((pNMListView->uNewState & LVIS_SELECTED) != (pNMListView->uOldState & LVIS_SELECTED)) { if (pNMListView->uOldState & LVIS_SELECTED) { // item wurde deselektiert } else { // item wurde selektiert } } *pResult = 0; }
Ohne schien es zwar auch zu funktionieren, aber es klingt vernünftig, das noch zu prüfen. Danke für den Hinweis!