CScrollBar

CScrollBar是滾動條類,視窗自帶的滾動條絕大部分時候是系統處理的,我們設定一下相關屬性就行了。

成員函式

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

動態創建一個滾動條。

dwStyle是風格;rect是範圍,也就是滾動條位置和大小;pParentWnd, 父視窗;nID是ID,唯一標識。

int GetScrollPos( ) const;

取得滾動條的位置。

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

設定滾動條的位置,bRedraw是否重畫。

void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;

取得滾動條的範圍,就是最小值和最大值。

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

設定滾動條的範圍。

void ShowScrollBar( BOOL bShow = TRUE );

顯示或隱藏滾動條。

BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH );

啟用或禁用滾動條的箭頭。nArrowFlags取值如下:

ESB_ENABLE_BOTH,啟用兩個箭頭。

ESB_DISABLE_LTUP,禁用左邊(或上邊)的箭頭。

ESB_DISABLE_RTDN,禁用右邊(或下邊)的箭頭。

ESB_DISABLE_BOTH,禁用兩個箭頭。

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

設定滾動條。

BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask );

取得滾動條。

int GetScrollLimit( );

取得滾動條的最大位置。

結構體

typedef struct tagSCROLLINFO { // si

UINT cbSize;

UINT fMask;

int nMin;

int nMax;

UINT nPage;

int nPos;

int nTrackPos;

} SCROLLINFO;

typedef SCROLLINFO FAR *LPSCROLLINFO;

cbSize,本結構體的大小,單位是位元組。

fMask,參數設定,取值如下:

SIF_ALL,所有參數都有效。

SIF_DISABLENOSCROLL,

SIF_PAGE,nPage參數有效。

SIF_POS,nPos參數有效。

SIF_RANGE,nMin和nMax有效。

SIF_TRACKPOS,nTrackPos有效。

nMin,最小值。

nMax,最大值。

nPage,頁大小。

nPos,位置。

nTrackPos,拖動位置。

代碼實例

在Windows 95中,滾動條控制項被軌道條取代,不提倡使用單獨的滾動條控制項,所以只弄一個簡單的例子。

一,新建一個基於對話框的工程ScrollBar。

二,在對話框上加一個水平滾動條,鉤選“Tab stop”屬性,這樣方便用鍵盤操作。利用類嚮導為其關聯一個成員變數CScrollBar型的變數m_scroll。

三,在BOOL CScrollBarDlg::OnInitDialog()的最後加如下代碼:

m_scroll.SetScrollRange(0,100);

四,增加一個編輯框,ID為IDC_EDIT1,鉤選唯讀屬性。

五,利用類嚮導在CScrollBarDlg中為增加WM_HSCROLL的回響函式,代碼如下:

void CScrollBarDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

if( NULL != pScrollBar && m_scroll.GetDlgCtrlID() == pScrollBar->GetDlgCtrlID())

{

int iPos = m_scroll.GetScrollPos();

if( SB_LINELEFT == nSBCode )

iPos-- ;

else if(SB_PAGELEFT == nSBCode )

iPos -= 10 ;

else if( SB_LINERIGHT == nSBCode )

iPos++ ;

else if(SB_PAGERIGHT == nSBCode )

iPos += 10 ;

else if( SB_LEFT == nSBCode )

iPos = 0 ;

else if( SB_RIGHT == nSBCode )

iPos = 100 ;

else if (SB_THUMBTRACK == nSBCode )

{

SCROLLINFO scrollInfo;

scrollInfo.cbSize = sizeof(scrollInfo);

pScrollBar->GetScrollInfo(≻rollInfo,SIF_TRACKPOS);

iPos = scrollInfo.nTrackPos ;

}

else

return ;

if(iPos < 0 )

iPos = 0 ;

if( iPos > 100 )

iPos = 100;

CString strMess ;

strMess.Format("分數=%d\n",iPos);

CWnd* pWnd = GetDlgItem(IDC_EDIT1);

if( NULL != pWnd )

pWnd->SetWindowText(strMess);

pScrollBar->SetScrollPos(iPos);

}

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

實例補充說明:

如果單純講示例(即便是示例),個人覺得還是M$的MSDN上給的例子好寫,codes就不貼了,詳情查看 CWnd::OnHScroll詞條。

另外MSDN對 nSBCode其中兩個枚舉值的解釋是:

SB_THUMBPOSITION Scroll to absolute position. The current position is specified by the nPos parameter.

SB_THUMBTRACK Drag scroll box to specified position. The current position is specified by the nPos parameter.

它這個解釋我看著很頭疼,尤其是 SB_THUMBPOSITION(哪裡的絕對位置?),還好MSDN它例子裡有更清晰的解釋(我粘鍋來部分代碼):

case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position

curpos = nPos; // of the scroll box at the end of the drag operation.

break;

case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the

curpos = nPos; // position that the scroll box has been dragged to.

break;

這裡就很容易明白了,SB_THUMBTRACK是指你拖動滾動條中間的小按鈕時不斷發生(draging);而拖動完成就是SB_THUMBPOSITION了(draged),當然所謂的絕對位置nPos是系統傳給咱的,你可以加條件啊實現無論你怎么拖,拖動停止後它都會固定在某個位置上。

相關詞條

相關搜尋

熱門詞條

聯絡我們