今天分析了以前的一段自绘 滚动条的代码, 终于明白了滚动条的细节。 对于Edit 来说 SCROLLINFO si1; si1.nMin:0, si1.nMax:14, si1.nPage:6, si1.nPos:9, si1.nTrackPos:9 例如上面信息: si1.nMax - si1.nMin + 1 代表编辑框中文字的总行数 si1.nPage:6 编辑框一页可以容纳的行数(在不足一显示页时为当前页中的行数), 一页:在不用滚动条的情况下最多可以显示的行数。编辑框大,可以显示nPage的就大 si1.nPos:9, si1.nTrackPos:9 滚动条把Edit中文本滚过的行数, 每次点击滚动条上下箭头,编辑框滚动1行 假设 nPage=10, si1.nMax - si1.nMin + 1 = 100 则nPos最大为 100 - 10 = 90, 对于垂直滚动条来说,此时滑块滚到了最底端。 垂直滚动条滑块高度的计算: si1.nMax - si1.nMin + 1 = 800 编辑框文本总行数 si1.nPage = 100 编辑框最多一页最多容纳 100 行 假设垂直滚动条: TotalHeight = 100 像素, 上下2个Arrow各 10像素, 则 InterHeight = TotalHeight - HeightOf(Arrow)*2 = 100 -10*2 = 80 ThumbHeight = si1.nPage * InterHeight /(si1.nMax - si1.nMin + 1) = 100 * 80/(800) = 10 像素 计算滑块的位置: 对于垂直滚动条,计算滑块Thumb的最上端的位置 ThumbPos EmptyHeight = InterHeight – ThumbHeight EmptyHeight: 滚动条内空白区域的总高度 InterHeight: 滚动条出去上下箭头的高度 ThumbHeight: 滑块的高度 存在下面比例关系: si1.nTrackPos/( si1.nMax - si1.nMin + 1 - si1.nPage) = ThumbPos/EmptyHeight; si1.nMax - si1.nMin + 1 - si1.nPage 需要滚动条滚动才能显示的总行数(对应滚动条的空白区域) si1.nTrackPos 已经滚动的行数(对应滑块的位置) 则滑块最顶端 ThumbPos = EmptyHeight * si1.nTrackPos/( si1.nMax - si1.nMin + 1 - si1.nPage)

本文详细解释了滚动条的工作原理及其实现细节,包括SCROLLINFO结构体各项参数的意义,如nMax、nPage等,以及如何计算垂直滚动条滑块的高度和位置。

3423

被折叠的 条评论
为什么被折叠?



