對話框.h文件加入
//設置滾動條
int GetScrollPos(int nBar, UINT nSBCode); //獲取滾動條的位置
void ScrollClient(int nBar, int nPos); //移動客戶區域,也就是移動進度條的時候移動窗口內容
void VScrool(int nBar, UINT nSBCode);
添加兩個消息:
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
對話框.cpp文件加入
OnInitDialog()函數添加:
//開始
CRect rc;
GetClientRect(&rc);
//獲取窗口的大小,后面將會用這個來改變進度條的作用范圍
const SIZE sz = { rc.right - rc.left, rc.bottom - rc.top };
SCROLLINFO si;
//下面兩個函數不論是SetScrollInfo還是GetScrollInfo都應該有
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
si.nPos = si.nMin = 1; //進度條當前位置
si.nMax = sz.cy; //進度條的作用范圍,就是窗口總的長度,而不是展示在顯示器上的長度。
si.nPage = sz.cy; //定義每一頁的大小。這個意思是,在進度條下面點擊,窗口滾動的長度。這里滾動一次是視口的大小。
SetScrollInfo(SB_VERT, &si, FALSE); //此函數將產生一個垂直滾動條,TRUE是重繪,FALSE是不重繪
ShowScrollBar(SB_VERT, TRUE);
//結束
添加幾個函數的實現過程
//滑動滾動條的時候的響應
void CComSortDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
VScrool(SB_VERT, nSBCode);
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
//Invalidate();
}
//移動窗口內容
void CComSortDlg::ScrollClient(int nBar, int nPos)
{
static int s_prevx = 1;
static int s_prevy = 1;
int cx = 0;
int cy = 0;
int& delta = cy;
int& prev = s_prevy;
delta = prev - nPos;
prev = nPos;
if (cx || cy)
{
ScrollWindow(cx, cy, NULL, NULL);
}
}
//獲取進度條的位置
int CComSortDlg::GetScrollPos(int nBar, UINT nSBCode)
{
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
GetScrollInfo(nBar, &si);
const int minPos = si.nMin;
const int maxPos = si.nMax - (si.nPage - 1);
int result = -1;
// SB_PAGEDOWN 向下滾動一頁
// SB_LINEDOWN 向下滾動一行
// SB_PAGEUP 向上滾動一頁
// SB_LINEUP 向上滾動一行
// SB_TOP 滾動到頂端
// SB_BOTTOM 滾動到底部
// SB_THUMBPOSITION 用戶有拖動滾動框 (滑塊),并釋放鼠標按鈕。HIWORD 指示在拖動操作結束時滾動框的位置。
// SB_THUMBTRACK 用戶正在拖動滾動框。直到用戶釋放鼠標按鈕,反復發送此郵件。HIWORD 指示滾動框已被拖動到的位置。
switch (nSBCode)
{
case SB_LINEUP /*SB_LINELEFT*/:
result = max(si.nPos - 20, minPos);
break;
case SB_LINEDOWN /*SB_LINERIGHT*/:
result = min(si.nPos + 20, maxPos);
break;
case SB_PAGEUP /*SB_PAGELEFT*/:
result = max(si.nPos - (int)si.nPage, minPos);
break;
case SB_PAGEDOWN /*SB_PAGERIGHT*/:
result = min(si.nPos + (int)si.nPage, maxPos);
break;
case SB_THUMBPOSITION:
// do nothing
break;
case SB_THUMBTRACK:
result = si.nTrackPos;
break;
case SB_TOP /*SB_LEFT*/:
result = minPos;
break;
case SB_BOTTOM /*SB_RIGHT*/:
result = maxPos;
break;
case SB_ENDSCROLL:
// do nothing
break;
}
return result;
}
void CComSortDlg::VScrool(int nBar, UINT nSBCode)
{
const int scrollPos = GetScrollPos(nBar, nSBCode);
if (scrollPos == -1)
return;
SetScrollPos(nBar, scrollPos, TRUE);
ScrollClient(nBar, scrollPos);
}
//鼠標滑輪滾動的效果
BOOL CComSortDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
if (zDelta < 0)
{
OnVScroll(SB_LINEDOWN, 0, GetScrollBarCtrl(SB_VERT));
}
else if (zDelta > 0)
{
OnVScroll(SB_LINEUP, 0, GetScrollBarCtrl(SB_VERT));
}
return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}