How to detect a CListCtrl selection change?

落爺英雄遲暮 提交于 2019-12-28 16:30:35

问题


I want to execute some code when the user selects a row in a CListCtrl (report view, I don't care about the other viewing modes).

How do I catch this event? is there some message I can map or a method like "OnSelectionChanged" or something like that?


回答1:


Also try:

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



回答2:


There are a few notifications based on what's happening.

If you are selecting an item and nothing is selected yet, you will get one LVIF_STATE change notification: uNewState & LVIS_SELECTED. The newly selected item will be found at:

pNMListView->iItem

If an item is selected before you select a new object, you'll get three state changes:

First you will be informed that the previous item in focus is losing focus:

pNMListView->uOldState & LVIS_FOCUSED

Then you will be notified that the old item is being unselected:

pNMListView->uOldState & LVIS_SELECTED

Finally, you will get the new item selection state:

pNMListView->uNewState & LVIS_SELECTED

(again look at iItem for newly selected item)

So the pitfall we ran across is that, because item deselection results in two notifications, we were doing a lot of repetitive, sometimes detrimental, processing. What we ended up doing was only doing this processing for the 2nd message (pNMListView->uOldState & LVIS_SELECTED), and skipping the same processing after the loss of focus notification.




回答3:


djeidot is right on.

I just want to add that there is no OnSelectionChanged() because the ListView supports multi-selection (although this can be disabled). Therefore, a single-selection listview will send you two events: Old item unselected AND New item selected.




回答4:


On my Visual Studio 2010, the visual editor declares a callback in the dialog header file like this:

afx_msg void OnLbnSelchangeListOnvif();

and in the source file:

BEGIN_MESSAGE_MAP(CDialogOnvif, CDialog)
    ON_LBN_SELCHANGE(IDC_LIST_ONVIF, &CDialogOnvif::OnLbnSelchangeListOnvif)
END_MESSAGE_MAP()

void CDialogOnvif::OnLbnSelchangeListOnvif()
{
    // do stuff...
}


来源:https://stackoverflow.com/questions/1462895/how-to-detect-a-clistctrl-selection-change

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!