发现接触了那么久的MFC基于对话框的程序,发现从来没有为对话框添加过滚动条,当要使用时好害怕!很难的样子,网上的各种api解释又是一大堆,有的是sdk上的,有的是mfc上的把滚动条控件当成变量后的调用方法,最后一种是滚动条留给了CWnd接口后的函数,但是却没有例子程序。下面使用的是第三种的CWnd上的对滚动条的访问函数:
首先在属性上把Vertical Scroll 选为true。然后添加2个消息WM_SIZE , WM_VSCROLL .
http://blog.csdn.net/shimachao/article/details/8690955 这里有比较详细的api解释。
void SubDlgNewest::OnSize(UINT nType, int cx, int cy) // 之所以在这里初始化设置滚动条是因为窗口大小的改动往往也要把滚动条,滑块也应该跟着改变才能看起来协调。
{CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
SCROLLINFO vinfo;
vinfo.cbSize = sizeof(vinfo);
vinfo.fMask = SIF_ALL;
vinfo.nPage = 1;
vinfo.nMax= 100;
vinfo.nMin = 0;
vinfo.nTrackPos = 0;
vinfo.nPos = 0;
SetScrollInfo(SB_VERT,&vinfo);
}
void SubDlgNewest::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO ScrollInfo;
ScrollInfo.cbSize=sizeof(ScrollInfo);
ScrollInfo.fMask = SIF_ALL;
GetScrollInfo(SB_VERT,&ScrollInfo);
int delta=0;
switch(nSBCode)
{
case SB_PAGEUP:
case SB_LINEUP:
if(ScrollInfo.nPos > ScrollInfo.nMin)
delta -= 5; // 单位长度
break;
case SB_PAGEDOWN:
case SB_LINEDOWN:
if(ScrollInfo.nPos < ScrollInfo.nMax)
delta += 5;
break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION:
delta = ScrollInfo.nTrackPos-ScrollInfo.nPos;
break;
}
if(delta !=0 )
{// you can adjust m_Offset in OnInitDialog() for "abc" start point
ScrollWindow(0,-delta); // 以下2条语句更新对应的界面
UpdateWindow();
ScrollInfo.nPos += delta; // 以下3条语句用于更新滑块的新位置
ScrollInfo.fMask=SIF_POS | SIF_RANGE;
SetScrollInfo(SB_VERT,&ScrollInfo);
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}