滚动条的算法
没想到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章的最后介绍滚动条时,没有对滚动条的算法步骤作很详细地分析,直接给出代码了。喜欢这样的风格,因为这样的分析纯属时间问题,没有必要浪费太多文字和版面。留给读者去思考未尝不是一种好办法。
把思路和算法记录一下,以后忘了还可以来复习复习。
下面写的都是指垂直滚动条,水平的类推。
思路:
假设一篇文章一共有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章的最后介绍滚动条时,没有对滚动条的算法步骤作很详细地分析,直接给出代码了。喜欢这样的风格,因为这样的分析纯属时间问题,没有必要浪费太多文字和版面。留给读者去思考未尝不是一种好办法。