当用户在 CListCtrl 中选择一行时,我想执行一些代码(报告视图,我不关心其他查看模式)。
我如何捕捉这个事件?是否有一些我可以映射的消息或诸如“OnSelectionChanged”之类的方法或类似的方法?
当用户在 CListCtrl 中选择一行时,我想执行一些代码(报告视图,我不关心其他查看模式)。
我如何捕捉这个事件?是否有一些我可以映射的消息或诸如“OnSelectionChanged”之类的方法或类似的方法?
也试试:
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...
}
}
根据正在发生的事情,有一些通知。
如果您正在选择一个项目并且尚未选择任何内容,您将收到一个 LVIF_STATE 更改通知:uNewState & LVIS_SELECTED。新选择的项目将在以下位置找到:
pNMListView->iItem
如果在您选择新对象之前选择了一个项目,您将获得三个状态更改:
首先,您将被告知上一个焦点项目正在失去焦点:
pNMListView->uOldState & LVIS_FOCUSED
然后会通知您旧项目正在被取消选择:
pNMListView->uOldState & LVIS_SELECTED
最后,您将获得新的项目选择状态:
pNMListView->uNewState & LVIS_SELECTED
(再次查看 iItem 以获取新选择的项目)
所以我们遇到的陷阱是,因为项目取消选择会导致两个通知,我们做了很多重复的,有时是有害的,处理。我们最终做的只是对第二条消息进行此处理(pNMListView->uOldState & LVIS_SELECTED)
,并在失去焦点通知后跳过相同的处理。
djeidot 是正确的。
我只想补充一点,没有 OnSelectionChanged() 因为 ListView 支持多选(尽管可以禁用)。因此,单选列表视图将向您发送两个事件:未选择旧项目和已选择新项目。
在我的 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...
}