OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int nMin,nMax,nCurPos,nDis; nDis=0; GetScrollRange(SB_VERT,&nMin,&nMax); nCurPos=GetScrollPos (SB_VERT); SCROLLINFO si ; GetScrollInfo (SB_VERT,&si,SIF_ALL); switch(nSBCode) //处理滚动信息 { case SB_LINEUP: //向左的箭头被按下 nCurPos=nCurPos-10; Invalidate(); break; case SB_LINEDOWN: nCurPos=nCurPos+10; Invalidate(); break; //向右的箭头被按下 case SB_THUMBTRACK: //鼠标拖动 si.cbSize=sizeof(SCROLLINFO); GetScrollInfo(SB_VERT,&si,SIF_TRACKPOS); nPos=si.nTrackPos; SetScrollPos(SB_VERT,nPos); nDis=(int)nPos-nCurPos; if (nDis>20||nDis<-20) { Invalidate(); nCurPos+=nDis; } break; } if(nCurPos>nMax) nCurPos=nMax; SetScrollPos(SB_VERT,nCurPos); //更新信息 CScrollView::OnVScroll(nSBCode, nPos, pScrollBar); }
因为: 窗口滚动条不是控件滚动条 所以pScrollBar始终为NULL
同时,nPos参数只有16位长.克服这个限制可以使用SCROOLINFO结构运行::GetScrollInfo.SCROLLINFO 结构中的nTrackPos是一个真正的32位
因此,如果滚动条范围很大,需要使用SCROOLINFO获得32位的值
参考资料:
http://bbs.csdn.net/topics/300120695