水平和竖直的滚动条可以在窗口的属性中添加,分别是:Horizontal scroll和Vertical scroll。
一.竖直滚动条
1.初始化
void CScroolDlgDlg::InitScrool()
{
CRect rtClient;
GetClientRect(rtClient);
SCROLLINFO vInfo;
vInfo.cbSize = sizeof(SCROLLINFO);
vInfo.fMask = SIF_ALL;
vInfo.nMax = 600;//这是你要滚动的范围
vInfo.nMin = vInfo.nPos = vInfo.nTrackPos = 0; //这个为0即可
vInfo.nPage = rtClient.bottom;//这是你窗口的高度(横向滚动条的话就是窗口的宽度)
SetScrollInfo(SB_VERT, &vInfo);//(SB_HORT就设置横向滚动条)
}
2.添加WM_VSCROLL事件
void CScroolDlgDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO vinfo = {0};
GetScrollInfo(SB_VERT, &vinfo, SIF_ALL);
int iPos = vinfo.nPos;
INT32 iMaxPos = vinfo.nMax-vinfo.nPage;
int hPage = vinfo.nPage;
int Inc = 1;
switch (nSBCode)
{
case SB_BOTTOM: //滚动到最下面
if (vinfo.nPos < iMaxPos)
{
ScrollWindow(0, -1*Inc * (iMaxPos-vinfo.nPos));
vinfo.nPos = iMaxPos;
}
break;
case SB_TOP: //滚动到最上面
if (vinfo.nPos > vinfo.nMin)
{
ScrollWindow(0, Inc * (vinfo.nPos-vinfo.nMin));
vinfo.nPos = vinfo.nMin;
}
break;
case SB_LINEUP: //向上滚动一行
if (vinfo.nPos > vinfo.nMin)
{
ScrollWindow(0, Inc);
vinfo.nPos -= 1;
}
break;
case SB_LINEDOWN: //向下滚动一行
if (vinfo.nPos < iMaxPos)
{
ScrollWindow(0, -1*Inc);
vinfo.nPos += 1;
}
break;
case SB_PAGEUP: //向上滚动一页
if (vinfo.nPos-100 >= vinfo.nMin)
{
ScrollWindow(0, 100*Inc);
vinfo.nPos -= 100;
}
else
{
// ScrollWindow(0, (vinfo.nPos-iMaxPos)*Inc);
if (vinfo.nPos <= 0)
{
ScrollWindow(0,0);
}
else
{
ScrollWindow(0,vinfo.nPos);
}
// ScrollWindow(0, max(0,(vinfo.nPos-iMaxPos)*Inc));
vinfo.nPos = vinfo.nMin;
}
break;
case SB_PAGEDOWN: //向下滚动一页
if (vinfo.nPos+100 <= iMaxPos)
{
ScrollWindow(0, -100*Inc);
vinfo.nPos += 100;
}
else
{
ScrollWindow(0, (vinfo.nPos-iMaxPos)*Inc);
vinfo.nPos = iMaxPos;
}
break;
case SB_ENDSCROLL: //滚动条移动结束
break;
case SB_THUMBPOSITION:
break;
case SB_THUMBTRACK:
ScrollWindow(0, Inc * (vinfo.nPos - nPos));
vinfo.nPos = nPos;
break;
}
SetScrollInfo(SB_VERT, &vinfo);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
二、水平滚动条
1.初始化
void CScroolDlgDlg::InitBottomScroll()
{
CRect rtClient;
GetClientRect(rtClient);
SCROLLINFO hInfo;
hInfo.cbSize = sizeof(SCROLLINFO);
hInfo.fMask = SIF_ALL;
hInfo.nMax = 1000;//这是你要滚动的范围
hInfo.nMin = hInfo.nPos = hInfo.nTrackPos = 0; //这个为0即可
hInfo.nPage = rtClient.Width();//这是窗口的宽度(如果是横向滚动条的话,就这是你窗口的高度)
SetScrollInfo(SB_HORZ, &hInfo);//(SB_VERT就设置纵向滚动条)
}
2.添加WM_HSCROLL事件
void CMySpaceSubmitInfo::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){
// TODO: Add your message handler code here and/or call default
SCROLLINFO hInfo = {0};
GetScrollInfo(SB_HORZ,&hInfo,SIF_ALL);
int iMaxPos = hInfo.nMax - hInfo.nPage;
int hPage = hInfo.nPage;
int inc = 1;
// Determine the new position of scroll box.
switch (nSBCode)
{
case SB_LEFT: // Scroll to far left.
ScrollWindow(inc *(hInfo.nPos-hInfo.nMin),0);
hInfo.nPos = hInfo.nMin;
break;
case SB_RIGHT: // Scroll to far right.
ScrollWindow(-1*inc*(iMaxPos - hInfo.nPos),0);
hInfo.nPos = iMaxPos;
break;
case SB_ENDSCROLL: // End scroll.
break;
case SB_LINELEFT: // Scroll left.
if (hInfo.nPos > hInfo.nMin)
{
ScrollWindow(inc,0);
hInfo.nPos -=1;
}
break;
case SB_LINERIGHT: // Scroll right.
if(hInfo.nPos <=iMaxPos)
{
ScrollWindow(-1*inc,0);
hInfo.nPos +=1;
}
break;
case SB_PAGELEFT: // Scroll one page left.
{
// Get the page size.
if (hInfo.nPos - 100 >= hInfo.nMin)
{
ScrollWindow(100*inc,0);
hInfo.nPos -=100;
}
else
{
if (hInfo.nPos <= 0)
{
ScrollWindow(0,0);
}
else
{
ScrollWindow(hInfo.nPos,0);
}
// ScrollWindow((hInfo.nPos - iMaxPos)*inc,0);
hInfo.nPos = hInfo.nMin;
}
}
break;
case SB_PAGERIGHT: // Scroll one page right.
{
// Get the page size.
if (hInfo.nPos + 100 <= iMaxPos)
{
ScrollWindow(-100*inc,0);
hInfo.nPos +=100;
}
else
{
ScrollWindow((hInfo.nPos - iMaxPos)*inc,0);
hInfo.nPos = iMaxPos;
}
}
break;
case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
// curpos = nPos; // of the scroll box at the end of the drag operation.
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
ScrollWindow(inc*(hInfo.nPos-nPos),0);
hInfo.nPos = nPos; // position that the scroll box has been dragged to.
break;
}
// Set the new position of the thumb (scroll box).
SetScrollInfo(SB_HORZ,&hInfo);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
三、使用鼠标滑动轮来滑动竖直窗口滚动条
1.添加事件:ON_WM_MOUSEWHEEL
2.代码:
BOOL CScroolDlgDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
SCROLLINFO vinfo = {0};
GetScrollInfo(SB_VERT, &vinfo, SIF_ALL);
int iPos = vinfo.nPos;
INT32 iMaxPos = vinfo.nMax-vinfo.nPage;
//首先判断鼠标滚动的方向/
//1.如果鼠标滚动条向上(远离使用者),此时zDelta的值为正.
//判断滚动条是否已经到了上顶了
if (zDelta > 0)
{
if (iPos <= 0)
{
;
}
else
{
int iScrollUp = iPos - zDelta;
if (iScrollUp < 0)
{
ScrollWindow(0,iPos);
vinfo.nPos = vinfo.nMin;
}
else
{
ScrollWindow(0,zDelta);
vinfo.nPos -= zDelta;
}
}
}
else if (zDelta < 0) //向下滑动鼠标滚动轮
{
if (iPos >= iMaxPos)
{
;
}
else
{
int iScrollDown = iPos + (-1)*zDelta;
if (iScrollDown > iMaxPos)
{
ScrollWindow(0,iPos-iMaxPos);
vinfo.nPos = iMaxPos;
}
else
{
ScrollWindow(0,zDelta);
vinfo.nPos = vinfo.nPos + (-1)*zDelta;
}
}
}
SetScrollInfo(SB_VERT,&vinfo);
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}
四、使用键盘上的上下箭头进行滑动窗口滚动条
1.添加消息:PreTranslateMessage
2.代码:
BOOL CScroolDlgDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN)
{
if (pMsg->wParam == VK_DOWN)
{
int iScroNum = 5;
SCROLLINFO vInfo = {0};
GetScrollInfo(SB_VERT,&vInfo,SIF_ALL);
int iPos = vInfo.nPos;
INT32 iMax = vInfo.nMax - vInfo.nPage;
//首先判断窗口滚动条是否已经到了最下面
if (iPos >= iMax)
{
;
}
else
{
//判断向下滑动5像素后是否会超过向下滑动的最大值
int iScrolDown = iScroNum + iPos;
if (iScroNum > iMax) //超过了
{
ScrollWindow(0,iPos - iMax);
vInfo.nPos = iMax;
}
else if (iScrolDown <= iMax) //移动后不超过最下面
{
ScrollWindow(0,(-1)*iScroNum);
vInfo.nPos += iScroNum;
}
}
SetScrollInfo(SB_VERT,&vInfo);
}//end down
if (pMsg->wParam == VK_UP)
{
SCROLLINFO vInfo = {0};
GetScrollInfo(SB_VERT,&vInfo,SIF_ALL);
int iPos = vInfo.nPos;
UINT32 iMaxPos = vInfo.nMax - vInfo.nPage;
int iScroNum= 5;//移动的
//首先判断是否已经到了最顶部
if (iPos <= 0)
{
;
}
else
{
//判断当滚动后是否超出顶部
int iScrollUp = iPos - iScroNum;
if (iScrollUp < 0) //超出了
{
ScrollWindow(0,iPos);
vInfo.nPos = vInfo.nMin;
}
else if (iScrollUp >= 0)
{
ScrollWindow(0,iScroNum);
vInfo.nPos -= iScroNum;
}
}
SetScrollInfo(SB_VERT,&vInfo);
}//end up
}
return CDialog::PreTranslateMessage(pMsg);
}
附:水平有限,如有其他好的建议请各位同修提出。