Как определить изменение выбора CListCtrl?
Я хочу выполнить некоторый код, когда пользователь выбирает строку в CListCtrl (представление отчета, меня не волнуют другие режимы просмотра).
Как поймать это событие? есть ли какое-нибудь сообщение, которое я могу отобразить, или метод типа "OnSelectionChanged" или что-то в этом роде?
Ответы
Ответ 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...
}