在对话框上要应用滚动条,首先当然是要将对话框的属性vertical scroll选中(在这里只介绍纵向滚动条,横向滚动条与之原理相同)。然后是按Ctlr+w进入classwizard选中对话消息WM_VSCROLL,并添加它的响应函数,接着进入代码编辑区,写入代码:void CRq::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{// TODO: Add your message handler code here and/or call defaultSCROLLINFO scrollinfo;GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
switch (nSBCode)
{
case SB_BOTTOM:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax));
scrollinfo.nPos = scrollinfo.nMax;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_TOP:
ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin));
scrollinfo.nPos = scrollinfo.nMin;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_LINEUP:
scrollinfo.nPos -= 5;
if (scrollinfo.nPos<scrollinfo.nMin){
scrollinfo.nPos = scrollinfo.nMin;
break;}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,5);
break;
case SB_LINEDOWN:scrollinfo.nPos += 5;
if (scrollinfo.nPos>scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-5);
break;
case SB_PAGEUP:
scrollinfo.nPos -= 5;
if (scrollinfo.nPos<scrollinfo.nMin){
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,5);
break;
case SB_PAGEDOWN:
scrollinfo.nPos += 5; if (scrollinfo.nPos>scrollinfo.nMax)
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
ScrollWindow(0,-5);
break;
case SB_ENDSCROLL:
// MessageBox("SB_ENDSCROLL");
break;
case SB_THUMBPOSITION:
// ScrollWindow(0,(scrollinfo.nPos-nPos));
// scrollinfo.nPos = nPos;
// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
case SB_THUMBTRACK:
ScrollWindow(0,(scrollinfo.nPos-nPos));
scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);
break;
}CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}以上代码完成后,滚动条已可以使用了。但是应该如何将其它控件安排在对话框呢?很简单,你想用多大的对话框就将它拉多大,只需要在对话框所用的xxxx.cpp文件的void Cxxxx::DoDataExchange(CDataExchange* pDX)函数体中写入代码:SetWindowPos(NULL,0,0,720,600,SWP_NOMOVE | SWP_NOZORDER);其中720和600两个数字分别为对话框创建时的宽度和高度。这样就可以方便地使用滚动条了。
网上找了很多人都用这个代码,但是基本都是到这里就结束了,但是这是还存在一点问题,就是滚动条的范围超大,滚动块拉到下面就是空白区,这里提供个解决方法:
在自己的对话框类中添加消息响应函数OnSize()
void C******Dlg::OnSize(UINT nType, int cx, int cy) {SCROLLINFO scrollinfo;
SetScrollRange (SB_VERT, 0, 600, TRUE);//这个就是设置你的滚动条的范围
GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);scrollinfo.nPage=400;//页的大小,SetScrollInfo(SB_VERT,&scrollinfo,SIF_PAGE);
CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code here}滚动块的大小就是400/600即你滚动条总长度的三分之二,自己调调看这两个数,体会一下滚动块的变化就知道了。