看上去不能用一句兩句話記錄,所以還是轉到博客上。
首先是一些函數介紹
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。此時的對話框模板如下圖:
3. 爲滾動條IDC_HORI_SCROLLBAR添加CScrollBar類型的控件變量m_horiScrollbar。
4. 在對話框初始化時,我們需要設置滾動條的滾動範圍和初始位置,並在編輯框中顯示初始位置,那麼需要修改CExample26Dlg::OnInitDialog()函數爲:
- BOOL CExample26Dlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- BOOL bNameValid;
- CString strAboutMenu;
- bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
- ASSERT(bNameValid);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
- // TODO: Add extra initialization here
- // 設置水平滾動條的滾動範圍爲1到100
- m_horiScrollbar.SetScrollRange(1, 100);
- // 設置水平滾動條的初始位置爲20
- m_horiScrollbar.SetScrollPos(20);
- // 在編輯框中顯示20
- SetDlgItemInt(IDC_HSCROLL_EDIT, 20);
- return TRUE; // return TRUE unless you set the focus to a control
- }
5. 現在滾動條還不能正常滾動,並且編輯框中數字也不隨滾動改變。根據上面所講,我們可以重載CExample26Dlg類的OnHScroll函數。具體操作爲,在CExample26Dlg類的屬性頁面的工具欄上點“Messages”按鈕,找到WM_HSCROLL消息,添加響應函數就可以了。OnHScroll函數重寫後如下:
- void CExample26Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
- {
- // TODO: Add your message handler code here and/or call default
- int pos = m_horiScrollbar.GetScrollPos(); // 獲取水平滾動條當前位置
- switch (nSBCode)
- {
- // 如果向左滾動一列,則pos減1
- case SB_LINEUP:
- pos -= 1;
- break;
- // 如果向右滾動一列,則pos加1
- case SB_LINEDOWN:
- pos += 1;
- break;
- // 如果向左滾動一頁,則pos減10
- case SB_PAGEUP:
- pos -= 10;
- break;
- // 如果向右滾動一頁,則pos加10
- case SB_PAGEDOWN:
- pos += 10;
- break;
- // 如果滾動到最左端,則pos爲1
- case SB_TOP:
- pos = 1;
- break;
- // 如果滾動到最右端,則pos爲100
- case SB_BOTTOM:
- pos = 100;
- break;
- // 如果拖動滾動塊滾動到指定位置,則pos賦值爲nPos的值
- case SB_THUMBPOSITION:
- pos = nPos;
- break;
- // 下面的m_horiScrollbar.SetScrollPos(pos);執行時會第二次進入此函數,最終確定滾動塊位置,並且會直接到default分支,所以在此處設置編輯框中顯示數值
- default:
- SetDlgItemInt(IDC_HSCROLL_EDIT, pos);
- return;
- }
- // 設置滾動塊位置
- m_horiScrollbar.SetScrollPos(pos);
- CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
- }
6. 編譯運行程序,彈出結果對話框,可以自己拖動滾動塊看是否能正常滾動,並且編輯框中也顯示了正確的數值。效果如下:
至於垂直滾動條,其實與水平滾動條類似,就不再舉例了。
原文地址:http://www.jizhuomi.com/software/191.html