32

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

我如何捕捉这个事件?是否有一些我可以映射的消息或诸如“OnSelectionChanged”之类的方法或类似的方法?

4

4 回答 4

44

也试试:

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...
    }
}
于 2009-09-23T13:40:58.013 回答
13

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

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

pNMListView->iItem

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

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

pNMListView->uOldState & LVIS_FOCUSED

然后会通知您旧项目正在被取消选择:

pNMListView->uOldState & LVIS_SELECTED

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

pNMListView->uNewState & LVIS_SELECTED

(再次查看 iItem 以获取新选择的项目)

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

于 2012-10-19T18:15:03.910 回答
4

djeidot 是正确的。

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

于 2009-09-25T15:16:31.747 回答
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...
}
于 2014-06-30T13:30:08.723 回答