默认,点击操作会取消之前选中的行。如果我记忆之前行状态,在OnClick事件里面重新设置 SetItemState则会导致严重的重绘闪烁问题!
我慢动作分解,鼠标点击另一行后,其他的选择行会失去状态。我的需求是通过鼠标单击来实现多选。即点击1,3,5实现对1,3,5几行的选中,如果二次点击选中行,则翻转状态为未选中状态。

解决方案 »

  1.   

    一般的多选操作 按下Ctrl键,然后选择
      

  2.   

    我的需求是通过鼠标单击来实现多选
    CListCtrl
    有·多选 属性 , 不必自己搞 !
      

  3.   

    CListCtrl支持多行选择
      

  4.   

    我的需求是不要通过CTRL/SHIFT键,实现多选。而是仅仅通过鼠标单击实现多选。没有键盘,触屏操作。
      

  5.   

    触屏,没键盘,不支持ctrl/shift多选。咋办?
      

  6.   

    触屏,没键盘,不支持ctrl/shift多选。咋办?办法有很多,第一个可以模拟ctrl按键,
    另一个为什么非得用选中状态来做,不可以加个勾选框吗?
      

  7.   


    #pragma once// CMyListCtrl
    class CMyListCtrl : public CListCtrl
    {
      DECLARE_DYNAMIC(CMyListCtrl)public:
      CMyListCtrl()
        virtual ~CMyListCtrl() public:
      virtual BOOL PreTranslateMessage(MSG* pMsg)
      {
        switch(pMsg->message)
        {
        case(WM_LBUTTONDOWN):
        case(WM_LBUTTONUP):
          {
            pMsg->wParam |= MK_CONTROL; //模拟按下CTRL按键
            break;
          }
        }    return __super::PreTranslateMessage(pMsg);
      }protected:
      DECLARE_MESSAGE_MAP()
    };
      

  8.   

    听起来很像LVS_EX_AUTOCHECKSELECT啊?
      

  9.   

    知道自绘原理的话就简单了。在ListCtrl内部自己维护一个各行是否选中的变量,比如std::map<int, bool> m_mapSelectState;绘制的时候根据bool值来绘制,点击的时候根据bool来设置新值,就搞定了
      

  10.   

    void CMyListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    #if 1 // see PreTranslateMessage
    SetFocus();// blue
    //
    LVHITTESTINFO hti;
    hti.pt = point;
    int Idx = HitTest(&hti);// or SubItemHitTest
    afxDump << Idx << "\n";
    if (Idx<0) return;
    if(GetItemState(Idx, LVIS_SELECTED))
    {
    SetItemState(Idx,0, LVIS_SELECTED);
    }
    else
    {
    SetItemState(Idx,LVIS_SELECTED, LVIS_SELECTED);
    }
    #else
    CListCtrl::OnLButtonDown(nFlags, point);
    #endif
    }
      

  11.   

    参考8楼的方法, 允许列表在第一列加个checkbox, 用户只需选中checkbox即可