How to detect a CListCtrl selection change?

前端 未结 4 778
囚心锁ツ
囚心锁ツ 2020-12-10 10:33

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 the

相关标签:
4条回答
  • 2020-12-10 10:49

    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.

    0 讨论(0)
  • 2020-12-10 10:51

    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...
    }
    
    0 讨论(0)
  • 2020-12-10 10:58

    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.

    0 讨论(0)
  • 2020-12-10 11:01

    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...
        }
    }
    
    0 讨论(0)
提交回复
热议问题