Как обнаружить изменение выбора CListCtrl? - PullRequest
29 голосов
/ 23 сентября 2009

Я хочу выполнить некоторый код, когда пользователь выбирает строку в CListCtrl (просмотр отчета, меня не волнуют другие режимы просмотра).

Как мне поймать это событие? Есть ли какое-то сообщение, которое я могу отобразить, или метод типа «OnSelectionChanged» или что-то в этом роде?

Ответы [ 4 ]

39 голосов
/ 23 сентября 2009

Также попробуйте:

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...
    }
}
10 голосов
/ 19 октября 2012

Есть несколько уведомлений, основанных на том, что происходит.

Если вы выбираете элемент, но ничего еще не выбрано, вы получите одно уведомление об изменении LVIF_STATE: uNewState & LVIS_SELECTED. Новый выбранный предмет будет найден по адресу:

pNMListView->iItem

Если элемент выбран до выбора нового объекта, вы получите три изменения состояния:

Сначала вам сообщат, что предыдущий элемент в фокусе теряет фокус:

pNMListView->uOldState & LVIS_FOCUSED

Затем вы получите уведомление о том, что старый элемент не выбран:

pNMListView->uOldState & LVIS_SELECTED

Наконец, вы получите новое состояние выбора предмета:

pNMListView->uNewState & LVIS_SELECTED

(снова посмотрите на iItem для вновь выбранного элемента)

Итак, ловушка, с которой мы столкнулись, состоит в том, что, поскольку отмена выбора элемента приводит к двум уведомлениям, мы выполняем много повторяющихся, иногда вредных, обработок. В итоге мы выполнили эту обработку только для 2-го сообщения (pNMListView->uOldState & LVIS_SELECTED) и пропустили ту же обработку после уведомления о потере фокуса.

4 голосов
/ 25 сентября 2009

Джеидот прав.

Я просто хочу добавить, что OnSelectionChanged () не существует, поскольку ListView поддерживает множественный выбор (хотя это можно отключить). Следовательно, просмотр списка с одним выбором отправит вам два события: старый элемент не выбран и новый элемент выбран.

0 голосов
/ 30 июня 2014

В моей Visual Studio 2010 визуальный редактор объявляет обратный вызов в заголовочном файле диалога следующим образом:

afx_msg void OnLbnSelchangeListOnvif();

и в исходном файле:

BEGIN_MESSAGE_MAP(CDialogOnvif, CDialog)
    ON_LBN_SELCHANGE(IDC_LIST_ONVIF, &CDialogOnvif::OnLbnSelchangeListOnvif)
END_MESSAGE_MAP()

void CDialogOnvif::OnLbnSelchangeListOnvif()
{
    // do stuff...
}
...