词条 | CScrollBar |
释义 | 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(&scrollInfo,SIF_TRACKPOS); iPos = scrollInfo.nTrackPos ; } else return ; if(iPos < 0 ) iPos = 0 ; if( iPos > 100 ) iPos = 100; CString strMess ; strMess.Format("分数=%d\",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是系统传给咱的,你可以加条件啊实现无论你怎么拖,拖动停止后它都会固定在某个位置上。 |
随便看 |
百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。