複製鏈接
請複製以下鏈接發送給好友

CScrollBar

鎖定
CScrollBar是滾動條類,窗口自帶的滾動條絕大部分時候是系統處理的,我們設置一下相關屬性就行了。
中文名
CScrollBar
設    置
滾動條的範圍
取    得
滾動條的位置
成員函數
BOOL Create

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( );
取得滾動條的最大位置。

CScrollBar結構體

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,拖動位置。

CScrollBar代碼實例

在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(&scrollInfo,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是系統傳給咱的,你可以加條件啊實現無論你怎麼拖,拖動停止後它都會固定在某個位置上。