MFC 控件編程之水平滾動條跟垂直滾動條


        MFC 控件編程之水平滾動條跟垂直滾動條

一點水平滾動條的操作

  首先在操作滾動條的時候.我們要知道滾動條的一些屬性. 比如我們要設置 最大值 最小值. 以及每次遞增的值是多少.都要設置.

所有就有一個結構.專門存儲了滾動條信息. 而我們在對話框一啟動就要進行控件初始化.下方看下結構.

typedef struct tagSCROLLINFO {
  UINT cbSize;                         自身大小
  UINT fMask;                          滾動條的范圍.左邊->右邊方式.
  int  nMin;                              滾動條最小值
  int  nMax;                             滾動條最大值
  UINT nPage;                          每次滾動的值
  int  nPos;                              位置
  int  nTrackPos;                        位置
} SCROLLINFO, *LPSCROLLINFO;

然后我們使用封裝好的API 進行設置.

BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

滾動條是一個類. MFC給我們封裝好的.所以我們直接使用封裝好的函數即可.

初始化的時候需要做的.

  SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_RANGE | SIF_PAGE;   //設置范圍.
    si.nMin = 0;                         //最小值1
    si.nMax = 100;                     //最大值100
    si.nPage = 1;                     //每次遞增1

    //設置滾動條信息.
    m_hor.SetScrollInfo(&si);

此時我們初始化好了.但是我們要對它的消息進行處理.才可以使用這個滾動條.

二丶指定點擊水平滾動條消息  WM_HSCROLL

我們第一個就是要對點擊這個滾動條的消息進行處理.

對話框-> 屬性 -> 事件 -> 響應消息.

我們在單擊水平滾動條里面.判斷是哪個消息進行不同的處理即可. 比如 點擊左邊箭頭. 點擊右邊箭頭. 等等. 值遞增.

代碼如下.當我們響應了單擊滾動條信息的時候

void C滾動條Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
  參數1 代表的是消息.
//處理滾動條的每一個消息.進行處理. switch (nSBCode) { case SB_THUMBTRACK: //判斷消息是否是拉動滾動條 break; case SB_LINELEFT: //箭頭向左的消息 break; case SB_LINERIGHT: //箭頭向右的消息 break; case SB_PAGELEFT: // 值遞減.也就是向左翻頁 break; case SB_PAGERIGHT: //值遞增.也就是向右翻頁. break; break; default: break; } CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }

沒有具體寫代碼.當我們寫代碼的時候.要先獲取當前滾動條的狀態信息.

1.點擊右箭頭位置遞增

void C滾動條Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

    SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL;  //獲取所有滾動條消息
    pScrollBar->GetScrollInfo(&si); //通過這個函數.獲取滾動條信息.

    //si里面就有所有的信息.
    int nNewPos = si.nPos;  //獲取最新的位置.

    //處理滾動條的每一個消息.進行處理.
    switch (nSBCode)
    {
    case SB_THUMBTRACK:  //判斷消息是否是拉動滾動條
        
        break;
    case SB_LINELEFT:   //箭頭向左的消息
        break;

    case SB_LINERIGHT:  //箭頭向右的消息
        nNewPos += 2; //我們的值加了.所以設置到滾動條里面
        break;
    case SB_PAGELEFT:   // 值遞減.也就是向左翻頁
        break;
    case SB_PAGERIGHT:  //值遞增.也就是向右翻頁.
        break;
        break;

    default:
        break;
    }
    
    pScrollBar->SetScrollPos(nNewPos);
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

思路:

  1.獲取當前滾動條信息. 因為當前滾動條信息里面有滾動條里最新的位置.

  2.保存位置.

  3.設置到滾動條上面.

參數三就是當前滾動條類.所以我們可以使用 封裝好的方法.用來獲取當前信息.以及設置當前位置到這個滾動條上面.

2.一個正常使用的垂直滾動條的完整代碼.

void C滾動條Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

    SCROLLINFO si = { 0 };
    si.cbSize = sizeof(SCROLLINFO);
    si.fMask = SIF_ALL;  //獲取所有滾動條消息
    pScrollBar->GetScrollInfo(&si); //通過這個函數.獲取滾動條信息.

    //si里面就有所有的信息.
    int nNewPos = si.nPos;  //獲取最新的位置.

    //處理滾動條的每一個消息.進行處理.
    switch (nSBCode)
    {
    case SB_THUMBTRACK:  //判斷消息是否是拉動滾動條
        nNewPos = nPos;            //如果拖動滑塊.那么參數2就是最新位置.
        break;
    case SB_LINELEFT:   //箭頭向左的消息
        nNewPos -= 2; //我們的值加了.所以設置到滾動條里面
        break;

    case SB_LINERIGHT:  //箭頭向右的消息
        nNewPos += 2; //我們的值加了.所以設置到滾動條里面
        break;
    case SB_PAGELEFT:   // 值遞減.也就是向左翻頁    點擊滾動條左邊空格的時候
        nNewPos -= si.nPage;
        break;
    case SB_PAGERIGHT:  //值遞增.也就是向右翻頁.
        nNewPos += si.nPage;
        break;
        break;

    default:
        break;
    }
    
    //需要判斷位置是否超出.
    if (nNewPos > si.nMax)
    {
        nNewPos = si.nMin;
    }
    if (nNewPos < si.nMin)
    {
        nNewPos = si.nMin;
    }
    pScrollBar->SetScrollPos(nNewPos);
    CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

三丶總結

  1.首先要設置滾動條的各項屬性. 有一個結構體SCROLLINFO .並且使用封裝的方法進行初始化 SetScrollInfo(&結構)

  2.要在對話框屬性上面.響應滾動條單擊的消息.  WM_HSCROLL

  3.此時響應過后的回調函數會有三個參數.

      參數1 : 滾動條信息. 因為我們還要處理其余信息.

      參數2: 當滾動條拖動的時候.保存拖動過后的最新位置.

      參數3: 滾動條信息. 保存了滾動條的當前狀態信息.

  4.需要通過第三個參數. 獲取滾動條當前狀態信息. GetScrollInfo(&結構) 我們的結構的標志要設置為獲取全部信息的標志.

  5.創建一個變量.保存當前狀態中的垂直滾動條的位置.

  6.通過SWITCH 語句.判斷不同的滾動條消息. 進行位置的設置.

  7.判斷是否越界.如果越界.設置為滾動條最小值. 

  8.使用封裝好的函數.設置到當前滾動條中. 也就是設置位置.SetScrollPos(新的位置)

 四丶垂直滾動條的使用

垂直滾動條跟水平滾動條是一樣的.只不過處理的消息不一樣了.下方特貼一份源碼.學習源碼即可.跟上面一樣.

int ChyperlinkDlg::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;    
    
    switch(nSBCode)    
    {    
    case SB_LINEUP /*SB_LINELEFT*/:       //消息不一樣了.
        result = max(si.nPos - 1, minPos);    
        break;    
    case SB_LINEDOWN /*SB_LINERIGHT*/:    
        result = min(si.nPos + 1, 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;    
}    

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM