当前位置:C++技术网 > 资讯 > MFC深入理解实现滚动轮

MFC深入理解实现滚动轮

更新时间:2015-12-10 22:18:49浏览次数:1+次

MFC实现设置水平,垂直滚动轮》中实现的仅仅是滚动鼠标滚动轮,一旦你放开尝试拖动滑动轮放开后就没有用了,他会自己回复到原来的位置。现在我们就填补这些不足。

在VS编译器中调用WM_VSCROLL,WM_HSCROLL函数,并建立消息响应:

void CImagePanel::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 int nCurpos,nMin,nMax,nThumbWidth;
 SCROLLINFO siInfo;
 GetScrollInfo(SB_VERT,&siInfo);
 nCurpos = siInfo.nPos;
 nMin = siInfo.nMin;
 nMax = siInfo.nMax;
 nThumbWidth = siInfo.nPage;
 switch (nSBCode)
 {
 case SB_THUMBTRACK:///////拖动滚动框到指定位置
  nCurpos = GetScrollPos(SB_VERT);
  ScrollWindow(0,-(nPos-nCurpos));
  SetScrollPos(SB_VERT,nPos);
 break;

 case SB_LINELEFT:////向左滚动一个单位
  nCurpos = GetScrollPos(SB_VERT);
  SetScrollPos(SB_VERT,nCurpos-1);
  if (nCurpos !=0)
   ScrollWindow(0,1);
 break;
 case SB_LINERIGHT:////向右滚动一个单位
  nCurpos = GetScrollPos(SB_VERT);
  SetScrollPos(SB_VERT,nCurpos+1);
  if (nCurpos+nThumbWidth < nMax)
   ScrollWindow(0,-1);
 break;
 case SB_PAGELEFT: //在滚动块的上方空白滚动区域单击,增量为6
  SetScrollPos(SB_VERT,nCurpos-6);
  if (nCurpos+nThumbWidth >0)
   ScrollWindow(0,6);
 break;
 case SB_PAGERIGHT: //在滚动块的下方空白滚动区域单击,增量为6
  SetScrollPos(SB_VERT,nCurpos+6);
  if (nCurpos+nThumbWidth < nMax)
   ScrollWindow(0,-6);
 break;
 case SB_LEFT:
  SetScrollPos(SB_VERT,0);
  ScrollWindow(0,nCurpos);
 break;
 }
 CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CImagePanel::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 int nCurpos,nMin,nMax,nThumbWidth;
 //定义滚动信息
 SCROLLINFO siInfo;
 //获取水平滚动条的滚动信息
 GetScrollInfo(SB_HORZ,&siInfo);
 //获取当前的滚动位置
 nCurpos = siInfo.nPos;
 //获取滚动范围
 nMin = siInfo.nMin;
 nMax = siInfo.nMax;
 //获取滚动块大小
 nThumbWidth = siInfo.nPage;
 switch (nSBCode)
 {
 break;
 case SB_THUMBTRACK:	 //拖动滚动块
  //滚动窗口到指定的位置
  ScrollWindow(-(nPos-nCurpos),0);
  //设置滚动条新的位置
  SetScrollPos(SB_HORZ,nPos);
 break;
 case SB_LINELEFT : //单击左箭头
  SetScrollPos(SB_HORZ,nCurpos-1);
  if (nCurpos != 0)
   ScrollWindow(1,0);
 break;
 case SB_LINERIGHT: //单击右箭头
  SetScrollPos(SB_HORZ,nCurpos+1);
  if (nCurpos+nThumbWidth < nMax)
   ScrollWindow(-1,0);
 break;
 case SB_PAGELEFT: //在滚动块的左方空白滚动区域单击,增量为6
  SetScrollPos(SB_HORZ,nCurpos-6);
  if (nCurpos+nThumbWidth >0)
   ScrollWindow(6,0);
 break;
 case SB_PAGERIGHT: //在滚动块的右方空白滚动区域单击,增量为6
  SetScrollPos(SB_HORZ,nCurpos+6);
  if (nCurpos+nThumbWidth <nMax)
   ScrollWindow(-6,0);
 break;
 case SB_LEFT:
  SetScrollPos(SB_HORZ,0);
  ScrollWindow(nCurpos,0);
 break;
 }
 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

代码实现: