CListCtrl 虚拟列表显示复选框

转载 2015年07月07日 19:00:33

今天写了个虚拟列表显示复选框的演示程序,放在了:http://download.csdn.net/detail/daiafei/6617913,有不明白的朋友可以下载一下。

在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得力不从心了,那么是不是大量数据就不能使用CListCtrl空间进行显示了那,当然不是了,CListCtrl控件支持虚拟列表技术,采用虚拟列表对大量数据进行显示,既可以提高速度(不是一般的快,是非常快),还可以减少内存占用,不过虚拟列表和普通的列表实现显示的方式不太一样,并且在使用虚拟列表之后,你会发现如果你设置了LVS_EX_CHECKBOXES风格想显示复选框,但复选框位置是空白的,并没有显示复选框,这里就教你怎么显示虚拟列表中的复选框。

1、你需要记录当前选择的记录的状态(选中或未选中),这样你才能在列表需要数据的时候得到当前数据的选择状态(虚拟列表中需要自己管理数据的选中状态)

2、在单击事件中处理状态的改变

3、在LVN_GETDISPINFO事件中显示状态

下面给出一些显示时的代码

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CTestUndeleteDlg::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)  
  2. {  
  3.     NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);  
  4.     // TODO: 在此添加控件通知处理程序代码  
  5.     //Create a pointer to the item  
  6.     LV_ITEM* pItem= &(pDispInfo)->item;  
  7.     //Which item number?  
  8.     int itemid = pItem->iItem; //行号  
  9.   
  10.     //Do the list need text information?  
  11.     if (pItem->mask & LVIF_TEXT)  
  12.     {  
  13.         switch (pItem->iSubItem)//列号  
  14.         {  
  15.         case 0:           
  16.             text.Format(L"%d行 %d列",itemid,pItem->iSubItem );   
  17.             break;  
  18.         case 1:   
  19.             text.Format(L"%d行 %d列",itemid,pItem->iSubItem );  
  20.                             break;  
  21.         case 2:  
  22.             text.Format(L"%d行 %d列",itemid,pItem->iSubItem );                            break;  
  23.  case 3:text.Format(L"%d行 %d列",itemid,pItem->iSubItem );                            break;  
  24.  case 4:text.Format(L"%d行 %d列",itemid,pItem->iSubItem );                            break;  
  25.  case 5:text.Format(L"%d行 %d列",itemid,pItem->iSubItem );                            break;  
  26.  }lstrcpyn(pItem->pszText, text, pItem->cchTextMax);//建议使用该函数复制字符给子项,复制的更安全,字符数由pItem->cchTextMax给出        text.Empty();  
  27.     }          pItem->mask |= LVIF_STATE;  
  28.     pItem->stateMask = LVIS_STATEIMAGEMASK;  
  29.     if(Itemlist[itemid].bChecked)//判断结构中保存的当前行的选中状态  
  30.     {  
  31.         pItem->state |=   INDEXTOSTATEIMAGEMASK(2);   //取你自己保存的state状态,   需要用到INDEXTOSTATEIMAGEMASK   
  32.     }else  
  33.     {  
  34.         pItem->state |=   INDEXTOSTATEIMAGEMASK(1);   //未选中  
  35.     }  
  36.           
  37.     *pResult = 0;  
  38. }  

 

在单击事件中直接判断Itemlist[itemid].bChecked的选中状态即可,对该值进行取反操作然后更新状态即可完成选中与取消

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void CTestUndeleteDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult){         NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);  
  2.     // TODO: 在此添加控件通知处理程序代码  
  3.     //Create a pointer to the item  
  4.     LV_ITEM* pItem= &(pDispInfo)->item;  
  5.          int itemid = pItem->iItem; //行号     Itemlist[itemid].bChecked = !Itemlist[itemid].bChecked;//改变状态  
  6.          m_ListAll.RedrawItems(itemid , itemid );//重绘当前项  *pResult = 0;}  


 http://blog.csdn.net/daiafei/article/details/6825034

MFC ListBox实现CheckBox功能(附带复选框)

1、首先在窗口上拖放一个ListBox控件,假设其资源ID为IDC_LIST1;      如果界面有多个ListBox,可以拖动多个该控件到界面,如何设其资源ID。 2、如上所述修改该L...
  • pugongying1988
  • pugongying1988
  • 2012年12月20日 17:02
  • 7280

clistctrl单行多行选中问题

 我用了一个clistctrl我想实现如下功能 1.鼠标点一个后要整行被选中比如说 沥沥 789 妹妹 421 粼粼 542 我要是实现鼠标点 妹妹 或者 421这一行被选中 我现在是单个被选中 2....
  • dadalan
  • dadalan
  • 2008年09月04日 20:03
  • 10111

CListCtrl控件实现点击单行选中当前CheckBox点击CheckBox实现多选功能

首先创建CListCtr时设置风格 刚开始没看清楚把LVS_SHOWSELALWAYS设置到扩展风格了。导致鼠标移动到哪,选中项就跟到哪。 看清了时LVS   还是LVS_EX     因为...
  • qing666888
  • qing666888
  • 2015年12月09日 10:40
  • 2481

VC中给列表控件CListCtrl添加复选框

目的:使列表框(CListCtrl)的每个项(item)前面有个复选,用来标明是否选中,提交数据是只选择选中的 方法:为列表框(CListCtrl)多加一个LVS_EX_CHECKBOXES风格...
  • zx249388847
  • zx249388847
  • 2016年05月15日 23:06
  • 1763

CListCtrl控件的标题栏添加checkbox

CListCtrl控件的标题栏添加checkbox CListCtrl控件添加checkbox很容易,直接设置CListCtrl的风格就可以了。但是在标题栏也添加checkbox,实现全选和全不...
  • JUST_DO_1122
  • JUST_DO_1122
  • 2016年08月15日 19:30
  • 2000

带有CheckBox的CListCtrl中Check状态的获取

带有CheckBox的CListCtrl中Check状态的获取 原创代码下载:CheckListCtrl.rar 1 建立测试工程      新建一个对话框工程,并添加一个CListCtrl...
  • ZXGIS
  • ZXGIS
  • 2012年02月13日 14:07
  • 4698

CListCtrl 虚拟列表显示复选框

在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得...
  • daiafei
  • daiafei
  • 2011年09月27日 10:39
  • 5536

List Control控件中及时捕获checkbox被选中的消息的解决方案

我的功能需求是:用户可以在List Control里添加item,当无选项被选中(即Checkbox没被选中),删除按钮不可用;当用户点击checkbox选中item时,删除按钮可用。 图示如下: ...
  • qiuyeting
  • qiuyeting
  • 2012年03月12日 15:31
  • 4075

CListCtrl虚拟列表技术

创建列表列 m_LstCtr.InsertColumn(0, L"列1", LVCFMT_CENTER, 40); m_LstCtr.InsertColumn(1, L"列2", LVCFMT_CEN...
  • love3s
  • love3s
  • 2012年10月28日 14:59
  • 5491

CListCtrl 虚拟列表

平常所用到的列ListView/ListCtrl控件,都是只有行至几百行数据,直至今日,在项目中遇到了上10W量级数据条,终于感觉到普通加载的艰辛,遂到网上乱找一通,发现大同小异,转载了这篇比较详细的...
  • mylovepanning
  • mylovepanning
  • 2015年05月22日 14:46
  • 1395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CListCtrl 虚拟列表显示复选框
举报原因:
原因补充:

(最多只允许输入30个字)