a、创建时添加 LVS_OWNERDATA

例如:

p_list_History->Create(LVS_SINGLESEL|LVS_REPORT|LVS_ALIGNLEFT|WS_BORDER|LVS_OWNERDATA ,CRect(left,top,right,bottom),this,IDC_LIST_HISTORY);
p_list_History->SetExtendedStyle(p_list_History->GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

b、对话框或者CListCtrl 子类响应三个消息

    ON_NOTIFY(LVN_GETDISPINFO, IDC_LIST_ALARM, OnGetdispinfoList)ON_NOTIFY(LVN_ODFINDITEM, IDC_LIST_ALARM, OnOdfinditemList)ON_NOTIFY(LVN_ODCACHEHINT, IDC_LIST_ALARM, OnOdcachehintList)

c、实现对应的三个函数,具体获取的值可以调试,建议用vector,map好像不行。

如:

//虚表要实现的函数之一
void CNavigationDialog::OnGetdispinfoList(NMHDR* pNMHDR, LRESULT* pResult)
{LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;//Create a pointer to the itemLV_ITEM* pItem= &(pDispInfo)->item;//Which item number?int itemid = pItem->iItem;//主机地址int nZJ_address = g_vector_alarm[itemid].bjq_zj_address;//Do the list need text information?if (pItem->mask & LVIF_TEXT){CString text;//Which column?if(pItem->iSubItem == 0){//Text is name 序号text.Format("%d",itemid+1);}else if (pItem->iSubItem == 1){//Text is slogan//所在区域text = GetAreaNameByZJAddress(nZJ_address);if (text.Compare("jh")==0){text = "焦化分厂";}}else if (pItem->iSubItem == 2){//主机名称text = GetZJName(g_vector_alarm[itemid].bjq_zj_address);}else if (pItem->iSubItem == 3){//报警仪的名称/位置text = GetBJQName(g_vector_alarm[itemid].bjq_zj_address,atoi(g_vector_alarm[itemid].bjq_address));}else if (pItem->iSubItem == 4){//气体类型text = g_vector_alarm[itemid].bjq_Gas_type;}else if (pItem->iSubItem == 5){//状态text = g_vector_alarm[itemid].bjq_state;}else if (pItem->iSubItem == 6){//时间text = g_vector_alarm[itemid].dateTime;}//Copy the text to the LV_ITEM structure//Maximum number of characters is in pItem->cchTextMaxlstrcpyn(pItem->pszText, text, pItem->cchTextMax);}*pResult = 0;
}//虚表要实现的函数之二
//This functions is called when the user "writes" in the list box to find an item.
void CNavigationDialog::OnOdfinditemList(NMHDR* pNMHDR, LRESULT* pResult)
{// pNMHDR has information about the item we should find// In pResult we should save which item that should be selectedNMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;/* pFindInfo->iStart is from which item we should search.We search to bottom, and then restart at top and will stopat pFindInfo->iStart, unless we find an item that match*/// Set the default return value to -1// That means we didn't find any match.*pResult = -1;//Is search NOT based on string?if( (pFindInfo->lvfi.flags & LVFI_STRING) == 0 ){//This will probably never happend...return;}/*Let's look on a sample list;NameAnders* AnnaAnnikaBobEmmaEmmanuelAnna is selected. If "A" is written, Annika should be selected.If "AND" is written, Anders should be selected. If "ANNK" is written, the selection should stay on Anna.If "E" is written, Emma should be selected.*///This is the string we search forCString searchstr = pFindInfo->lvfi.psz;//   TRACE(_T("Find: %s\n"), searchstr);int startPos = pFindInfo->iStart;//Is startPos outside the list (happens if last item is selected)//   if(startPos >= m_list.GetItemCount())//         startPos = 0;int currentPos=startPos;//Let's search...//     do//    {       //      //Do this word begins with all characters in searchstr?//       if( _tcsnicmp(m_database[currentPos].m_name, searchstr, searchstr.GetLength()) == 0)//        {//             //Select this item and stop search.//           *pResult = currentPos;//           break;//        }// //      //Go to next item//         currentPos++;// //        //Need to restart at top?//         if(currentPos >= m_list.GetItemCount())//           currentPos = 0;// //   //Stop if back to start//   }while(currentPos != startPos);
}//虚表要实现的函数之三
//This is called to give you a chance to catch data. Useless in most cases :-)
void CNavigationDialog::OnOdcachehintList(NMHDR* pNMHDR, LRESULT* pResult)
{NMLVCACHEHINT* pCacheHint = (NMLVCACHEHINT*)pNMHDR;/* TRACE(  _T("Chache item %d to item %d\n"),pCacheHint->iFrom,pCacheHint->iTo );*///... cache the data pCacheHint->iFrom to pCacheHint->iTo ...*pResult = 0;
}

d、填充数据

p_list_History->SetItemCountEx(vec_bjq_datas.size(),LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);

代码是我项目中的片段,具体根据实际修改。

参考:

https://www.cnblogs.com/lidabo/p/3410400.html

http://www.cppblog.com/woaidongmao/archive/2011/11/14/160088.html

CListCtrl 虚拟列表实现相关推荐

  1. CListCtrl 虚拟列表技术

    一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示 ...

  2. MFC CListCtrl 虚拟列表使用详解

    一.简介 CListCtrl 是MFC 库的一个列表控件,用于显示数据的.可以通过 InsertItem 快速向列表添加一行数据,并且用 SetItemText 设置其后面列的数据项. 但是本篇文章重 ...

  3. 虚拟列表控件---加载大数据行

    平常所用到的列ListView/ListCtrl控件,都是只有行至几百行数据,直至今日,在项目中遇到了上10W量级数据条,终于感觉到普通加载的艰辛,遂到网上乱找一通,发现大同小异,转载了这篇比较详细的 ...

  4. recycleviewitem 列表加载动画_用vue实现一个虚拟列表

    上次分享了超长列表分片加载的方式,这种方式现在一般不会使用,因为dom会变的无比庞大,页面会很卡,今天分享用vue实现一个虚拟列表的简易实现,本来是想用原生实现一个,后来觉得直接使用computed, ...

  5. mysql虚拟列表_「前端进阶」高性能渲染十万条数据(虚拟列表)

    前言 在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做长列表.比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益.亏损.手数等),此时对于 ...

  6. 前端虚拟列表的实现原理

    [CSDN 编者按]在日常生活中,刷不到底的新闻feed流,无尽图片瀑布流,编辑窗口加载卡顿等.对于这种情景,我们不可能一次性加载完所有的数据,因为不仅手机视窗大小决定了这种做法很浪费,同时请求这么多 ...

  7. FairyGUI进阶-滑动列表 虚拟列表 循环列表

    1.虚拟列表置顶子项居中(初始化) int itemIndex = _list.ChildIndexToItemIndex(midIndex);_selectid = itemIndex;_list. ...

  8. FairyGUI虚拟列表

    先上代码为敬: hero_List.itemRenderer = RenderListItem;hero_List.defaultItem = "ui://o3ujglcdqacwi3t&q ...

  9. 【Web技术】1346- 前端虚拟列表的实现原理

    作者:字节跳动 fe @程翯 近期在某平台开发迭代的过程中遇到了超长List嵌套在antd Modal里加载慢,卡顿的情况.于是心血来潮决定从零自己实现一个虚拟滚动列表来优化一下整体的体验. 改造前: ...

