手动创建滚动条的一些API函数:
1.构造函数
CScrollBar()
例如:
CScrollBar *pScrollBar;
pScrollBar = new CScrollBar;
2.生成函数
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
dwStyle参数可以是以上风格中某几个的组合,另外一般也会用到WS_CHILD、WS_VISIBLE风格。例如,创建一个水平滚动条控件,dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_HORZ,创建垂直滚动条控件时dwStyle参数应该为WS_CHILD|WS_VISIBLE|SBS_VERT。
例如:
CRect rect(10,10,50,20);
pScrollBar->Create(SBS_VERT,rect,this,1000);
3.得到滚动条方块的当前的位置
int GetScrollPos( ) const;
例如:
int nPos = pScrollBar->GetScrollPos();
4.设置滚动条方块的当前位置
int SetScrollPos( int nPos, BOOL bRedraw = TRUE );
例如:
pScrollBar->SetScrollPos(5);
5.得到当前的滚动范围
void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;
例如:
int nMin,nMax;
pScrollBar->GetScrollRange(&nMin,&nMax);
6.设置当前的滚动范围
void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );
例如:
pScrollBar->SetScrollRange(0,10,TRUE);
7.显示滚动条
void ShowScrollBar( BOOL bShow = TRUE );
例如:pScrollBar->ShowScrollBar(FALSE);
8.禁用滚动条
BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH );
例如:
pScrollBar->EnableScrollBar(ESB_DISABLE_RTDN);
9.设置当前滚动条信息
BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );
例如:
SCROLLINFO sbinfo;
sbinfo.fMask = SIF_ALL;
sbinfo.nMax = 20;
sbinfo.nMin = 0;
sbinfo.nPage = 8;
sbinfo.nPos = 17;
pScrollBar->SetScrollInfo(&sbinfo,TRUE);
10.获取当前滚动条信息
BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask );
例如:
SCROLLINFO sbinfo;
pScrollBar->GetScrollInfo(&sbinfo);
<span style="font-size:10px;">typedef struct tagSCROLLINFO {
UINT cbSize; // 结构的尺寸(字节为单位)
UINT fMask; // 说明结构中的哪些参数是有效的,可以是屏蔽值的组合,如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效
int nMin; // 滚动范围最小值,当fMask 中包含SIF_RANGE 时有效
int nMax; // 滚动范围最大值,当fMask 中包含SIF_RANGE 时有效
UINT nPage; // 页尺寸,用来确定比例滚动框的大小,当fMask中包含SIF_PAGE时有效
int nPos; // 滚动框的位置,当fMask 中包含SIF_POS 有效
int nTrackPos; // 滚动时滚动框的位置,当fMask 中包含SIF_TRACKPOS 时有效,该参数只能查询,不能设置,最好不要用该参数来查询拖动时滚动框的位置 </span><span style="font-size:18px;">
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;</span>
<pre name="code" class="cpp"><span style="font-size:12px;color:#33cc00;background-color: rgb(255, 255, 255);">一般设置如下:</span>
<span style="font-size:12px;color:#33cc00;background-color: rgb(255, 255, 255);">SCROLLINFO info;//配置滑块的一些信息! 注意是滑块的! 不是滚动条 是你拖动的那个小快快
info.cbSize = sizeof(SCROLLINFO); //固定! 本结构的大小
info.fMask = SIF_ALL; //一些属性
info.nMin = 0; //滑块所能到达的最小范围
info.nMax = bm.bmHeight;//滑块所能到达的最大范围 假如是一个图像 则为图像的高度
info.nPage = 10;//滑块的大小
info.nPos = m_VScrollPos;//滑块的位置 </span>
11.获取当前滚动条允许的最大位置
int GetScrollLimit( );
例如:
int nMax = pScrollBar->GetScrollLimit();
OnHScroll()与OnVScroll()函数
无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL 和WM_VSCROLL消息发送出去的。对这两个消息的默认处理函数是CWnd::OnHScroll和CWnd::OnVScroll,一般需要在派生类中对这两个函数进行重载,以实现滚动功能。也就是说,假设在一个对话框中放入了一个水平滚动条,我们可以在对话框类中重载OnHScroll函数,并在OnHScroll函数中实现滚动功能。
这两个函数的声明如下:
afx_msg void OnHScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
参数nSBCode是通知消息码,主要通知码及含义的介绍下面已列出。nPos 是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义。如果通知消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar 为NULL。
SB_BOTTOM/SB_RIGHT:滚动到底端(右端)
SB_TOP/SB_LEFT:滚动到顶端(左端)
SB_LINEDOWN/SB_LINERIGHT:向下(向右)滚动一行(列)
SB_LINEUP/SB_LINELEFT:向上(向左)滚动一行(列)
SB_PAGEDOWN/SB_PAGERIGHT:向下(向右)滚动一页
SB_PAGEUP/SB_PAGELEFT:向上(向左)滚动一页
SB_THUMBPOSITION:滚动到指定位置
SB_THUMBTRACK:滚动框被拖动。可利用该消息来跟踪对滚动框的拖动
SB_ENDSCROLL:滚动结束
创建过程:
CScrollBar* m_pScrollBar;
m_pScrollBar = new CScrollBar;
CRect rect;
GetDlgItem(IDC_STATIC_ONE)->GetWindowRect(&rect);
ScreenToClient(&rect);//获得相对于主窗体的坐标
//rect.OffsetRect(CSize(25,25));//这里要是要移动的相对位置
//GetDlgItem(IDC_IMG_NOTEPAD)->MoveWindow(rect);//移动到目标位置
rect.left = rect.right-20;
m_pScrollBar->Create(SBS_VERT,rect,this,IDC_SCROLLBAR);
m_pScrollBar->SetScrollRange(1, 100);
m_pScrollBar->SetScrollPos(20);