现在的位置: 首页 > 综合 > 正文

CStrollView 滚动条

2013年08月22日 ⁄ 综合 ⁄ 共 908字 ⁄ 字号 评论关闭
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

抱歉!评论已关闭.