1) 在对话框上加入scrollbar资源。并加入一个edit control资源,来检测bar的位置。
2) 为scrollbar资源添加控制变量m_scrollbar,为edit control资源添加控制变量m_edit。
3) 添加消息响应“OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)”。
4) 在Dlg对话框的CbarDlg::OnInitDialog()中添加代码如下:
m_scrollbar.SetScrollRange(0,20);
m_scrollbar.SetScrollPos(10);
char sPos[10];
_itoa_s(m_scrollbar.GetScrollPos(),sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos, FALSE);
5) 在OnHScroll(……)函数中,添加如下代码:
char sPos[10];
int iNowPos;
switch(nSBCode) //接收scrollbar的消息
{
if(pScrollBar==&m_scrollbar) //找到相对应的scrollbar
{
case SB_THUMBTRACK: //滚动条拖动到某一位置,参数nPos指明当前位置
m_scrollbar.SetScrollPos(nPos);
_itoa_s(nPos,sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos);
case SB_LINEDOWN: //向下滚动一行
iNowPos=m_scrollbar.GetScrollPos();
iNowPos++;
if(iNowPos>20)
iNowPos=20;
m_scrollbar.SetScrollPos(iNowPos);
_itoa_s(m_scrollbar.GetScrollPos(),sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos);
break;
case SB_LINEUP: //向上滚动一行
iNowPos=m_scrollbar.GetScrollPos();
iNowPos--;
if(iNowPos<0)
iNowPos=0;
m_scrollbar.SetScrollPos(iNowPos);
_itoa_s(m_scrollbar.GetScrollPos(),sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos);
break;
case SB_PAGEDOWN: //向下滚动一页
iNowPos=m_scrollbar.GetScrollPos();
iNowPos+=3;
if(iNowPos>20)
iNowPos=20;
m_scrollbar.SetScrollPos(iNowPos);
_itoa_s(m_scrollbar.GetScrollPos(),sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos);
break;
case SB_PAGEUP: //向上滚动一页
iNowPos=m_scrollbar.GetScrollPos();
iNowPos-=3;
if(iNowPos<0)
iNowPos=0;
m_scrollbar.SetScrollPos(iNowPos);
_itoa_s(m_scrollbar.GetScrollPos(),sPos,10);
m_edit.SetSel(0,-1);
m_edit.ReplaceSel(sPos);
// m_edit.Clear();
break;
}
}
在创建滚动条后需要调用void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE )设置滚动范围,
int GetScrollPos( )/int SetScrollPos( )用来得到和设置当前滚动条的位置。
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 两个箭头都为禁止状态
如果需要在滚动条位置被改变时得到通知,需要在父窗口中定义对消息WM_VSCROLL/WM_HSCROLL的映射。方法为在父窗口类中重载afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )/afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar ) 所使用的消息映射宏为:ON_WM_VSCROLL( ),ON_WM_HSCROLL( ),在映射宏中不需要指明滚动条的ID,因为所有滚动条的滚动消息都由同样的函数处理。在OnHScroll/OnVScroll的第三个参数会指明当前滚动条的指针。第一个参数表示滚动条上发生的动作,可取以下值:
SB_TOP/SB_BOTTOM 已滚动到顶/底部
SB_LINEUP/SB_LINEDOWN 向上/下滚动一行
SB_PAGEDOWN/SB_PAGEUP 向上/下滚动一页
SB_THUMBPOSITION/SB_THUMBTRACK 滚动条拖动到某一位置,参数nPos指明当前位置(参数nPos在其它的情况下是无效的)
SB_ENDSCROLL 滚动条拖动完成