操作滚动条(一)
汉字最好09.12.27
http://blog.csdn.net/stgsd/archive/2009/12/27/5083886.aspx
因为要写一个自定义组件,需要用滚动条,但是怎么关联滚动和显示呢?
在网上搜了很久,不是自定义浏览器的滚动条就是百度中
" cbSize是结构大小,填sizeof(SCROLLINFO)
fMask指定使用结构中哪些成员,不指定的就不使用
可以是以下几个值的任意组合
SIF_ALL
SIF_DISABLENOSCROLL
SIF_PAGE 复制滚动页码到由lpsi指向的SCROLLINFO结构的nPage成员中
SIF_POS 复制滚动位置到由lpsi指向的SCROLLINFO结构的nPos成员中
SIF_RANGE 复制滚动范围到由lpsi指向的SCROLLINFO结构的nMin和nMax成员中
SIF_TRACKPOS 复制当前滚动盒跟踪位置到由nTrackPos指向的SCROLLINFO结构的nPage成员中
在调用Getscrolllofo函数之前,设置SCROLLINFO结构中cbSize成员以标识结构大小,设置成员fMask以说明待找回的滚动条参数。在运行之前,函数复制结构中适当的成员所指定的参数。"
在csdn和盒子提问也没回应,应该是这个问题太简单,不值得回.
还是自己动手,先看看memo是怎么处理的:
摆三个memo.memo1要有竖的滚动条
oldmsg:=memo1.WindowProc;
memo1.WindowProc:=mymsg;
在mymsg中拦截 WS_VScroll消息,
结论:
nmax是总行数-1,
npage是每页显示行数-1
npos是当前第一行行号
ntrackpos是移动块拖动的位置
npos和ntrackpos的最大值是nmax-npage+1
msg.wparamlo是滚动条动作
0是点上箭头,1是点下箭头,npos变化1,ntrackpos无效
2是点移动块上,3是移动块下,npos变化npage-1,ntrackpos无效
5是按下或拖动移动块,4是放开移动块,ntrackpos是移动目的地
6和7没收到过
8是滚动条动作结束,ntrackpos和npos值相等,只有直接操作滚动条时才收到这个消息.
msg.wparamhi也是pos值
但是其在0,1,2,3,8号消息中无效,而且最大是$ffff,基本没有用.
所以,我们必须在消息处理函数中处理ntrackpos和npos的变化
还要用setscrollinfo或setscrollpos通知系统*奇怪,98下居然两个都要用)