如何检测CListCtrl选择更改?

时间:2009-09-22 22:10:25

标签: visual-c++ mfc clistctrl

当用户在CListCtrl中选择一行时,我想执行一些代码(报表视图,我不关心其他查看模式)。

我如何捕捉此事件?我可以映射一些消息或像“OnSelectionChanged”这样的方法吗?

4 个答案:

答案 0 :(得分:39)

还可以尝试:

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

答案 1 :(得分:9)

根据发生的事情,有一些通知。

如果您正在选择一个项目但尚未选择任何内容,您将收到一个LVIF_STATE更改通知:uNewState& LVIS_SELECTED。新选择的项目位于:

pNMListView->iItem

如果在选择新对象之前选择了某个项目,您将获得三个状态更改:

首先,您将被告知关注的上一个项目正在失去焦点:

pNMListView->uOldState & LVIS_FOCUSED

然后,系统会通知您未选择旧项目:

pNMListView->uOldState & LVIS_SELECTED

最后,您将获得新的项目选择状态:

pNMListView->uNewState & LVIS_SELECTED

(再次查看iItem的新选项)

因此,我们遇到的陷阱是,因为项目取消选择导致两个通知,我们做了很多重复,有时是有害的处理。我们最终做的只是对第二条消息(pNMListView->uOldState & LVIS_SELECTED)进行此处理,并在失去焦点通知后跳过相同的处理。

答案 2 :(得分:4)

djeidot是对的。

我只想补充说没有OnSelectionChanged()因为ListView支持多选(尽管可以禁用)。因此,单选列表视图将向您发送两个事件:未选择旧项目和选择新项目。

答案 3 :(得分:0)

在我的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...
}