1. 程式人生 > >【轉】關於MFC程式中ScrollBar的用法簡單介紹

【轉】關於MFC程式中ScrollBar的用法簡單介紹

看上去不能用一句兩句話記錄,所以還是轉到部落格上。

首先是一些函式介紹

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

       用於設定滾動條的各種引數資訊。引數lpScrollInfo為指向SCROLLINFO結構體變數的指標,引數bRedraw表示是否需要重繪滾動條,如果為TRUE,則重繪。該函式操作成功則返回TRUE,否則返回FALSE。

       int GetScrollPos( ) const;

       獲取滾動塊的當前位置。如果失敗則返回0。

       int SetScrollPos(int nPos, BOOL bRedraw = TRUE);

       將滾動塊移動到指定位置。引數nPos指定了滾動塊的新位置,引數bRedraw 表示是否需要重繪滾動條,如果為TRUE,則重繪。函式返回滾動框原來的位置,若操作失敗則返回0。

       void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;

       獲取滾動條的滾動範圍。引數lpMinPos指向滾動條滾動範圍的最小值,引數lpMaxPos指向滾動條滾動範圍的最大值。

       void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);

       用於指定滾動條的滾動範圍。引數nMinPos 和nMaxPos 分別指定了滾動範圍的最小值和最大值,兩者的差不得超過32767。當兩者都為0 時,滾動條將被隱藏。引數bRedraw 表示是否需要重繪滾動條,如果為TRUE,則重繪。

       OnHScroll()與OnVScroll()函式

       無論是標準滾動條,還是滾動條控制元件,滾動條的通知訊息都是用WM_HSCROLL 和WM_VSCROLL訊息傳送出去的。對這兩個訊息的預設處理函式是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生類中對這兩個函式進行過載,以實現滾動功能。也就是說,假設在一個對話方塊中放入了一個水平滾動條,我們可以在對話方塊類中過載OnHScroll函式,並在OnHScroll函式中實現滾動功能。

       這兩個函式的宣告如下:

       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。

       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. 建立一個基於對話方塊的MFC工程,名稱設定為“Example26”。

       2. 在自動生成的對話方塊模板IDD_EXAMPLE26_DIALOG中,刪除“TODO: Place dialog controls here.”靜態文字控制元件、“OK”按鈕和“Cancel”按鈕。新增一個Horizontal Scroll Bar控制元件,ID設定為IDC_HORI_SCROLLBAR。再新增一個靜態文字控制元件和一個編輯框,靜態文字控制元件的Caption屬性設為“滾動塊當前位置:”,編輯框的ID設為IDC_HSCROLL_EDIT,Read Only屬性設為True。此時的對話方塊模板如下圖:

VS2010/MFC程式設計入門之二十六(常用控制元件:滾動條控制元件Scroll Bar)

      
       3. 為滾動條IDC_HORI_SCROLLBAR新增CScrollBar型別的控制元件變數m_horiScrollbar。

       4. 在對話方塊初始化時,我們需要設定滾動條的滾動範圍和初始位置,並在編輯框中顯示初始位置,那麼需要修改CExample26Dlg::OnInitDialog()函式為:

C++程式碼
  1. BOOL CExample26Dlg::OnInitDialog()   
  2. {   
  3.     CDialogEx::OnInitDialog();   
  4. // Add "About..." menu item to system menu. 
  5. // IDM_ABOUTBOX must be in the system command range. 
  6.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);   
  7.     ASSERT(IDM_ABOUTBOX < 0xF000);   
  8.     CMenu* pSysMenu = GetSystemMenu(FALSE);   
  9. if (pSysMenu != NULL)   
  10.     {   
  11. BOOL bNameValid;   
  12.         CString strAboutMenu;   
  13.         bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   
  14.         ASSERT(bNameValid);   
  15. if (!strAboutMenu.IsEmpty())   
  16.         {   
  17.             pSysMenu->AppendMenu(MF_SEPARATOR);   
  18.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   
  19.         }   
  20.     }   
  21. // Set the icon for this dialog.  The framework does this automatically 
  22. //  when the application's main window is not a dialog 
  23.     SetIcon(m_hIcon, TRUE);         // Set big icon 
  24.     SetIcon(m_hIcon, FALSE);        // Set small icon 
  25. // TODO: Add extra initialization here 
  26. // 設定水平滾動條的滾動範圍為1到100 
  27.     m_horiScrollbar.SetScrollRange(1, 100);   
  28. // 設定水平滾動條的初始位置為20 
  29.     m_horiScrollbar.SetScrollPos(20);   
  30. // 在編輯框中顯示20 
  31.     SetDlgItemInt(IDC_HSCROLL_EDIT, 20);   
  32. return TRUE;  // return TRUE  unless you set the focus to a control 
  33. }  

       5. 現在滾動條還不能正常滾動,並且編輯框中數字也不隨滾動改變。根據上面所講,我們可以過載CExample26Dlg類的OnHScroll函式。具體操作為,在CExample26Dlg類的屬性頁面的工具欄上點“Messages”按鈕,找到WM_HSCROLL訊息,新增響應函式就可以了。OnHScroll函式重寫後如下:

C++程式碼
  1. void CExample26Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)   
  2. {   
  3. // TODO: Add your message handler code here and/or call default 
  4. int pos = m_horiScrollbar.GetScrollPos();    // 獲取水平滾動條當前位置 
  5. switch (nSBCode)    
  6.     {    
  7. // 如果向左滾動一列,則pos減1 
  8. case SB_LINEUP:    
  9.             pos -= 1;    
  10. break;    
  11. // 如果向右滾動一列,則pos加1 
  12. case SB_LINEDOWN:    
  13.             pos  += 1;    
  14. break;    
  15. // 如果向左滾動一頁,則pos減10 
  16. case SB_PAGEUP:    
  17.             pos -= 10;    
  18. break;    
  19. // 如果向右滾動一頁,則pos加10 
  20. case SB_PAGEDOWN:    
  21.             pos  += 10;    
  22. break;    
  23. // 如果滾動到最左端,則pos為1 
  24. case SB_TOP:    
  25.             pos = 1;    
  26. break;    
  27. // 如果滾動到最右端,則pos為100 
  28. case SB_BOTTOM:    
  29.             pos = 100;    
  30. break;      
  31. // 如果拖動滾動塊滾動到指定位置,則pos賦值為nPos的值 
  32. case SB_THUMBPOSITION:    
  33.             pos = nPos;    
  34. break;    
  35. // 下面的m_horiScrollbar.SetScrollPos(pos);執行時會第二次進入此函式,最終確定滾動塊位置,並且會直接到default分支,所以在此處設定編輯框中顯示數值 
  36. default:    
  37.             SetDlgItemInt(IDC_HSCROLL_EDIT, pos);   
  38. return;    
  39.     }    
  40. // 設定滾動塊位置 
  41.     m_horiScrollbar.SetScrollPos(pos);   
  42.     CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);   
  43. }  

       6. 編譯執行程式,彈出結果對話方塊,可以自己拖動滾動塊看是否能正常滾動,並且編輯框中也顯示了正確的數值。效果如下:

VS2010/MFC程式設計入門之二十六(常用控制元件:滾動條控制元件Scroll Bar)

        至於垂直滾動條,其實與水平滾動條類似,就不再舉例了。

原文地址:http://www.jizhuomi.com/software/191.html