滚动条的算法

滚动条的算法

没想到WIN的滚动条实现起来居然这么复杂。。囧
把思路和算法记录一下,以后忘了还可以来复习复习。

下面写的都是指垂直滚动条,水平的类推。

思路:
假设一篇文章一共有15行(首行编号0,尾行编号14)
整个窗口只能显示4行(首行编号0,尾行编号3)

那么滚动条的范围跨度应该是15-4=9,编号是0~8,顺序是从上到下。
滚动条在0的时候,文章首行显示在窗口的首行,滚动条在8的时候,文章尾行显示在窗口的尾行

当滚动条处在3,然后被移动到5的过程中,
窗口的尾行,也就是文章的第4-1+3=6行,向上移动了5-3=2行。
因此,文章的7~8行需要被显示在WIN窗口的末尾两行。

在整个窗口操作中,需要用到的已知量有4个:
1.文章的总长度
2.滚动条的位置
3.需要显示的所有行中的第一个,在窗口中的行号
4.需要显示的所有行中的第一个,在窗口中的行号

最后要得到的是:
用已知量+循环,将需要被显示的行,显示到WIN窗口的正确位置。

经过以上实例数据的提示,可得:

算法:
需要用到的已知量的字母表示:
1.文章的总长度
ArticleMaxLines
2.滚动条的位置
ThumbPos = si.nPos
3.需要显示的所有行中的第一个,在窗口中的行号
FirstNeededLine = ps.rcPaint.top/cyChar
4.需要显示的所有行中的第一个,在窗口中的行号
LastNeededLine = ps.rcPaint.bottom/cyChar
[cyChar是每行的文字高度]

可以推算出的值
1.需要第一个被显示的行在文章中的行号
FirstNeededLineInArticle = max( 0 , FirstNeededLine+ThumbPos );
2.需要最后一个被显示的行在文章中的行号
LastNeededLineInArticle = min( ArticleMaxLines-1 , LastNeededLine+ThumbPos );
[max和min的作用是防止滚动条移到顶端时,产生出界的值]

核心代码:
for(int i=ArticleFirstLineNum ; i<=ArticleLastLineNum ; ++i)
{
y=cyChar * (i-ThumbPos);
TextOut(hdc,0,y,"test",4);
}

在看《Programming Windows》。作者在第4章的最后介绍滚动条时,没有对滚动条的算法步骤作很详细地分析,直接给出代码了。喜欢这样的风格,因为这样的分析纯属时间问题,没有必要浪费太多文字和版面。留给读者去思考未尝不是一种好办法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值