热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CListView虚拟列表

首先说下虚拟列表出现的原因:数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数

首先说下虚拟列表出现的原因:

数据量比较小的时候,对于CListView控件可以直接使用InsertItem并配合SetItemText函数来插入并修改数据。这样操作很直接。

但是,如果数据量比较大了,比如1w个数据,那么,根据插入的数据种类,长度,以及计算机性能,估计时间在10s中到1分钟不等。如果你的用户在使用的这样的程序时肯定不会开心,初始化的时候插入则需要登上10s+后才能使用,如果外加一个线程来并行插入,倒也是一个方法(这个事情我做过),不过,很浪费CPU时间,以及内存。

如果是10w个,甚至100w个数据呢?那么至少会线性的增加时间了~

但是回头想一想,一个列表,在你的计算机显示器上,最多也就能看到50-80个。我的笔记本分辨率是1366*768的就按50个来算,768/50 约等于15吧,一行用15个像素宽度表示,已经有点小勉强了~~~

所以这个时候有个事情就非常明显了:在大数据量的时候,根本没必要在初始化时把全部的数据都插入到CListCtrl控件中。

要注意,这个问题是我在下自习回寝室的路上想明白的~~~

然后我就想了,既然这样的话,如果自己动手做虚拟列表,也不是不能做。基本上需要准备好以下的东西:

1 右面的浏览滑块,就是那个scroll,这个需要处理好,根据不同的位置,动态加载不同地方的数据。

2 鼠标的滚轮消息,上下移动,也要做好。

3 窗口的最大数据量,以及文字显示之类的东西,都要做。

基本上就是意味着需要自己做一个控件,虚拟列表控件。这个确实是可行的。然后呢~我在百度查资料的时候,意外的看到了虚拟列表这个东西~~~

那时我才知道,原来microsoft的大神们已经想到了这个问题,而且在CListCtrl中已经整合好了。

在CListCtrl中使用虚拟列表

我之前的那篇关于CListCtrl控件使用方法的文章中说过,对于和控件绑定了的CListCtrl对象,主要需要做的工作,就是设置风格,并且插入列。

不过对于虚拟列表,与常规的列表相比,并没有什么风格上的不同,所以风格还是依照自己的需求进行设置就可以了。

列的控制,按照前面那篇文章上来就好了~这里不是重点。

然后呢,很需要做的一点就是,设置最大条目的数量。这里要注意的是,所谓的最大条目的数量,就是和你的数据库的数据量。这两者一定是要匹配的。

展示一小段实例代码:

1 else
2 {
3 CFileInfo cfi;
4 while(m_MyDataBase.ReadString(path))
5 {
6 cfi.csFileRoot = path;
7 cfi.csFileName = path.Right(path.GetLength() - path.ReverseFind('\\') - 1);
8 cfi.csFilePath = path.Left(path.ReverseFind('\\'));
9 m_arrayFileInfo.Add(cfi);
10 nFileNum++;
11 }
12 m_MyDataBase.Close();
13 }
14
15 m_LCTable.SetItemCountEx(nFileNum, LVSICF_NOSCROLL|LVSICF_NOINVALIDATEALL);
16 nInitialFlag = 1;

最上面的代码是数据初始化的部分,存储到CArray模板中。也算是个最简单的数据库吧。

初始化过后,我的数据就放到了容器中,上面的nFileNum变量就是跟踪容量的数据,不过,其实也不需要,毕竟CArray是提供数据总量查询的。

然后接下来调用我们的明星函数:SetItemCountEx

这个函数,第一个参数毫无疑问就是设置数量上限的,第二个参数又是一个什么风格设置,看看MSDN怎么说:

    • LVSICF_NOINVALIDATEALL The list view control will not repaint unless affected items are currently in view. This is the default value.

    • LVSICF_NOSCROLL The list view control will not change the scroll position when the item count changes. 

大意我就不翻译了,现在有个人正在和我聊天,翻译了太费时间。这两个的特性可以自己试一试。

然后在这算是第一步完成,主要还是SetItemCountEx函数。

 

接下来,需要做的事进行消息响应。

要知道,windows程序的运行是需要消息来推动的。当滑块对拖动或者鼠标滚动的时候,都会有消息产生。

所以,CListCtrl也是采用了这种机制,消息响应的方式去填充虚拟列表。

我在这里只介绍我使用过的一个消息,就是LVN_GETDISPINFO

最上面的那个消息响应就是了。

然后我们看响应函数的代码:

1 void CMyRisingDlg::OnLvnGetdispinfoList2(NMHDR *pNMHDR, LRESULT *pResult)
2 {
3 NMLVDISPINFO *pDispInfo = reinterpret_cast(pNMHDR);
4 // TODO: Add your control notification handler code here
5 LV_DISPINFO * pLPD = (LV_DISPINFO *)pDispInfo;
6 LV_ITEM* pItem= &(pDispInfo)->item;
7 HICON hIconTmp;
8 int nItem = pItem->iItem;
9 if (pItem->mask & LVIF_TEXT) //valid text buffer?
10 {
11 switch(pItem->iSubItem)
12 {
13 case 0: //fill in main text首列添加图像的工作肯定也要在这里完成
14 _tcscpy(pItem->pszText, m_arrayFileInfo[nItem].csFileName);
15 //ExtractIconEx(m_arrayFileInfo[nItem].csFileRoot, 0, NULL, &hIconTmp, 1);
16 //m_imagelist.Add(hIconTmp);
17 //Add Icon into the list
18 pItem->iImage = 0;
19 //m_imagelist.Remove(0);
20 break;
21 case 1: //fill in sub item 1 text
22 _tcscpy(pItem->pszText, m_arrayFileInfo[nItem].csFilePath);
23 break;
24 case 2: //fill in sub item 2 text
25 _tcscpy(pItem->pszText, m_arrayFileInfo[nItem].FileTime);
26 break;
27 }
28 }
29
30 *pResult = 0;
31 }

首先能看参数,其中一个是NMHDR的指针,这个类型,我还真的不是很清楚。

不过清楚的可以看到,经过两次类型转换,我们会得到一个LV_ITEM的指针。在这简单的说一下,前面的那段类型转换的代码,是函数自动生成的时候就已经改出来的。

接着,在这里我们只要根据LV_ITEM中的消息进行相应来添加相应的数据就可以了。

所以接下来主要需要看的就是switch中的case选择。

在上面代码中的switchcase结构中,传给switch的参数就是一个条目中的子序号。根据这个子序号,去添加对应位置的信息。

然后这里还有非常重要的一点,就是在上面的这段代码:

8 int nItem = pItem->iItem;

这段代码就是用来获取当前位置对应数据的目录号。只有根据这个目录号,你才能找到在你的数据中应该添加的数据的位置。这个在我的代码中你应该也能注意到的。

最主要的两个数据在这里基本就介绍完了,具体的代码也贴在上面。这样就能进行最简单的虚拟列表操作啦。

 

转:https://www.cnblogs.com/matrix-r/p/3185953.html



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
author-avatar
景雨韵文秀馨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有