MFC CListCtrl 虚拟列表使用详解

2 篇文章 1 订阅
订阅专栏


一、简介

CListCtrl 是MFC 库的一个列表控件,用于显示数据的。可以通过 InsertItem 快速向列表添加一行数据,并且用 SetItemText 设置其后面列的数据项。

但是本篇文章重点不是介绍 CListCtrl 控件的基本使用方法,而是介绍 CListCtrl 的扩展功能“虚拟列表”。

为什么使用虚拟列表?

使用 InsertItem 方法可以显示少量数据,但是数据量大或者是频繁刷新列表数据时,会出现缓慢甚至卡顿的现象。虚拟列表可以很好的解决该问题。

通过什么方式实现虚拟列表?

1、处理 LVN_GETDISPINFO 消息。

2、使用 SetItemCountEx 方法告诉列表要显示多少条数据。

3、使用 RedrawItems 方法刷新指定区间行的数据。

二、实验环境

开发语言:C++

OS 平台:windows 7

SDK:VS 2015

三、正文

3、1 新建一个基于对话框的MFC 工程。

 3、2 在对话框中添加一个 ClistCtrl 控件,并将 view 的属性改为 Report 类型,Owner Data 的属性改为 true 。

3、3 为 CListCtrl 控件绑定变量 m_list1,并向列表添加数据列(OnInitDialog)。

DWORD dwStyle = m_list1.GetExtendedStyle();
	dwStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES|LVS_EX_INFOTIP|LVS_EX_DOUBLEBUFFER;
	m_list1.SetExtendedStyle(dwStyle);
	m_list1.InsertColumn(0, "代码",LVCFMT_LEFT, 80);
	m_list1.InsertColumn(1, "名称",LVCFMT_LEFT, 80);
	m_list1.InsertColumn(2, "日期",LVCFMT_LEFT, 80);

3、4 到了这步后,不能直接向列表 InsertItem 数据。是需要定义自己的数据结构和向量。

// TestListVTableDlg.h

// 数据结构
struct WTSTickStruct{
	char arrCode[20];
	char arrName[20];
	char arrDate[20];
};

// 自定义一个向量数据类型
typedef std::vector<WTSTickStruct>  LST_Tick;

在 CTestListVTableDlg 中定义一个向量 

LST_Tick  m_LstTickData;

3、5 初始化向量数据,并通知列表刷新数据(OnInitDialog)

    WTSTickStruct fd1={0};
	WTSTickStruct fd2={0};
	WTSTickStruct fd3={0};

	strcpy(fd1.arrCode, "10000");
	strcpy(fd1.arrName, "test1");
	strcpy(fd1.arrDate, "2021-01-10");

	strcpy(fd2.arrCode, "10001");
	strcpy(fd2.arrName, "test2");
	strcpy(fd2.arrDate, "2021-01-11");

	strcpy(fd3.arrCode, "10002");
	strcpy(fd3.arrName, "test3");
	strcpy(fd3.arrDate, "2021-01-12");

	m_LstTickData.push_back(fd1);
	m_LstTickData.push_back(fd2);
	m_LstTickData.push_back(fd3);

    int iCount = m_LstTickData.size();
	m_list1.SetItemCountEx(iCount);//告诉列表要显示多少数据	
	m_list1.RedrawItems(0,iCount);// 重绘第0~iCount行的数据

3、5 为  CListCtrl 控件添加 LVN_GETDISPINFO 消息,并在该消息函数中填充列表的数据。

void CTestListVTableDlg::OnLvnGetdispinfoList1(NMHDR *pNMHDR, LRESULT *pResult)
{
	NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	LV_ITEM* pItem = &(pDispInfo)->item;  

	if(pItem==NULL) return;
	CString strCell="";
	int iItemIndx=pItem->iItem;//设置虚拟类表绘制的起始位置
	if (pItem->mask & LVIF_TEXT)
	{
		switch(pItem->iSubItem)//iSubitem指列
		{
		case 0:
			{
				lstrcpy(pItem->pszText,m_LstTickData[iItemIndx].arrCode);
			}
			break;
		case 1:
			{
				strCell.Format("%s",m_LstTickData[iItemIndx].arrName);
				lstrcpy(pItem->pszText,strCell);
			}
			break;
		case 2:
			{
				strCell.Format("%s",m_LstTickData[iItemIndx].arrDate);
				lstrcpy(pItem->pszText,strCell);
			}
            break;
		}
	}

	*pResult = 0;
}

