当前位置:C++技术网 > 资讯 > 滚动条及其相关重要的操作函数的理论基础详解介绍

滚动条及其相关重要的操作函数的理论基础详解介绍

更新时间:2016-02-02 20:05:49浏览次数:1+次

滚动条就是这样的一个窗口:窗口两端各有一个箭头,之间还有一个可用鼠标拖动的可移动"滑块"。单机滚动条的箭头,移动滑块,或单击滚动条体时,滚动条会向它所挂接的窗口发送消息来通知该窗口。其实,滚动条所做的是提供了一个直觉意义上的并被广泛热弄得机制,那就是,前后滚动物理窗口无法容纳的虚拟画面。
请大家看看我写的几篇与滚动轮相关的文章《MFC深入理解实现滚动轮》(http://www.cjjjs.com/paper/lkkj/20151210221849794.aspx)《MFC实现设置水平,垂直滚动轮》(http://www.cjjjs.com/paper/lkkj/20151210215936392.aspx)《利用OnSize,SetScrollbar(自定义的)创建自定义滚动轮滑块》(http://www.cjjjs.com/paper/lkkj/201612921256151.aspx)
创建了滚动条之后,还要给他设置范围,位置,和页面大小等初始值。前两者就不介绍了,大家应该熟悉。page size设定滑块的尺寸,如果滚动条范围是0到100,页面尺寸是50,则滚动条滑块的尺寸是滚动条长度的一半。如果不设定页面尺寸,windows将采用默认值,一个对开发者来说不合比例的滚动条滑块尺寸。
在ScrollInfo结构体中,nPage指定页面尺寸,也就是滑块的大小
下面我们介绍字儿滚动条消息滚动窗口内容。最简单的实现方法就是在每个滚动条消息传来时改变滚动条的位置,并调用Cwnd::Invalidate实现重画滚动条。但是这种方法滚动窗口的速度很慢。因此,MFC封装设计了一个函数来弥补这种缺陷,我们直接通过操作这个函数来滚动窗口,并重绘——CWnd::ScrollWindow
ScrollWindow向上或向下,向左或向右滚动窗口客户取得整体或局部内容,并使用像素块快速传输方法实现一个或多个像素距离的滚动。而且他禁止滚动没有被滚动操作“覆盖”的窗口内容,这样下一个WM_PAINT消息就不会重回整个窗口。如果,调用CScrollWindow将窗口向下滚动10个像素,则用数据块拷贝实现滚动,然后使前10行无效。此时,OnPaint被激活,只有前10行被重回。即使OnPaint要重回整个用户区的内容,由于大部分输出被剪贴过去,所以滚动性能还是提高了。
void ScrollWindow(int xAmount, int yAmount, LPCRECT lpRect=NULL,LPCRECT lpClipRect=NULL)
xAmount, yAmount时代符号的整形数,确定垂直或水平方向上要滚动的像素数目,负值表示向昨和向上滚动,正值则相反。lpRect指向CRect对象或RECT结构体,指定客户区中待滚动的部分;而lpClipRect指向一个CRect对象或RECT结构体,指定裁剪矩形。滚动整个客户区内容时应将lpRect和lpClipRect指定为NULL。
ScrollWindow(0,10);将窗口客户区所有的内容向下滚动10个像素,并立即重画前10行