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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ClistCtrlMFC中的一个列表控件类,用于显示和编辑列表数据。ClistCtrl控件中的列表项可以被选择,而多选框是一种选择控件,可以有多个选项同时被选中。 在ClistCtrl控件中实现多选框功能可以通过自定义颜色来实现。具体操作如下: 1. 首先,我们需要为ClistCtrl控件启用扩展风格,以支持多选项的功能。可以通过调用SetExtendedStyle函数,设置LVS_EX_CHECKBOXES标志位来实现,代码如下: m_listCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES); 这样,每个列表项前面都会显示一个多选框。 2. 接下来,我们需要为控件中的每个多选框设置自定义颜色。可以通过调用SetItemState函数,设置LVIS_SELECTED和LVIS_CUT状态,然后再调用SetItemText函数设置颜色,代码如下: m_listCtrl.SetItemState(i, LVIS_SELECTED | LVIS_CUT, LVIS_SELECTED | LVIS_CUT); m_listCtrl.SetItemText(i, 0, _T("选中项的颜色")); 这样,当用户选择了某个列表项的多选框时,该项的文本颜色就会被改变为自定义的颜色。 3. 如果需要取消选择某个列表项的多选框,可以通过调用SetItemState函数,设置LVIS_SELECTED状态为0,代码如下: m_listCtrl.SetItemState(i, 0, LVIS_SELECTED); 这样,已选择的列表项就会变为未选择状态。 通过以上步骤,我们可以在ClistCtrl控件中实现自定义颜色的多选框功能。用户可以通过选择列表项的多选框,来实现多项选择的操作,并且可以自定义选择项的颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值