美文网首页
MFC进度条的使用

MFC进度条的使用

作者: 侧漏的少年 | 来源:发表于2016-11-15 16:41 被阅读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);
    }
    

    相关文章

      网友评论

          本文标题:MFC进度条的使用

          本文链接:https://www.haomeiwen.com/subject/oaclpttx.html