Подтвердить что ты не робот

Как определить изменение выбора CListCtrl?

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

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

4b9b3361

Ответ 1

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

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...
    }
}

Ответ 2

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

Если вы выберете элемент и ничего не выбрали, вы получите уведомление об изменении 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) и пропуску той же обработки после потери уведомления о фокусе.

Ответ 3

djeidot находится прямо на.

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

Ответ 4

В моей 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...
}