MFC进度条的使用
2016-11-15 本文已影响0人
侧漏的少年
对话框.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);
}