|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
SCROLLINFO结构体存放着滑动条的一切信息
ScrollWindow会根据参数 “滑动” (bitbit) 当前客户区的数据,超出客户区的数据将不保留
滑动后客户区将出现无效区域,系统会自动获取并发送WM_PAINT消息
无效区域的大小及位置数据将会记录在PAINTSTRUCT中的rePaint结构里
无论上移还是下移,客户区的基点仍为(0,0),系统通过控制top和buttom两个参数实现对无效区域的定位
SetScrollInfo(hwnd,SB_VERT,&vScroll,TRUE);
GetScrollInfo(hwnd,SB_VERT,&vScroll);
if(iScrollPos != vScroll.nPos)
{
ScrollWindow(hwnd,0,cyChar * (iScrollPos - vScroll.nPos),NULL,NULL);
UpdateWindow(hwnd);
} 在改变滑动条位置之后,先存入SCROLLINFO(vScroll)数据再重新读取
此时在系统内部会计算当前滑动条的位置是否超出nMin和nMax,若超出范围则小小取大(nMin),大大取小(nMax)
否则保持滑动条当前位置
PaintBeg = max(0,vScroll.nPos + ps.rcPaint.top / cyChar);
PaintEnd = min(LineMath,vScroll.nPos + ps.rcPaint.bottom / cyChar);
for(;PaintBeg <= PaintEnd;PaintBeg++)
{
y = cyChar * (PaintBeg - vScroll.nPos);
StringCchLength(arr[PaintBeg],3,&CchLength);
TextOut(hdc,0,y,arr[PaintBeg],CchLength);
}
因为UpdateWindow后系统会立即发出一条不进队列的WM_PAINT消息
故改变滑动条位置后必须先保存当前SCROLLINFO数据
在重绘客户区时 ps.rcPaint.top / cyChar 计算出 ”滚动前“ 在客户区最后一行的数据位置
因此加上当前滑动块位置(vScroll.nPos)便可计算出将要读取的数据的位置(此位置是数据在缓冲区内的位置)
而 PaintBeg - vScroll.nPos可计算出数据在客户区重绘的位置(第n行)
当中还有各种细节 不暇细说 留给读者慢慢体会
若说的不好 请指出 谢谢
|
|