1.使用scrollBar控件条的使用
首先,假设添加的是水平滚动条,给滚动条控件关联一个控件变量m_hscroll;
在初始化对话框函数中设置滚动条的范围m_hscroll.SetScrollRange(0,100);
最大值最小值设置,和设置一开始的滚动条滑块的位置m_hscroll.SetScrollPos(5);
然后,添加滚动条的消息响应命令WM_HSCROLL,会自动添加void CColorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)。
在该函数内部的程序如下所示
void CColorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int Pos=m_hscroll.GetScrollPos();
movealways=Pos*unitMove;//已经移动的距离
CDC *pDC=GetDlgItem(IDC_PICTURE)->GetDC();//该句是其他功能语句,与滚动条无关
switch(nSBCode)
{
case SB_LINEUP:
Pos-=1;
if (Pos<0)
{
Pos=0;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways-unitMove,0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_LINEDOWN:
Pos+=1;
if (Pos>100)
{
Pos=100;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways+unitMove,0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_PAGEUP:
Pos-=10;
if (Pos<0)
{
Pos=0;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways-(unitMove*10),0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_PAGEDOWN:
Pos+=10;
if (Pos>100)
{
Pos=100;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways+(unitMove*10),0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_TOP:
Pos=0;
m_hscroll.SetScrollPos(Pos);
break;
case SB_BOTTOM:
Pos=100;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,xlast-rect.Width(),0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_THUMBPOSITION:
Pos=nPos;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,unitMove*nPos,0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
Pos=nPos;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,unitMove*Pos,0,SRCCOPY);
m_hscroll.SetScrollPos(Pos);
break;
}
//CDialog::OnHScroll(nSBCode, nPos, pScrollBar);使用自己添加的scrollBar时,注释该句,否则无法设定Pos的值,它总是使Pos=0
}
2.对话框标准滚动条的使用
首先,在OnInitDialog函数进行初始设置
BOOL CColorDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
SCROLLINFO vinfo;
vinfo.cbSize=sizeof(vinfo);
vinfo.fMask=SIF_ALL;
vinfo.nPage=10;
vinfo.nMax=100;
vinfo.nMin=0;
SetScrollInfo(SB_HORZ,&vinfo);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
同理,添加消息响应命令WM_HSCROLL,会自动添加void CColorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)。
void CColorDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO scrollinfo;
GetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
movealways=scrollinfo.nPos*unitMove;//已经移动的距离
CDC *pDC=GetDlgItem(IDC_PICTURE)->GetDC();
switch(nSBCode)
{
case SB_LINEUP:
scrollinfo.nPos-=1;
if (scrollinfo.nPos<scrollinfo.nMin)
{
scrollinfo.nPos=scrollinfo.nMin;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways-unitMove,0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_LINEDOWN:
scrollinfo.nPos+=1;
if (scrollinfo.nPos>scrollinfo.nMax)
{
scrollinfo.nPos=scrollinfo.nMax;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways+unitMove,0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_PAGEUP:
scrollinfo.nPos-=10;
if (scrollinfo.nPos<scrollinfo.nMin)
{
scrollinfo.nPos=scrollinfo.nMin;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways-(unitMove*10),0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_PAGEDOWN:
scrollinfo.nPos+=10;
if (scrollinfo.nPos>scrollinfo.nMax)
{
scrollinfo.nPos=scrollinfo.nMax;
}
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,movealways+(unitMove*10),0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_TOP:
scrollinfo.nPos=scrollinfo.nMin;
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_BOTTOM:
scrollinfo.nPos=scrollinfo.nMax;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,xlast-rect.Width(),0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_THUMBPOSITION:
scrollinfo.nPos=nPos;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,unitMove*nPos,0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
scrollinfo.nPos = nPos;
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,unitMove*Pos,0,SRCCOPY);
SetScrollInfo(SB_HORZ,&scrollinfo,SIF_ALL);
break;
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}