ci sono un paio di notifiche basate su ciò che sta accadendo.
Se si seleziona un elemento e non è ancora selezionato, verrà inviata una notifica di modifica di LVIF_STATE: uNewState & LVIS_SELECTED. La voce appena selezionata sarà disponibile all'indirizzo:
pNMListView->iItem
Se si seleziona una voce prima di selezionare un nuovo oggetto, si otterrà tre cambiamenti di stato:
Per prima cosa viene informato che la voce precedente messa a fuoco è perdere la concentrazione:
pNMListView->uOldState & LVIS_FOCUSED
Poi vi verrà notificato che il vecchio articolo è stato selezionata:
pNMListView->uOldState & LVIS_SELECTED
Infine, si otterrà il nuovo stato di selezione degli articoli:
pNMListView->uNewState & LVIS_SELECTED
(di nuovo un'occhiata a iItem per la voce appena selezionata)
Così la trappola ci siamo imbattuti in è che, perché i risultati oggetto disattivazione nel due notifiche , stavamo facendo un sacco di elaborazione ripetitiva, a volte dannosa. Quello che abbiamo finito per fare solo in questo modo di elaborazione per il 2 ° messaggio (pNMListView->uOldState & LVIS_SELECTED)
, e saltando la stessa elaborazione dopo la perdita di notifiche di attivazione.
fonte
2012-10-19 18:15:03
Questo non prenderà un cambiamento quando selezioni tre elementi con shift, ma poi ne selezioni uno (che deseleziona gli altri due, ma mantiene selezionato quello). Qualche soluzione per questo tranne mantenere un elenco di elementi selezionati? –
Al momento non riesco a testarlo, ma penso che dovrai prendere la deselezione e anche la selezione: per catturare la deselezione basta usare 'if ((pNMListView-> uChanged & LVIF_STATE) && (pNMListView-> uOldState & LVNI_SELECTED) &&! (PNMListView -> uNewState e LVNI_SELECTED)) ' – djeidot
@djeidot: Grazie mille, mi ha aiutato. Se incorporato nella propria classe Control, questo potrebbe anche essere ridotto a ON_NOTIFY_REFLECT (LVN_ITEMCHANGED, & OnItemSelected) – mox