如何检测CListCtrl选择更改?

rec*_*rec 30 mfc clistctrl visual-c++

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

我如何抓住这个活动?是否有一些我可以映射的消息或像"OnSelectionChanged"这样的方法?

dje*_*dot 40

还试试:

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @djeidot:非常感谢,这有帮助.当嵌入在自己的Control类中时,可以将其简化为ON_NOTIFY_REFLECT(LVN_ITEMCHANGED,&OnItemSelected) (2认同)

小智 11

根据发生的情况,会有一些通知.

如果您正在选择项目但尚未选择任何内容,您将获得一个LVIF_STATE更改通知:uNewState和LVIS_SELECTED.新选择的项目将在以下位置找到:

pNMListView->iItem
Run Code Online (Sandbox Code Playgroud)

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

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

pNMListView->uOldState & LVIS_FOCUSED
Run Code Online (Sandbox Code Playgroud)

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

pNMListView->uOldState & LVIS_SELECTED
Run Code Online (Sandbox Code Playgroud)

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

pNMListView->uNewState & LVIS_SELECTED
Run Code Online (Sandbox Code Playgroud)

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

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