手动调整滚动条回归最顶部_一个自适应滚动条的实现

news/2024/7/24 5:25:39 标签: 手动调整滚动条回归最顶部

自适应滚动条

为了得到一个自适应滚动条,你需要告诉Windows滚动条所覆盖区域的最大值和最小值,当前滚动条的位置以及滚动条滑块(Thumb,也称”页大小”)的大小。
一个比较麻烦的方法,是当显示区域最大值是可变的情况。这和GDI中的坐标计算有点不同:GDI中,一段范围,是不包含终结点的。这会导致在代码中出现类似”-1″这样的代码,用来对公式做出补偿修正。

为了实现这个目标,我们需要额外定义如下的变量:

2735030acdc9a5eded7121c147120ab9.png

我稍后会解释为什么这里的变量名叫做g_yOrigin。

核心代码

接下来,我们会定义一个帮助函数,它将会是滚动条操作的核心。
我们来看看这个函数:它将会接收一个代表滚动条目标位置的参数,然后函数对这个参数进行有效性校验,然后对窗口的内容进行必要的滚动,最后,设置滚动条的相关参数来匹配窗口滚动之后的状态。

0a7d1b3889e4821799d62e73e9918b41.png

有时候,我们仅仅是希望以一个相对的位置进行滚动,则可以使用下面的函数。

271bb0973afb75228b60a42d80ac928f.png

当窗口大小发生变化时,我们需要重新计算”一页”中可显示的条目个数。这个计算过程,会要求滚动条的Thumb位置进行自动调整,所以,我们这里在ON_SIZE消息处理例程中执行力一次Dummy Scroll,这将触发滚动条自身的自动调整。

16e65eff5f8f5a0eed3cde45eaf0f65f.png

WM_VSCROLL消息处理例程比较容易理解。当我们按行或者按页进行滚动时,实际上我们会在一个指定的方向上做一些对应的滚动。当用户拖动滚动条滑块时,我们将滚动到一个指定的位置。当用户拖动滚动条的顶部或底部时,我们也会做相对应的计算。

e5d9d7cbad11d1dadbee9eb56ec439bb.png

当然,我们还需要将消息处理例程和消息进行关联,如下图所示:

91c07da92b24ed987a24cba270db2ed4.png

最后,我们需要让我们的绘制函数知道滚动条的存在。幸运的是,我们可以借助GDI的转换,实现这个目的,并且完全不需要改动PaintSimpleContent函数。

8a57bcfeb44ad2736d7a10b8c297f7cf.png

通过修改窗口的原点,我们的PaintSimpleContent函数还是和没有滚动条的时候一样正常工作。借助于GDI的坐标转换,我们可以愉快的在坐标点(0,0)上绘制条目,而绘制的像素将出现在新设定的原点的位置。

所以,你现在应该可以明白,为什么这里的变量叫做g_yOrigin了吧?

家庭作业

在上面的OnVscroll函数中有一个隐藏的Bug。看看可以找到它吗?然后试试能不能修复一下?

2b4ed3f39fef0ab1faa7edce6a05ede5.png

http://www.niftyadmin.cn/n/660171.html

相关文章

一个故事看懂HTTPS

我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习。 为了不让别人看到浏览记录,主人选择了“无痕模式”。 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什么,请求了什么数据…

MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

在看高性能MySQL第3版(4.1.7节)时,作者建议当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串。但是没有给出具体原因。为了搞清楚这个原因,查了一些资料,记录下来。 相对字符串…

matplotlib画图——条形图

一.单条 import numpy as np import matplotlib.pyplot as pltN 5 y1 [20, 10, 30, 25, 15] y2 [15, 14, 34 ,10,5] index np.arange(5)bar_width 0.3 plt.bar(index , y1, width0.3 , colory) plt.bar(index , y2, width0.3 , colorb ,bottomy1) plt.show() 二.误差棒 me…

浅谈消息中间件,MQ的来龙去脉

1.什么是消息中间件 MQ全称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。 为什么使用MQ? 在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器…

Solidity概述及基本代码展示

Solidity是实施智能合约的契约导向的高级语言。它受到C ,Python和JavaScript的影响,旨在针对以太坊虚拟机(EVM)。 Solidity是静态类型的,支持继承,库和复杂的用户定义类型等功能。 您将会看到,可以创建投票&#xff0c…

神奇的 SQL 之别样的写法 → 行行比较

环境准备 数据库版本: MySQL 5.7.20-log 建表 SQL View Code 初始化数据 准备了 769063 条数据 需求背景 业务机构下销售商品,同个业务机构可以销售不同的商品,同个商品可以在不同的业务机构销售,也就说:业务机构与商品…

jQuery属性和样式操作

回顾 1. jquery基本使用 <script src"jquery.min.js"></script><script> $(function(){ $(li).css().css().attr().find() })</script>​js 原生dom 和 jQuery DOM$(原生DOM) $(this)jQuery的本质是 由 原生dom组成 的类数组 …

五分之四的不同表达式_五分之四表示什么?还可以表示什么?

展开全部1.表示将1平均分成五份&#xff0c;取其中的四份。【例如】&#xff1a;把一个苹果分成五块&#xff0c;32313133353236313431303231363533e78988e69d8331333365633938取了其中的4块&#xff0c;可以用五分之四表示&#xff1b;2.表示将4平均分成五份&#xff0c;取其中…