MFC常用控件之滾動條


近期學習了雞啄米大神的博客,對其中的一些知識點做了一些自己的總結。不過,博客內容大部分來自雞啄米。因此,這個博客算是轉載博客,只是加了一些我自己的理解而已。若想學習雞啄米大神的博客總結,請點擊連接:http://www.jizhuomi.com/software/257.html

1.滾動條分為水平滾動條(Horizontal Scroll Bar)和垂直滾動條(Vertical Scroll Bar)兩種.  MFC也為滾動條控件的操作提供了類,即為CScrollBar類。像列表框和組合框設置了WS_HSCROLL 或WS_VSCROLL風格以后出現的滾動條,不是一個獨立的窗口,而是這些窗口的一部分,這就是標准滾動條。而滾動條控件是一個獨立的窗口,它可以獲得焦點,響應某些操作。

2.創建滾動條:
virtual BOOL Create(
   DWORD dwStyle,
   const RECT& rect,
   CWnd* pParentWnd,
   UINT nID
);
下面針對dwStyle參數進行詳細講解:
    SBS_HORZ:指定滾動條為水平滾動條。如果沒有指定SBS_BOTTOMALIGN或SBS_TOPALIGN風格,則滾動條的高度、寬度和位置由Create函數的rect參數給出。
    SBS_VERT:指定滾動條為垂直滾動條。如果沒有指定SBS_RIGHTALIGN或SBS_LEFTALIGN風格,則滾動條的高度、寬度和位置由Create函數的rect參數給出。
    SBS_TOPALIGN:與SBS_HORZ配合使用。滾動條的上邊緣與Create函數的rect參數指定矩形的上邊緣對齊。滾動條高度為系統滾動條的默認高度。
    SBS_BOTTOMALIGN:與SBS_HORZ配合使用。滾動條的下邊緣與Create函數的rect參數指定矩形的下邊緣對齊。滾動條高度為系統滾動條的默認高度。
    SBS_LEFTALIGN:與SBS_VERT配合使用。滾動條的左邊緣與Create函數的rect參數指定矩形的左邊緣對齊。滾動條寬度為系統滾動條的默認寬度。
    SBS_RIGHTALIGN:與SBS_VERT配合使用。滾動條的右邊緣與Create函數的rect參數指定矩形的右邊緣對齊。滾動條寬度為系統滾動條的默認寬度。
    dwStyle參數可以是以上風格中某幾個的組合,另外一般也會用到WS_CHILD、WS_VISIBLE風格。

3.獲取滾動條參數信息函數:BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);
獲取的滾動條的參數信息,該信息為SCROLLINFO結構體的形式。參數lpScrollInfo為指向SCROLLINFO結構體變量的指針。

 1     typedef struct tagSCROLLINFO {  2         UINT cbSize;         // 結構的尺寸(字節為單位) 
 3         UINT fMask;          // 說明結構中的哪些參數是有效的,可以是屏蔽值的組合,如SIF_POS|SIF_PAGE,若為SIF_ALL則整個結構都有效 
 4         int  nMin;           // 滾動范圍最小值,當fMask 中包含SIF_RANGE 時有效 
 5         int  nMax;           // 滾動范圍最大值,當fMask 中包含SIF_RANGE 時有效 
 6         UINT nPage;          // 頁尺寸,用來確定比例滾動框的大小,當fMask中包含SIF_PAGE時有效 
 7         int  nPos;           // 滾動框的位置,當fMask 中包含SIF_POS 有效 
 8         int  nTrackPos;      // 滾動時滾動框的位置,當fMask 中包含SIF_TRACKPOS 時有效,該參數只能查詢,不能設置,最好不要用該參數來查詢拖動時滾動框的位置 
 9     }   SCROLLINFO, *LPSCROLLINFO; 10     typedef SCROLLINFO CONST *LPCSCROLLINFO;  
View Code

4.設置滾動條參數信息:BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);參數bRedraw表示是否需要重繪滾動條,如果為TRUE,則重繪。

5.獲取滾動條位置: int GetScrollPos()const;

6.將滾動塊移動到指定位置:int SetScrollPos(int nPos, BOOL bRedraw = TRUE);

7.獲取滾動條的滾動范圍:void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;

6.消息處理函數:滾動條的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息發送出去的。對這兩個消息的默認處理函數是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生類中對這兩個函數進行重載,以實現滾動功能。函數聲明如下:
    afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
    afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
    參數:
    nSBCode是通知消息碼;nPos 是滾動框的位置,只有在nSBCode為SB_THUMBPOSITION或SB_THUMBTRACK時,該參數才有意義。如果通知消息是滾動條控件發來的,那么pScrollBar 是指向該控件的指針,如果是標准滾動條發來的,則pScrollBar 為NULL。
    滾動條消息通知碼nSBCode:
       SB_BOTTOM/SB_RIGHT:滾動到底端(右端)
       SB_TOP/SB_LEFT:滾動到頂端(左端)
       SB_LINEDOWN/SB_LINERIGHT:向下(向右)滾動一行(列)
       SB_LINEUP/SB_LINELEFT:向上(向左)滾動一行(列)
       SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滾動一頁
       SB_PAGEUP/SB_PAGELEFT:向上(向左)滾動一頁
       SB_THUMBPOSITION:滾動到指定位置
       SB_THUMBTRACK:滾動框被拖動。可利用該消息來跟蹤對滾動框的拖動
       SB_ENDSCROLL:滾動結束

示例代碼:

 

 1 創建滾動條:  2 m_scrollBar.Create(WS_CHILD|WS_VISIBLE|SBS_HORZ,CRect(10,10,250,50),this,1136);  3     m_scrollBar.SetScrollRange(1,100);  4 
 5 滾動條響應事件:  6 void CMFC_NoramlControlDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  7 {  8     
 9     static int pos=0; 10     pos=m_scrollBar.GetScrollPos(); 11     switch(nSBCode) 12  { 13     case SB_THUMBPOSITION: 14         pos=nPos+10; 15         break; 16     case SB_THUMBTRACK: 17         pos=nPos; 18         break; 19     case SB_LINELEFT: 20         pos=nPos-5; 21         break; 22     case SB_PAGELEFT: 23         pos=nPos-10; 24         break; 25     case SB_LINERIGHT: 26         pos=nPos+5; 27         break; 28     case SB_PAGERIGHT: 29         pos=nPos+10; 30         break; 31  } 32  m_scrollBar.SetScrollPos(pos); 33  CString strPos; 34     strPos.Format("%d",pos); 35     GetDlgItem(IDC_STATIC1)->SetWindowText(strPos); 36  CDialog::OnHScroll(nSBCode, nPos, pScrollBar); 37 }
View Code

 

 

 

 


免責聲明!

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



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