CListCtrl 虚拟列表显示复选框
今天写了个虚拟列表显示复选框的演示程序,放在了:http://download.csdn.net/detail/daiafei/6617913,有不明白的朋友可以下载一下。
在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得力不从心了,那么是不是大量数据就不能使用CListCtrl空间进行显示了那,当然不是了,CListCtrl控件支持虚拟列表技术,采用虚拟列表对大量数据进行显示,既可以提高速度(不是一般的快,是非常快),还可以减少内存占用,不过虚拟列表和普通的列表实现显示的方式不太一样,并且在使用虚拟列表之后,你会发现如果你设置了LVS_EX_CHECKBOXES风格想显示复选框,但复选框位置是空白的,并没有显示复选框,这里就教你怎么显示虚拟列表中的复选框。
1、你需要记录当前选择的记录的状态(选中或未选中),这样你才能在列表需要数据的时候得到当前数据的选择状态(虚拟列表中需要自己管理数据的选中状态)
2、在单击事件中处理状态的改变
3、在LVN_GETDISPINFO事件中显示状态
下面给出一些显示时的代码
- void CTestUndeleteDlg::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)
- {
- NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
- // TODO: 在此添加控件通知处理程序代码
- //Create a pointer to the item
- LV_ITEM* pItem= &(pDispInfo)->item;
- //Which item number?
- int itemid = pItem->iItem; //行号
- //Do the list need text information?
- if (pItem->mask & LVIF_TEXT)
- {
- switch (pItem->iSubItem)//列号
- {
- case 0:
- text.Format(L"%d行 %d列",itemid,pItem->iSubItem );
- break;
- case 1:
- text.Format(L"%d行 %d列",itemid,pItem->iSubItem );
- break;
- case 2:
- text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;
- case 3:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;
- case 4:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;
- case 5:text.Format(L"%d行 %d列",itemid,pItem->iSubItem ); break;
- }lstrcpyn(pItem->pszText, text, pItem->cchTextMax);//建议使用该函数复制字符给子项,复制的更安全,字符数由pItem->cchTextMax给出 text.Empty();
- } pItem->mask |= LVIF_STATE;
- pItem->stateMask = LVIS_STATEIMAGEMASK;
- if(Itemlist[itemid].bChecked)//判断结构中保存的当前行的选中状态
- {
- pItem->state |= INDEXTOSTATEIMAGEMASK(2); //取你自己保存的state状态, 需要用到INDEXTOSTATEIMAGEMASK
- }else
- {
- pItem->state |= INDEXTOSTATEIMAGEMASK(1); //未选中
- }
- *pResult = 0;
- }
在单击事件中直接判断Itemlist[itemid].bChecked的选中状态即可,对该值进行取反操作然后更新状态即可完成选中与取消
- void CTestUndeleteDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult){ NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
- // TODO: 在此添加控件通知处理程序代码
- //Create a pointer to the item
- LV_ITEM* pItem= &(pDispInfo)->item;
- int itemid = pItem->iItem; //行号 Itemlist[itemid].bChecked = !Itemlist[itemid].bChecked;//改变状态
- m_ListAll.RedrawItems(itemid , itemid );//重绘当前项 *pResult = 0;}