Mfc 单击CListCtrl中的另一列项目时,多选将丢失 请查看屏幕截图(这是一个示例) 我有一个包含两列的列表视图,第一列是“名称”,第二列是“状态” 当我点击第二列中的灯泡时,它的状态将在“开”和“关”之间变化 目前,我需要实现一个多选功能。使用ctrl或shift选择多行,然后单击其中的任意一行,并切换所有选定项目的状态

Mfc 单击CListCtrl中的另一列项目时,多选将丢失 请查看屏幕截图(这是一个示例) 我有一个包含两列的列表视图,第一列是“名称”,第二列是“状态” 当我点击第二列中的灯泡时,它的状态将在“开”和“关”之间变化 目前,我需要实现一个多选功能。使用ctrl或shift选择多行,然后单击其中的任意一行,并切换所有选定项目的状态,mfc,clistctrl,Mfc,Clistctrl,问题是: 当我点击“灯泡”时,多重选择将丢失。这意味着当我使用API GetSelectedCount时,它将返回0 我的调查: 当我单击“灯泡”时,将触发有关项目更改的事件。OnItemChanged事件将在OnClick事件之前触发(这就是为什么API GetSelectedCount将在事件OnClock中返回0)。 我想缓存事件OnItemChanged中的多个选定项,但我失败了,因为每个项都会触发OnItemChanged事件一次 例如:如果我在列表视图中选择了3个项目,然后单击第3个

问题是:

当我点击“灯泡”时,多重选择将丢失。这意味着当我使用API GetSelectedCount时,它将返回0

我的调查:

当我单击“灯泡”时,将触发有关项目更改的事件。OnItemChanged事件将在OnClick事件之前触发(这就是为什么API GetSelectedCount将在事件OnClock中返回0)。 我想缓存事件OnItemChanged中的多个选定项,但我失败了,因为每个项都会触发OnItemChanged事件一次

例如:如果我在列表视图中选择了3个项目,然后单击第3个项目的“灯泡”,则OnItemChanged事件将被触发3次,以通知这3个项目已取消选择。所以,在(单击灯泡)的OnClick事件中,我不知道在以前的操作中选择了哪些项目

此外,单击“灯泡”后,我仍然希望保留multi-selectionw

任何帮助都将不胜感激

ON_NOTIFY_REFLECT(LVN_项目已更改,OnItemChanged已更改)

在通知、反映和执行时(NM单击、OnClick)

void CListCtrl::OnItemChanged(NMHDR*pNMHDR,LRESULT*pResult){……}

BOOL CListCtrl::OnClick(NMHDR*pNMHDR,LRESULT*pResult){……}


我知道这是一个老问题,但我通过截取OnLButtonDown消息解决了这个问题

首先将ON_WM_LBUTTONDOWN()添加到消息映射声明中。 添加函数原型afx_msg void OnLButtonDown(UINT,CPoint);到您的列表控件类

我的函数看起来有点像这样:

   afx_msg void OnLButtonDown(UINT, CPoint)
    {       
        //We need to intercept the left button down
        //message so that we don't lose our multi-select
        //if the user has clicked on an icon
        DWORD pos = GetMessagePos();
        CPoint pt(short(LOWORD(pos)), short(HIWORD(pos)));
        ScreenToClient(&pt);

        uint flags;           
        int itemIndex = HitTest(pt, &flags);

        //We didn't hit a list item or an icon
        if (itemIndex == -1 || !(LVHT_ONITEMICON & flags))
        {
           ::CListCtrl::OnLButtonDown(var, point);
           return;
        }
        else
        {
            uint selectedItemCount = GetSelectedCount();
            int nItem = -1;
            if (selectedItemCount > 0)
            {      

                for (nItem = GetNextItem(-1, LVNI_SELECTED); nItem >= 0; 
                nItem = GetNextItem(nItem, LVNI_SELECTED))
                {    
                    //Do whatever you need to do to selected items
                }
            }
        }
    }

这是列表控件的标准行为。如果要同时执行多项选择并将所有选定项设置为新状态,通常的方法是实现右键单击上下文菜单。在菜单中,您可以有一个菜单项,如“启用选定项”。当用户单击此菜单项时,您可以遍历列表中的所有项,以便将所选项的状态修改为所需状态。我找到了一个实现此功能的解决方案。只需在“PreTranslateMessage”中截取消息即可。设置一些标志,例如bLight=true;然后,在clistctrl itemchanging事件中,如果blant=true,则将*result=1;