Hay algunas notificaciones basadas en lo que está sucediendo.
Si está seleccionando un elemento y no se ha seleccionado nada aún, recibirá una notificación de cambio LVIF_STATE: uNewState & LVIS_SELECTED. El elemento recién seleccionado se puede encontrar en:
pNMListView->iItem
Si se selecciona un elemento antes de seleccionar un nuevo objeto, obtendrá tres cambios de estado:
Primero se le informará de que el elemento anterior de el foco está perdiendo el foco:
pNMListView->uOldState & LVIS_FOCUSED
A continuación, se le notificará que el viejo artículo está siendo seleccionada:
pNMListView->uOldState & LVIS_SELECTED
Finalmente, obtendrá el nuevo estado de selección de elementos:
pNMListView->uNewState & LVIS_SELECTED
(de nuevo un vistazo a iItem para el artículo que acaba de seleccionar)
Así la trampa que nos encontramos al otro lado es que, ya que los resultados elemento Desactivar en dos notificaciones , estábamos haciendo un montón de procesamiento repetitivo, a veces perjudicial. Lo que terminamos haciendo fue solo hacer este procesamiento para el segundo mensaje (pNMListView->uOldState & LVIS_SELECTED)
, y omitir el mismo procesamiento después de la pérdida de la notificación de foco.
Esto no va a coger un cambio cuando selecciona tres elementos con shift, pero luego selecciona cualquiera de ellos (lo que anula la selección de los otros dos, pero mantiene este seleccionado). ¿Alguna solución para eso excepto mantener una lista de elementos seleccionados? –
No puedo probarlo en este momento, pero creo que tendrá que seleccionar deselección así como selección: para atrapar la deselección solo use 'if ((pNMListView-> uChanged & LVIF_STATE) && (pNMListView-> uOldState & LVNI_SELECTED) &&! (PNMListView -> uNewState & LVNI_SELECTED)) ' – djeidot
@djeidot: Muchas gracias, ayudó. Cuando está incrustado en su propia clase de control, esto también puede reducirse a ON_NOTIFY_REFLECT (LVN_ITEMCHANGED, y OnItemSelected) – mox