2
  1. 请看屏幕截图(这是一个示例)
  2. 我有一个包含 2 列的列表视图,第一列是“名称”,第二列是“状态”
  3. 当我单击第二列中的灯泡时,它将在状态“开”和“关”之间切换
  4. 目前,我需要实现一个多选功能。就是用ctrl或者shift选择多行,然后点击其中任意一个“灯泡”,切换所有选中项的状态。

问题是:

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

我的调查:

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

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

此外,单击“灯泡”后,我仍然想保留多选。

任何帮助都感激不尽?

ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemChanged)

ON_NOTIFY_REFLECT_EX(NM_CLICK, OnClick)

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

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

屏幕截图示例

4

1 回答 1

1

我知道这是一个老问题,但我通过拦截 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
                }
            }
        }
    }
于 2018-08-14T06:49:01.767 回答