轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-03-29 11:16:16.390|閱讀 1392 次
概述:滾動(dòng)條大家也很熟悉了,Windows窗口中很多都有滾動(dòng)條。前面講的列表框和組合框設(shè)置了相應(yīng)屬性后,如果列表項(xiàng)顯示不下也會(huì)出現(xiàn)滾動(dòng)條。滾動(dòng)條分為水平滾動(dòng)條(Horizontal Scroll Bar)和垂直滾動(dòng)條(Vertical Scroll Bar)兩種。滾動(dòng)條中有一個(gè)滾動(dòng)塊,用于標(biāo)識(shí)滾動(dòng)條當(dāng)前滾動(dòng)的位置。我們可以拖動(dòng)滾動(dòng)塊,也可以用鼠標(biāo)點(diǎn)擊滾動(dòng)條某一位置使?jié)L動(dòng)塊移動(dòng)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
相關(guān)鏈接:
回顧上一節(jié),講的是組合框控件Combo Box的使用。本節(jié)詳解滾動(dòng)條控件Scroll Bar的相關(guān)內(nèi)容。在內(nèi)容開(kāi)始前有必要了解一下MFC相關(guān)控件。
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫(kù),是MFC開(kāi)發(fā)中最全面界面控件套包,它提供了Windows開(kāi)發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
點(diǎn)擊下載Xtreme Toolkit Pro最新試用版
滾動(dòng)條控件簡(jiǎn)介
滾動(dòng)條大家也很熟悉了,Windows窗口中很多都有滾動(dòng)條。前面講的列表框和組合框設(shè)置了相應(yīng)屬性后,如果列表項(xiàng)顯示不下也會(huì)出現(xiàn)滾動(dòng)條。滾動(dòng)條分為水平滾動(dòng)條(Horizontal Scroll Bar)和垂直滾動(dòng)條(Vertical Scroll Bar)兩種。滾動(dòng)條中有一個(gè)滾動(dòng)塊,用于標(biāo)識(shí)滾動(dòng)條當(dāng)前滾動(dòng)的位置。我們可以拖動(dòng)滾動(dòng)塊,也可以用鼠標(biāo)點(diǎn)擊滾動(dòng)條某一位置使?jié)L動(dòng)塊移動(dòng)。
從滾動(dòng)條的創(chuàng)建形式來(lái)分,有標(biāo)準(zhǔn)滾動(dòng)條和滾動(dòng)條控件兩種。像列表框和組合框設(shè)置了WS_HSCROLL 或WS_VSCROLL風(fēng)格以后出現(xiàn)的滾動(dòng)條,不是一個(gè)獨(dú)立的窗口,而是這些窗口的一部分,這就是標(biāo)準(zhǔn)滾動(dòng)條。而滾動(dòng)條控件是一個(gè)獨(dú)立的窗口,它可以獲得焦點(diǎn),響應(yīng)某些操作。
滾動(dòng)條控件的創(chuàng)建
MFC也為滾動(dòng)條控件的操作提供了類,即為CScrollBar類。
滾動(dòng)條控件的創(chuàng)建依然有兩種方式,一種是直接在Toolbox中將滾動(dòng)條控件拖入對(duì)話框模板,然后添加控件變量使用,另一種就是用CScrollBar類的Create成員函數(shù)動(dòng)態(tài)創(chuàng)建。這兩種方式適用于不同的場(chǎng)合。
CScrollBar類的成員函數(shù)Create的函數(shù)原型如下:
virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
此函數(shù)與其他控件類的Create函數(shù)原型基本相同。參數(shù)dwStyle指定滾動(dòng)條控件的風(fēng)格,rect指定滾動(dòng)條控件的位置和尺寸,pParentWnd為指向滾動(dòng)條控件父窗口的指針,nID指定滾動(dòng)條控件的ID。下面雞啄米簡(jiǎn)單介紹幾個(gè)主要的滾動(dòng)條控件風(fēng)格,更加具體的可以查閱MSDN。
SBS_HORZ:指定滾動(dòng)條為水平滾動(dòng)條。如果沒(méi)有指定SBS_BOTTOMALIGN或SBS_TOPALIGN風(fēng)格,則滾動(dòng)條的高度、寬度和位置由Create函數(shù)的rect參數(shù)給出。
SBS_VERT:指定滾動(dòng)條為垂直滾動(dòng)條。如果沒(méi)有指定SBS_RIGHTALIGN或SBS_LEFTALIGN風(fēng)格,則滾動(dòng)條的高度、寬度和位置由Create函數(shù)的rect參數(shù)給出。
SBS_TOPALIGN:與SBS_HORZ配合使用。滾動(dòng)條的上邊緣與Create函數(shù)的rect參數(shù)指定矩形的上邊緣對(duì)齊。滾動(dòng)條高度為系統(tǒng)滾動(dòng)條的默認(rèn)高度。
SBS_BOTTOMALIGN:與SBS_HORZ配合使用。滾動(dòng)條的下邊緣與Create函數(shù)的rect參數(shù)指定矩形的下邊緣對(duì)齊。滾動(dòng)條高度為系統(tǒng)滾動(dòng)條的默認(rèn)高度。
SBS_LEFTALIGN:與SBS_VERT配合使用。滾動(dòng)條的左邊緣與Create函數(shù)的rect參數(shù)指定矩形的左邊緣對(duì)齊。滾動(dòng)條寬度為系統(tǒng)滾動(dòng)條的默認(rèn)寬度。
SBS_RIGHTALIGN:與SBS_VERT配合使用。滾動(dòng)條的右邊緣與Create函數(shù)的rect參數(shù)指定矩形的右邊緣對(duì)齊。滾動(dòng)條寬度為系統(tǒng)滾動(dòng)條的默認(rèn)寬度。
dwStyle參數(shù)可以是以上風(fēng)格中某幾個(gè)的組合,另外一般也會(huì)用到WS_CHILD、WS_VISIBLE風(fēng)格。例如,創(chuàng)建一個(gè)水平滾動(dòng)條控件,dwStyle參數(shù)應(yīng)該為WS_CHILD|WS_VISIBLE|SBS_HORZ,創(chuàng)建垂直滾動(dòng)條控件時(shí)dwStyle參數(shù)應(yīng)該為WS_CHILD|WS_VISIBLE|SBS_VERT。
CScrollBar類的主要成員函數(shù)
BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL);
獲取的滾動(dòng)條的參數(shù)信息,該信息為SCROLLINFO結(jié)構(gòu)體的形式。參數(shù)lpScrollInfo為指向SCROLLINFO結(jié)構(gòu)體變量的指針。SCROLLINFO結(jié)構(gòu)體的定義如下:
C++代碼
typedef struct tagSCROLLINFO { UINT cbSize; // 結(jié)構(gòu)的尺寸(字節(jié)為單位) UINT fMask; // 說(shuō)明結(jié)構(gòu)中的哪些參數(shù)是有效的,可以是屏蔽值的組合,如SIF_POS|SIF_PAGE,若為SIF_ALL則整個(gè)結(jié)構(gòu)都有效 int nMin; // 滾動(dòng)范圍最小值,當(dāng)fMask 中包含SIF_RANGE 時(shí)有效 int nMax; // 滾動(dòng)范圍最大值,當(dāng)fMask 中包含SIF_RANGE 時(shí)有效 UINT nPage; // 頁(yè)尺寸,用來(lái)確定比例滾動(dòng)框的大小,當(dāng)fMask中包含SIF_PAGE時(shí)有效 int nPos; // 滾動(dòng)框的位置,當(dāng)fMask 中包含SIF_POS 有效 int nTrackPos; // 滾動(dòng)時(shí)滾動(dòng)框的位置,當(dāng)fMask 中包含SIF_TRACKPOS 時(shí)有效,該參數(shù)只能查詢,不能設(shè)置,最好不要用該參數(shù)來(lái)查詢拖動(dòng)時(shí)滾動(dòng)框的位置 } SCROLLINFO, *LPSCROLLINFO; typedef SCROLLINFO CONST *LPCSCROLLINFO;
參數(shù)nMask 的含義與SCROLLINFO 結(jié)構(gòu)體中的fMask一樣。該函數(shù)在獲取信息成功則返回TRUE,否則返回FALSE。
BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE);
用于設(shè)置滾動(dòng)條的各種參數(shù)信息。參數(shù)lpScrollInfo為指向SCROLLINFO結(jié)構(gòu)體變量的指針,參數(shù)bRedraw表示是否需要重繪滾動(dòng)條,如果為T(mén)RUE,則重繪。該函數(shù)操作成功則返回TRUE,否則返回FALSE。
int GetScrollPos( ) const;
獲取滾動(dòng)塊的當(dāng)前位置。如果失敗則返回0。
int SetScrollPos(int nPos, BOOL bRedraw = TRUE);
將滾動(dòng)塊移動(dòng)到指定位置。參數(shù)nPos指定了滾動(dòng)塊的新位置,參數(shù)bRedraw 表示是否需要重繪滾動(dòng)條,如果為T(mén)RUE,則重繪。函數(shù)返回滾動(dòng)框原來(lái)的位置,若操作失敗則返回0。
void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const;
獲取滾動(dòng)條的滾動(dòng)范圍。參數(shù)lpMinPos指向滾動(dòng)條滾動(dòng)范圍的最小值,參數(shù)lpMaxPos指向滾動(dòng)條滾動(dòng)范圍的最大值。
void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);
用于指定滾動(dòng)條的滾動(dòng)范圍。參數(shù)nMinPos 和nMaxPos 分別指定了滾動(dòng)范圍的最小值和最大值,兩者的差不得超過(guò)32767。當(dāng)兩者都為0 時(shí),滾動(dòng)條將被隱藏。參數(shù)bRedraw 表示是否需要重繪滾動(dòng)條,如果為T(mén)RUE,則重繪。
OnHScroll()與OnVScroll()函數(shù)
無(wú)論是標(biāo)準(zhǔn)滾動(dòng)條,還是滾動(dòng)條控件,滾動(dòng)條的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息發(fā)送出去的。對(duì)這兩個(gè)消息的默認(rèn)處理函數(shù)是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生類中對(duì)這兩個(gè)函數(shù)進(jìn)行重載,以實(shí)現(xiàn)滾動(dòng)功能。也就是說(shuō),假設(shè)在一個(gè)對(duì)話框中放入了一個(gè)水平滾動(dòng)條,我們可以在對(duì)話框類中重載OnHScroll函數(shù),并在OnHScroll函數(shù)中實(shí)現(xiàn)滾動(dòng)功能。
這兩個(gè)函數(shù)的聲明如下:
afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar); afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
參數(shù)nSBCode是通知消息碼,主要通知碼及含義的介紹下面已列出。nPos 是滾動(dòng)框的位置,只有在nSBCode為SB_THUMBPOSITION或SB_THUMBTRACK時(shí),該參數(shù)才有意義。如果通知消息是滾動(dòng)條控件發(fā)來(lái)的,那么pScrollBar 是指向該控件的指針,如果是標(biāo)準(zhǔn)滾動(dòng)條發(fā)來(lái)的,則pScrollBar 為NULL。
SB_BOTTOM/SB_RIGHT:滾動(dòng)到底端(右端)
SB_TOP/SB_LEFT:滾動(dòng)到頂端(左端)
SB_LINEDOWN/SB_LINERIGHT:向下(向右)滾動(dòng)一行(列)
SB_LINEUP/SB_LINELEFT:向上(向左)滾動(dòng)一行(列)
SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滾動(dòng)一頁(yè)
SB_PAGEUP/SB_PAGELEFT:向上(向左)滾動(dòng)一頁(yè)
SB_THUMBPOSITION:滾動(dòng)到指定位置
SB_THUMBTRACK:滾動(dòng)框被拖動(dòng)。可利用該消息來(lái)跟蹤對(duì)滾動(dòng)框的拖動(dòng)
SB_ENDSCROLL:滾動(dòng)結(jié)束
CScrollBar類應(yīng)用實(shí)例
講完了基礎(chǔ)知識(shí),雞啄米還是給大家一個(gè)簡(jiǎn)單的實(shí)例。例子非常簡(jiǎn)單,就是在一個(gè)對(duì)話框中加入一個(gè)水平滾動(dòng)條控件和一個(gè)控件,無(wú)論滾動(dòng)條控件是在滾動(dòng)還是靜止,編輯框中都顯示滾動(dòng)塊的當(dāng)前位置。以下是具體開(kāi)發(fā)步驟:
1. 創(chuàng)建一個(gè)基于對(duì)話框的MFC工程,名稱設(shè)置為“Example26”。
2. 在自動(dòng)生成的對(duì)話框模板IDD_EXAMPLE26_DIALOG中,刪除“TODO: Place dialog controls here.”靜態(tài)文本控件、“OK”按鈕和“Cancel”按鈕。添加一個(gè)Horizontal Scroll Bar控件,ID設(shè)置為IDC_HORI_SCROLLBAR。再添加一個(gè)靜態(tài)文本控件和一個(gè)編輯框,靜態(tài)文本控件的Caption屬性設(shè)為“滾動(dòng)塊當(dāng)前位置:”,編輯框的ID設(shè)為IDC_HSCROLL_EDIT,Read Only屬性設(shè)為T(mén)rue。此時(shí)的對(duì)話框模板如下圖:
4. 在對(duì)話框初始化時(shí),我們需要設(shè)置滾動(dòng)條的滾動(dòng)范圍和初始位置,并在編輯框中顯示初始位置,那么需要修改CExample26Dlg::OnInitDialog()函數(shù)為:
C++代碼
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 // 設(shè)置水平滾動(dòng)條的滾動(dòng)范圍為1到100 m_horiScrollbar.SetScrollRange(1, 100); // 設(shè)置水平滾動(dòng)條的初始位置為20 m_horiScrollbar.SetScrollPos(20); // 在編輯框中顯示20 SetDlgItemInt(IDC_HSCROLL_EDIT, 20); return TRUE; // return TRUE unless you set the focus to a control }
5. 現(xiàn)在滾動(dòng)條還不能正常滾動(dòng),并且編輯框中數(shù)字也不隨滾動(dòng)改變。根據(jù)上面所講,我們可以重載CExample26Dlg類的OnHScroll函數(shù)。具體操作為,在CExample26Dlg類的屬性頁(yè)面的工具欄上點(diǎn)“Messages”按鈕,找到WM_HSCROLL消息,添加響應(yīng)函數(shù)就可以了。OnHScroll函數(shù)重寫(xiě)后如下:
C++代碼
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(); // 獲取水平滾動(dòng)條當(dāng)前位置 switch (nSBCode) { // 如果向左滾動(dòng)一列,則pos減1 case SB_LINELEFT: pos -= 1; break; // 如果向右滾動(dòng)一列,則pos加1 case SB_LINERIGHT: pos += 1; break; // 如果向左滾動(dòng)一頁(yè),則pos減10 case SB_PAGELEFT: pos -= 10; break; // 如果向右滾動(dòng)一頁(yè),則pos加10 case SB_PAGERIGHT: pos += 10; break; // 如果滾動(dòng)到最左端,則pos為1 case SB_LEFT: pos = 1; break; // 如果滾動(dòng)到最右端,則pos為100 case SB_RIGHT: pos = 100; break; // 如果拖動(dòng)滾動(dòng)塊滾動(dòng)到指定位置,則pos賦值為nPos的值 case SB_THUMBPOSITION: pos = nPos; break; // 下面的m_horiScrollbar.SetScrollPos(pos);執(zhí)行時(shí)會(huì)第二次進(jìn)入此函數(shù),最終確定滾動(dòng)塊位置,并且會(huì)直接到default分支,所以在此處設(shè)置編輯框中顯示數(shù)值 default: SetDlgItemInt(IDC_HSCROLL_EDIT, pos); return; } // 設(shè)置滾動(dòng)塊位置 m_horiScrollbar.SetScrollPos(pos); CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar); }
6. 編譯運(yùn)行程序,彈出結(jié)果對(duì)話框,可以自己拖動(dòng)滾動(dòng)塊看是否能正常滾動(dòng),并且編輯框中也顯示了正確的數(shù)值。效果如下:
至于垂直滾動(dòng)條,其實(shí)與水平滾動(dòng)條類似,大家可以自己寫(xiě)寫(xiě)垂直滾動(dòng)條的例子,雞啄米就不再舉例了。
滾動(dòng)條控件的內(nèi)容就講到這里了,比較基礎(chǔ),但這些是以后應(yīng)用滾動(dòng)條控件的必知內(nèi)容。雞啄米歡迎大家常來(lái)此學(xué)習(xí)交流,謝謝。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn