MFC進度條的使用

對話框.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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,523評論 0 17
  • 前言 編譯器優化介紹 由于內存訪問速度遠不及CPU處理速度,為提高機器整體性能,在硬件上引入硬件高速緩存Cache...
    李若賢閱讀 310評論 0 0
  • 這一兩年來養成了買書看書的習慣,陸陸續續也買了幾十本書了,但是一直沒有養成一個天天看書的習慣。今天突然想要做個決定...
    MageekChiu閱讀 1,073評論 0 40