最新文章

  1. MPB:南土所冯有智组-基于微量热曲线的微生物群落代谢特征分析
  2. C++学习之路: 线程封装(基于对象编程)
  3. plc控制可调节阀流程图_PLC控制的水箱液位控制系统毕业论文
  4. 基于Docker搭建Jumpserver堡垒机操作实践
  5. 傳統經理人的迷思(转)
  6. 《设计模式详解》行为型模式 - 模板方法模式
  7. TCP/IP 选项TcpTimedWaitDelay设置
  8. Android控件开发之Gallery3D酷炫效果(带源码)
  9. Openwrt使用指定版本的toolchain工具链
  10. Apache ShenYu源码阅读系列-Divide插件
  11. 开鑫金服落实“同心圆”工程 为老年投资人保驾护航
  12. 大型项目前端架构浅谈(8000字原创首发)
  13. 北邮数据库实验7mysql_北邮大三下第7次数据库实验报告--mysql
  14. php办公oa系统带流程审批支持手机版wap源码
  15. 判断完全立方数——cf比赛总结
  16. js 截取某个字符前面或者后面的字符串
  17. 关于公司离职后住房公积金问题
  18. android 选择答题功能,Android实现选择题答题(包括单选、多选和答题卡)
  19. Automated_bounty_Hunter全自动漏*洞赏金猎人使用场景二
  20. Emoji表情过滤-手机键盘emoji表情完全过滤

热门文章

  1. android 设置scrollview 高度,Android ScrollView如何设置maxHeight
  2. Can not deserialize value of type java.util.Date from String异常解决办法
  3. 多数满意比不上少数狂热
  4. XTU OJ 2022 128题之字母圣诞树
  5. 芜湖市援企稳岗奖励政策11类 补助稳岗返还、留工培训、技能提升、吸纳就业、创业补贴
  6. Java POI处理Word表格并建立副本文档
  7. 迷茫的程序员和中国软件业[转]
  8. 关于软件的空间占用,安装目录
  9. 【NVIDIA】Tesla V100安装NVIDIA-Driver驱动程序适配CUDA-Toolkit-11.6
  10. 音频引擎为什么会推荐使用Wwise?