标题：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\n",iPos);
CWnd* pWnd = GetDlgItem(IDC_EDIT1);
if( NULL != pWnd )
pWnd->SetWindowText(strMess);
pScrollBar->SetScrollPos(iPos);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
[1]
实例补充说明：
如果单纯讲示例（即便是示例），个人觉得还是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是系统传给咱的，你可以加条件啊实现无论你怎么拖，拖动停止后它都会固定在某个位置上。