CListCtrl控件单击一行,如果保持前面选中的行为选中状态?

teleinfor 2019-11-15 03:05:54
默认,点击操作会取消之前选中的行。如果我记忆之前行状态,在OnClick事件里面重新设置 SetItemState则会导致严重的重绘闪烁问题!
我慢动作分解,鼠标点击另一行后,其他的选择行会失去状态。

我的需求是通过鼠标单击来实现多选。即点击1,3,5实现对1,3,5几行的选中,如果二次点击选中行,则翻转状态为未选中状态。
...全文
124 点赞 收藏 11
写回复
11 条回复
Sandrer 2019年11月25日
参考8楼的方法, 允许列表在第一列加个checkbox, 用户只需选中checkbox即可
回复 点赞
蒋晟 2019年11月16日
听起来很像LVS_EX_AUTOCHECKSELECT啊?
回复 点赞
schlafenhamster 2019年11月16日
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
}
回复 点赞
凌乱哥 2019年11月16日
知道自绘原理的话就简单了。在ListCtrl内部自己维护一个各行是否选中的变量,比如
std::map<int, bool> m_mapSelectState;
绘制的时候根据bool值来绘制,点击的时候根据bool来设置新值,就搞定了
回复 点赞
zgl7903 2019年11月15日

#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()
};

回复 点赞
孤客天涯 2019年11月15日
引用 5 楼 teleinfor 的回复:
[quote=引用 3 楼 孤客天涯 的回复:] CListCtrl支持多行选择
触屏,没键盘,不支持ctrl/shift多选。咋办?[/quote] 办法有很多,第一个可以模拟ctrl按键, 另一个为什么非得用选中状态来做,不可以加个勾选框吗?
回复 点赞
teleinfor 2019年11月15日
引用 3 楼 孤客天涯 的回复:
CListCtrl支持多行选择
触屏,没键盘,不支持ctrl/shift多选。咋办?
回复 点赞
teleinfor 2019年11月15日
我的需求是不要通过CTRL/SHIFT键,实现多选。而是仅仅通过鼠标单击实现多选。没有键盘,触屏操作。
引用 2 楼 schlafenhamster 的回复:
我的需求是通过鼠标单击来实现多选 CListCtrl 有·多选 属性 , 不必自己搞 !
回复 点赞
孤客天涯 2019年11月15日
CListCtrl支持多行选择
回复 点赞
schlafenhamster 2019年11月15日
我的需求是通过鼠标单击来实现多选
CListCtrl
有·多选 属性 , 不必自己搞 !
回复 点赞
zgl7903 2019年11月15日
一般的多选操作 按下Ctrl键,然后选择
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7972

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告