visual-c++ mfc clistctrl

visual c++ - ¿Cómo detectar un cambio en la selección de CListCtrl?



visual-c++ mfc (4)

En mi Visual Studio 2010, el editor visual declara una devolución de llamada en el archivo de encabezado de diálogo de esta manera:

afx_msg void OnLbnSelchangeListOnvif();

y en el archivo fuente:

BEGIN_MESSAGE_MAP(CDialogOnvif, CDialog) ON_LBN_SELCHANGE(IDC_LIST_ONVIF, &CDialogOnvif::OnLbnSelchangeListOnvif) END_MESSAGE_MAP() void CDialogOnvif::OnLbnSelchangeListOnvif() { // do stuff... }

Quiero ejecutar algún código cuando el usuario selecciona una fila en un CListCtrl (vista de informe, no me importan los otros modos de visualización).

¿Cómo atrapo este evento? ¿Hay algún mensaje que pueda mapear o un método como "OnSelectionChanged" o algo así?


Hay algunas notificaciones basadas en lo que está sucediendo.

Si está seleccionando un elemento y todavía no se ha seleccionado nada, recibirá una notificación de cambio LVIF_STATE: uNewState & LVIS_SELECTED. El artículo recién seleccionado se encontrará en:

pNMListView->iItem

Si se selecciona un elemento antes de seleccionar un objeto nuevo, obtendrá tres cambios de estado:

Primero, se le informará que el elemento anterior en foco está perdiendo enfoque:

pNMListView->uOldState & LVIS_FOCUSED

Entonces se le notificará que el elemento anterior está siendo deseleccionado:

pNMListView->uOldState & LVIS_SELECTED

Finalmente, obtendrá el nuevo estado de selección de elementos:

pNMListView->uNewState & LVIS_SELECTED

(mire nuevamente iItem para el elemento recién seleccionado)

Entonces, la trampa que encontramos es que, debido a que la anulación de la selección de los ítems resulta en dos notificaciones, estábamos haciendo un montón de procesamiento repetitivo, a veces perjudicial. Lo que terminamos haciendo solo fue 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.


Intenta también:

BEGIN_MESSAGE_MAP(cDlgRun, CDialog) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2, OnItemchangedList2) END_MESSAGE_MAP() /* ... */ void cDlgRun::OnItemchangedList2(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if ((pNMListView->uChanged & LVIF_STATE) && (pNMListView->uNewState & LVIS_SELECTED)) { // do stuff... } }


djeidot está en lo cierto.

Solo quiero agregar que no hay OnSelectionChanged () porque ListView admite la selección múltiple (aunque esto se puede deshabilitar). Por lo tanto, una vista de lista de selección única le enviará dos eventos: Artículo anterior no seleccionado Y Nuevo elemento seleccionado.