ListCtrl处理大数据时的方法之虚拟列表总结

来源:互联网 发布:win10电脑优化软件 编辑:程序博客网 时间:2024/05/21 18:39
 使用虚拟列表来处理ListCtrl的大数据
  首先要把ListCtrl的外观风格的Owner Data设为true,据说也可以这样c_lstRcdData.SetExtendedStyle(c_lstRcdData.GetExtendedStyle() |LVS_OWNERDATA );
(注意:不要把Owner Data Fixed风格设为
true),然后要把ListCtrl每个Column设置为c_lstRcdData.InsertItem(Column,LPSTR_TEXTCALLBACK);
风格设置就完成了,


  然后在插入显示数据之前调用c_lstRcdData.SetItemCountEx( v_VecUSDataUserInfo.size() ,
LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL );第一个参数是总的个数(这样它好帮你安排滑块的位置),


  当列表控件要显示文字时,会向父控件发送TVN_GETDISPINFO,要想显示就必须处理这个消息,如果
你设断点无法进入这个函数说明你前几步可能没有设好,把我写的函数先贴过来了


void UCFVUserIDSel::OnGetdispinfoListUserdata(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVDISPINFO *pDispInfo1 = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pDispInfo1;
LV_ITEM* pItem= &(pDispInfo)->item;
int iItemIndx= pItem->iItem  ;
CString lv_strTemp;
if ( iItemIndx < v_VecUSDataUserInfo.size() )
{
if (pItem->mask & LVIF_TEXT) //字符串缓冲区有效
{
switch(pItem->iSubItem)
{
case 0: //填充数据项的
lstrcpyn( pItem->pszText , v_VecUSDataUserInfo[iItemIndx].v_ID , pItem->cchTextMax );
break;
case 1: //填充子项1
lstrcpyn( pItem->pszText , v_VecUSDataUserInfo[iItemIndx].v_Time , pItem->cchTextMax );
break;
case 2: //填充子项2
lstrcpyn(pItem->pszText,v_VecUSDataUserInfo[iItemIndx].v_Data,pItem->cchTextMax  );
break;
default:
break;
}

*pResult = 0;
}
}
这是最简单的填充方式了,有一点就是你不要再这个消息处理函数里面添加例如
    if( .... )
       {
            lstrcpyn(...);///显示到ListCtrl的Item上
        }
因为这样会留下空白行,一个折中的办法就是你在外面就判断好要插入的数据,先放入一个Vector里面,不要太担心效率,至少我
还没有知道更好的办法(注:如果有哪一位笔者知道,并不啬赐教,我与广大笔友都会很感谢的,嘿嘿),我测试过了如果要显示
三列内容,二万条数据在开始的时候只需要话不到2秒(1.5秒),
   关于虚拟列表的扩展阅读:http://blog.csdn.net/weiqubo/article/details/7089261
    注:我在我博客的资源里添加了两个我个人写的两个关于虚表的实例程序,不明白的可以再看看
   
下面整理了一下我处理大数据时用的分页方法,因为处理大数据时,这个比较好实现
    注:我在我博客的资源里添加了两个我个人写的两个关于分页的实例程序,不明白的可以再看看
原创粉丝点击