当用户在CListCtrl中选择一行时,我想执行一些代码(报表视图,我不关心其他查看模式)。
我如何捕捉此事件?我可以映射一些消息或像“OnSelectionChanged”这样的方法吗?
答案 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...
}