CScrollBar


CObject
 └CCmdTarget
    └CWnd
       └CScrollBar

CScrollBar类支持一个Windows滚动条控件的功能。
创建一个滚动条控件分为两步。首先,调用构造函数CScrollBar来构造一个CScrollBar对象,然后调用Create成员函数来创建Windows滚动条控件并将它与CScrollBar对象相联系。
如果你是在一个对话框(通过一个对话框资源)中创建一个CScrollBar对象的,则当用户关闭这个对话框时,CScrollBar自动销毁。
如果你是在一个窗口中创建一个CScrollBar对象,则你必须负责销毁该对象。
如果你是堆栈中创建CScrollBar对象,则该对象将会自动销毁。如果你是通过使用New函数在数据堆中创建CScrollBar对象,则当用户终止使用该Windows滚动条时,你必须调用delete来销毁该对象。
如果你在此CScrollBar对象中分配了任何内存,则应重载CScrollBar析构函数来释放这些内存。
#include <afxwin.h>

请参阅:
CWnd, CButton, CComboBox, CEdit, CListBox, CStatic, CDialog

CScrollBar类成员

Construction
CScrollBar 构造一个CScrollBar对象

Initialization
Create 创建Windows滚动条,并将它连接到CScrollBar对象上

Operations
GetScrollPos 获取一个滚动框的当前位置
SetScrollPos 设置一个滚动框的当前位置
GetScrollRange 获取给定滚动条的当前最大和最小滚动条位置
SetScrollRange 设置给定滚动条的最小和最大位置
ShowScrollBar 显示或隐藏一个滚动条
EnableScrollBar 使一个滚动条的一个或两个箭头有效或无效
SetScrollInfo 设置有关滚动条的信息
GetScrollInfo 获取有关滚动条的信息
GetScrollLimit 获取滚动条的极限


MFC类库中文手册
http://www.kaifa6.com/v/mfcshouce/

====
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);
}

====

void CShowLog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default


int min,max,pos,nPageSize;
if (&m_sb1!=pScrollBar) return;
pos=m_sb1.GetScrollPos();
m_sb1.GetScrollRange(&min,&max);
nPageSize = max / 30;
switch (nSBCode){
case SB_TOP:
pos=min;
break;
case SB_BOTTOM:
pos=max;
break;
case SB_LINEUP:
pos-=1;
break;
case SB_LINEDOWN:
pos+=1;
break;
case SB_PAGEUP:
pos-=nPageSize;
break;
case SB_PAGEDOWN:
pos+=nPageSize;
break;
case SB_THUMBPOSITION:
pos=nPos;
break;
case SB_THUMBTRACK:
pos=nPos;
break;
default:;

}
if (pos<min) pos=min;
if (pos>max) pos=max;
if (pos!= m_sb1.GetScrollPos()) m_sb1.SetScrollPos(pos);
iNowLog=pos;
Invalidate(false);
//OnPaint();

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}