开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6243|回复: 18
收起左侧

[易源码分享] GDIPlus随手笔记_虚表,高效率列表框绘制算法

[复制链接]
结帖率:97% (29/30)
发表于 2015-2-4 23:35:12 | 显示全部楼层 |阅读模式   海南省海口市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
这个算法是平时玩自绘的时候想到的,不知道算不算虚表,不过我感觉应该算的上效率很高的了。这个算法只适用每个项目高度都一样的情况,比如常见的列表框、超级列表框都是等高的,不等高的比如气泡聊天框、QQ列表框、酷狗的播放列表、QQ登录界面的账号选择框....


进入正题,我们都知道,自绘列表框其实就是绘制一个个收尾连接一起的矩形,然后在矩形里填充各种数据,图标、标题、进度条...然后滚动显示就是把各个矩形向上或向下偏移     这样一个列表框就完成了。
不过这样绘制出来的列表框效率很低,数据小的时候不明显,当数据量达到上万啥的,效率就很明显了,而且还特别占CPU。
怎样提高绘制效率呢?那就是利用虚表算法,通熟易懂就是只画看得见的,超出组件范围的就不画,这样效率就大大提高了。

1.jpg


如上图,2个箭头里的就是可视区域,因为每个项目的高度是一样的,可以利用滚动条来算出起始绘制索引,也就是顶端的那个项目。
在这里假设项目高度是10,滚动条此时的位置也是10,说明整个列表框整体已经向上偏移了10,也就是项目1刚好看不到,这时你看到的效果应该是图下的。



2.jpg


在比如这时滚动条在15的位置,你看到的效果应该是第2个项目的一半超出范围,只能看到下面一部分开始。


3.jpg


多试验几次,起始索引可以这样算出  滚动条的位置 / 项目高度 + 1  
把第一次的值代进去  10 / 10 + 1 = 2  正确
第二次的值代进去      15 / 10 + 1 = 2.5  为什么会有小数呢,在看看上面的图片  发现后面的小数就是起始索引的偏移。
偏移可以单独这样算出   滚动条的位置 mod 项目高度  也就是取余。
起始索引算出来了,在来看看这么个高度的组件能画多少个项目高度是10的表项,其实也就是   组件高度 / 项目高度 ,因为起始项目有可能向上偏移,为了以防万一   多画一两项也没关系,也就是  组件高度 / 项目高度 + 1




以上就是我的虚表算法,这样不管项目数有多少十万、多少百万(估计没人用那么多...)都只画看到的这几项,大大提高了绘制效率。
例子里的项目数据是用数组来保存,在填充数据的时候会有点慢,这是易语言的问题,绘制都是秒画的,保存数据听说还可以用链表、哈希表...这样填充数据会相当快,不过没试过。


小提示:编译后填充数据速度会灰常快。


列表框我没有美化,只是讲了下算法,想美化的自己折腾去吧,易语言自带的滚动条最大值只能是30000多,所以我拿多功能条做例子。


此帖子只介绍了画法, 响应鼠标消息请关注我的 Ex_DUI随手笔记系列。




222222.gif



源码: GDIPlus随手笔记_虚表,高效率列表框绘制算法.rar (45.3 KB, 下载次数: 240)

评分

参与人数 1好评 +1 收起 理由
ouding + 1 广告位出租

查看全部评分


本帖被以下淘专辑推荐:

结帖率:100% (11/11)

签到天数: 2 天

发表于 2019-8-2 12:57:40 | 显示全部楼层   云南省大理白族自治州
效率的东东我从不放过
回复 支持 反对

使用道具 举报

发表于 2018-5-12 21:06:23 | 显示全部楼层   浙江省台州市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 2 天

发表于 2017-12-8 19:51:02 | 显示全部楼层   广西壮族自治区贵港市
这个可以参考下收下了谢谢
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)
发表于 2017-7-1 11:35:06 | 显示全部楼层   广西壮族自治区南宁市
这个要学习一下
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2016-12-26 13:34:01 | 显示全部楼层   北京市北京市
学习一下,支持开源
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 1 天

发表于 2016-3-30 14:26:39 | 显示全部楼层   广东省广州市

学习一下,支持开源
回复 支持 反对

使用道具 举报

发表于 2016-1-11 21:13:25 | 显示全部楼层   广东省深圳市
学习一下,列表框太慢了
回复 支持 反对

使用道具 举报

结帖率:100% (9/9)
发表于 2015-4-23 22:18:04 | 显示全部楼层   浙江省宁波市
看看  支持开源
回复 支持 反对

使用道具 举报

结帖率:100% (10/10)
发表于 2015-3-25 07:34:26 | 显示全部楼层   广西壮族自治区贵港市
拿下看看..............................
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表