CListCtrl 虚拟列表显示复选框
2015-07-07 19:00
465 查看
今天写了个虚拟列表显示复选框的演示程序,放在了:http://download.csdn.net/detail/daiafei/6617913,有不明白的朋友可以下载一下。
在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得力不从心了,那么是不是大量数据就不能使用CListCtrl空间进行显示了那,当然不是了,CListCtrl控件支持虚拟列表技术,采用虚拟列表对大量数据进行显示,既可以提高速度(不是一般的快,是非常快),还可以减少内存占用,不过虚拟列表和普通的列表实现显示的方式不太一样,并且在使用虚拟列表之后,你会发现如果你设置了LVS_EX_CHECKBOXES风格想显示复选框,但复选框位置是空白的,并没有显示复选框,这里就教你怎么显示虚拟列表中的复选框。
1、你需要记录当前选择的记录的状态(选中或未选中),这样你才能在列表需要数据的时候得到当前数据的选择状态(虚拟列表中需要自己管理数据的选中状态)
2、在单击事件中处理状态的改变
3、在LVN_GETDISPINFO事件中显示状态
下面给出一些显示时的代码
[html] view
plaincopy
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的选中状态即可,对该值进行取反操作然后更新状态即可完成选中与取消
[html] view
plaincopy
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;}
/article/7882193.html
在用ClistCtrl控件显示大量数据的时候速度相当慢,而且对内存的占用也是相当大,特别是针对数据库中数据显示的时候,因为数据库中的数据量一般都比较庞大,所以如果使用默认的CListCtrl控件就显得力不从心了,那么是不是大量数据就不能使用CListCtrl空间进行显示了那,当然不是了,CListCtrl控件支持虚拟列表技术,采用虚拟列表对大量数据进行显示,既可以提高速度(不是一般的快,是非常快),还可以减少内存占用,不过虚拟列表和普通的列表实现显示的方式不太一样,并且在使用虚拟列表之后,你会发现如果你设置了LVS_EX_CHECKBOXES风格想显示复选框,但复选框位置是空白的,并没有显示复选框,这里就教你怎么显示虚拟列表中的复选框。
1、你需要记录当前选择的记录的状态(选中或未选中),这样你才能在列表需要数据的时候得到当前数据的选择状态(虚拟列表中需要自己管理数据的选中状态)
2、在单击事件中处理状态的改变
3、在LVN_GETDISPINFO事件中显示状态
下面给出一些显示时的代码
[html] view
plaincopy
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的选中状态即可,对该值进行取反操作然后更新状态即可完成选中与取消
[html] view
plaincopy
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;}
/article/7882193.html
相关文章推荐
- 1153 选择子序列
- ANE原生代码的调试(安卓)++flex通过ANE调试原生安卓代码
- hibernate基础之无法自动创建表总结
- grep与正则表达式
- PCB电路板元器件布局的一般原则
- 继承ActionBarActivity使用requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决办法
- iOS-compile_debug-crash_record
- 基于pgrouting的任意两点间的最短路径查询函数二
- Cannot find module 'socket.io'
- 斯坦福《机器学习》Lesson4感想-------2、广义线性模型
- g++ GNU g++常用编译选项用法
- 自我介绍
- 探究LayoutInflater的inflate()方法
- Hadoop之HDFS文件操作
- 决策树
- LeetCode Integer To Roman & Roman To Int
- 一切成功源于积累——20150707 外汇经典之双杀 Double Kill 叁杀 欧美 市场気持ち的解读
- Android CoordinatorLayout + AppBarLayout(向上滚动隐藏指定的View)
- Centos 6/7 源码升级内核
- Java基础日记———多线程