3、6 到这里已经完成了虚拟列表的操作,可以编译运行了。

例子下载链接

四、技能扩展

4、1 为虚拟列表添加排序功能,处理 LVN_COLUMNCLICK 消息。

MFC CListCtrl 虚拟列表例子(含排序功能)
10-22
VS 2015 编写的例子,打开即可编译。
MFC CListCtrl 虚拟列表使用实例.rar
07-21
MFC控件CListCtrl虚拟列表使用实例,只要你内存够大百万级、千万级甚至更大的的数据显示都不会有问题,可随意流畅的拖动滚动条。 PS1:借鉴了网上找来的一份VC6.0实现的代码(此代码编译有错误),重新使用VS2019实现了,可以正常编译。 PS2:如果你是低版本的VS只要项目属性->常规 里两个地方就可以正常编译: 1.修改一下“Windows SDK 版本”为你已安装的WINDOWS SDK版本。 2.修改“平台工具集”为你当前正在使用的VS的版本
虚拟列表控件的使用
Some Say...And We Know he is called: The Stig!
03-23 2918
一、什么是虚拟列表控件虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。二、为什么使用虚拟列表控件我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件自己开辟了内存空间来保存这些数据。现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录。通常有两种方法解决这个问题:1是仅
MFC列表框示例
最新发布
weixin_45794330的博客
07-21 502
本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除。
虚拟列表控件(CListCtrl
yuucyf的专栏
03-22 1584
<br />一、什么是虚拟列表控件虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。<br /><br />二、为什么使用虚拟列表控件<br /><br />我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心数据在哪里了,这是因为控件 自己开辟了内存空间来保存这些数据。现在假设我们要显示一个数据库,里面的信息量很大,有几十万条记录。通常有两种方法解决这个问题:1是仅仅在 ListCtrl中插入少量的数据,比如100个,然后通过
MFC List Control虚拟列表
cxd1314520的博客
12-30 2204
一:拖动添加list control控件, 资源IDC_MY_LIST,在.rc文件添加属性LVS_OWNERDATA 二:将控件IDC_MY_LIST绑定成员变量 三:创建行列数据成员变量 四:添加LVN_GETDISPINFO的消息响应函数 五:初始化列表插入表头 六:插入数据,触发显示 七:实现点击“姓名”表头按姓名排序,姓名相同再按年龄排序 八:调整列表高度...
MFCCListCtrl使用与技巧
lingxiu0613的专栏
08-01 1234
选择控件:List Control 增加变量:add variable -> m_mylist 初始化: LONG lStyle; DWORD dwStyle; lStyle; lStyle = GetWindowLong(m_mylist.m_hWnd, GWL_STYLE); lStyle &= ~LVS_TYPEMASK; lStyle |= LVS_REPORT; S
MFC-Listcontrol控件虚拟列表 多个例子代码
05-07
MFC-Listcontrol控件虚拟列表 这里收集到好几个例子代码觉得对初学者很有帮助,欢迎下载学习
基于MFCCListCtrl实现虚拟列表控件
mikasoi的博客
09-29 1862
1. 在建立的工程的对话框里拖入一个ListCtrl控件,然后将控件的属性View改成“Report”,“所有者数据”改成True。如下图所示: 2. 在我们的程序中需要在ListCtrl的父窗口的类里面响应CListCtrl的跟虚拟控件相关的几个消息事件,在父窗口的消息宏里面加入下面几个宏: ON_NOTIFY(LVN_ODCACHEHINT,IDC_LIST1, OnOwnerData...
MFC虚拟列表控件源码详解与应用
本文将深入探讨如何在MFC中实现虚拟列表控件,即MFCCListCtrl类的高级使用技巧,以及如何通过源码来理解和掌握这些技术。" MFC(Microsoft Foundation Classes)是微软公司为了简化Windows平台下C++编程而提供的...
MFC二次开发的CListCtrl控件
11-27
**CListCtrl控件详解与二次开发** CListCtrl是Microsoft Foundation Class (MFC)库中的一个重要组件,它是Windows API中的ListView控件的面向对象封装。这个控件提供了一个多列列表视图,通常用于显示大量的结构化...
MFC-Listcontrol控件虚拟列表测试
12-01
MFC-Listcontrol控件虚拟列表测试,快速导入大量数据,并避免闪屏现象
mfc开发的虚拟列表控件例子(包含3个例子)
02-27
实现了3个虚拟列表控件例子,其中有2个例子实现了类似Windows资源管理器的功能显示图片缩略图功能,另外一个例子实现了磁盘目录文件列表的功能。
虚拟列表ListContrl
12-29
下面是一个简单的示例代码片段,用于说明如何使用虚拟列表: ```cpp class CMyListCtrl : public CListCtrl { public: BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, ...
CListCtrl样式与扩展功能详解
在实际编程中,CListCtrl使用涉及添加、删除和修改列表项,响应用户事件,以及自定义视图等方面。熟练掌握CListCtrl使用,能够帮助开发者构建功能强大的用户界面,提供丰富的数据展示和交互功能。
CListCtrl 虚拟列表
weixin_34204722的博客
04-28 181
文章来源 http://blog.vckbase.com/iwaswzq/archive/2006/07/07/21113.aspx 一、什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件。。 二、为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示的数据插入列表中,之后我们就不必关心...
MFC虚拟列表使用详解
qq_39401627的博客
12-15 2732
MFC虚拟列表使用详解列表中显示大量数据时,比InsertItem操作更快。 mfc基本对话框工程建立后,添加list_control控件,并设置属性(必须) 我这里使用样式为 为列表控件添加变量(m_listcontrol) 参考各种帖子的做法,添加一个继承CObject的类,命名为CLabelItem。 在CLabelItem类中重载 操作符=,和构造函数。 CLabelItem(con...
CListCtrl 虚拟列表实现
cau_eric的专栏
06-02 454
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_F
MFC CListCtrl
ltrobin的专栏
01-12 1318
摘自MSDN: CListCtrl::ApproximateViewRect 确定需要的宽度和高度显示列表视图控件中的项。 CListCtrl::Arrange 对齐网格中的项目。 CListCtrl::CancelEditLabel 取消编辑操作的项文本。
MFC CListCtrl 使用详解与示例
"CListCtrlMFC中用于操作Windows列表控件(ListView)的类,提供了丰富的功能,如显示多种风格的列表数据,包括大图标、小图标、列表和报表样式。CListCtrl允许用户编辑标签,始终保持选择状态可见,以及限制只...
写文章

热门文章

  • MFC CListCtrl 虚拟列表使用详解 4524
  • windows 下搭建 libwebsockets 环境 4479
  • C++ 格式化输出日志 849
  • MFC 自绘按钮显示 png 图片 787

分类专栏

  • MFC 2篇

最新评论

  • MFC 自绘按钮显示 png 图片

    lwei2: 好吧,还是从资源里加载好!

  • MFC 自绘按钮显示 png 图片

    装饰自我pp: 加载的是磁盘里的图片,要指定路径

  • MFC 自绘按钮显示 png 图片

    lwei2: 楼主,你自定义的控件应该不是从资源里加载的图片吧?

  • MFC CListCtrl 虚拟列表使用详解

    装饰自我pp: 感谢指正,写文档时疏忽了。是要把 Owner Data 属性设置为 true 才可以,博客内容已修正。

  • MFC CListCtrl 虚拟列表使用详解

    比奇堡鹏子哥: 虚拟列表必须要求ListCtrl是LVS_OWNERDATA样式吧?

大家在看

  • Golang | Leetcode Golang题解之第485题最大连续1的个数
  • 被网络诈骗怎么报案,了解110报案过程?
  • Python 文件压缩与解压缩系统设计 12
  • 【星闪开发连载】WS63E模组的速度测试
  • Linux platfrom架构驱动介绍

最新文章

  • MFC 自绘按钮显示 png 图片
  • C++ 格式化输出日志
  • windows 下搭建 libwebsockets 环境
2023年1篇
2022年1篇
2021年1篇
2020年1篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳坪山网站建设公司网站建设网站排名优化开发推广南海网站优化推广服务河南公司网站关键词优化花桥网站优化价格个人和企业网站优化儋州手机网站优化网站的站内优化有哪些网站优化每天都做什么池州网站排名优化哪里有金华百度seo网站优化江南都市花园搜狗网站优化正规的seo网站优化费用泰州快速网站优化优化公司网站出色火4星网站优化 推广 seo网站如何简单seo优化福建网站优化软件嘉定区公司网站优化案例汉中网站优化排名策划东平县网站优化工作室邯郸家装行业网站优化推广方案云浮优化网站多少钱优化网站访问量邢台网站优化西湖区百度网站优化平台南昌整站网站优化网站排名优化並定宙斯诚意网站优化软件有哪些教育网站seo优化方法png 优化网站香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化