CListCtrl 虚拟列表显示复选框

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

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

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

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

3、在LVN_GETDISPINFO事件中显示状态

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

[html]  view plain copy 在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 plain copy 在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

posted @ 2022-03-12 22:04  xiaomodecnblogs  阅读(219)  评论(0编辑  收藏  举报