当我在CListCtrl中单击另一个列项时,多选将丢失

时间:2013-03-26 06:47:39

标签: mfc clistctrl

  1. 请看屏幕截图(这是一个样本)
  2. 我有一个包含2列的列表视图,第一个是“name”,第二个是“status”
  3. 当我点击第二列中的灯泡时,它将在状态'on'和'off'之间切换
  4. 目前,我需要实现一个多选功能。它是使用ctrl或shift来选择几行,然后单击它们中的任何一个'灯泡',并切换所有选定项目的状态。
  5. 问题是:

    当我点击“灯泡”时,所选的多重音色将会丢失。这意味着当我使用API​​ GetSelectedCount时,它将返回0.

    我的调查:

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

    例如:如果我在列表视图中多选了3个项目,然后单击第3个项目的“灯泡”,则会触发事件OnItemChanged 3次,以通知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){......}

    screen shot sample

1 个答案:

答案 0 :(得分:1)

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

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

我的功能看起来像这样:

{
  path: '**',
  redirectTo: '',
  pathMatch: 'full'
}