当前位置:C++技术网 > 资讯 > 利用OnSize,SetScrollbar(自定义的)创建自定义滚动轮滑块

利用OnSize,SetScrollbar(自定义的)创建自定义滚动轮滑块

更新时间:2016-01-29 21:25:06浏览次数:1+次

《利用ModifyStyle函数创建MFC封装默认的滚动轮》一文中,在最后,断点调试,测出了几个值,你可能有疑问,这个值是干嘛用的。本文告诉你。
新建对话框工程,同样,添加一个对话框,并关联类,在类中添加WM_SIZE消息,WM_INITDIALOG,WM_SCROLL消息。同时自定义一个函数SetScrollBar。
在OnInitDialog函数中写代码:
BOOL CTest::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化

this->ModifyStyle(0,WS_VSCROLL,0);

return TRUE;  // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
由《利用ModifyStyle函数创建MFC封装默认的滚动轮》一文,我们知道了,这个不能创建滚动轮,因为我们需要显示滚动轮的函数,于是我们自定义一个,那么在哪定义最好呢?那就是WM_SIZE函数,因为,我们改变对话框的大小的话,滑块依旧会在,不会被擦除。对于此函数,具体的请看,我之前写的关于窗口背景,对话框背景更换的文章,请读者耐心找找哦,那些文章也很不错,相信你能学到很多。
void CTest::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
SetScrollbar(cx, cy);
// TODO: 在此处添加消息处理程序代码
}


void CTest::SetScrollbar(int cx, int cy)
{

SCROLLINFO si;
si.cbSize = sizeof (si) ;
si.fMask  = SIF_ALL ;
si.nMin   = 0;
si.nMax   = 100;	 //内容的高度
si.nPage  = 0;	//页面的高度
si.nPos = 0;
SetScrollInfo(SB_VERT, &si, TRUE);
}

这个就是我们自己创建的了:

与之前我们在《利用ModifyStyle函数创建MFC封装默认的滚动轮》最后得到的测试值是一样的。但是呢,我们可以变变,nMin,nMax,nPage三个值无非都是默认的,我们修改下,看看有什么后果。

void CTest::SetScrollbar(int cx, int cy)
{
CRect rect;
GetClientRect(&rect);

SCROLLINFO si;
si.cbSize = sizeof (si) ;
si.fMask  = SIF_ALL ;
si.nMin   = 0;
si.nMax   = 100;	 //内容的高度
si.nPage  = rect;	//页面的高度
si.nPos = 0;
SetScrollInfo(SB_VERT, &si, TRUE);
}
此时你运行看看,你会发现没有滚动轮,这是为什么?但是你移动下对话框,又会发现有滚动轮了,你改下nMax的值,改400就直接创建了,不需要你移动滑块而且此时的滑块大小,与nMax为100时不一样。你可以再改nMax值,有时候,对话框甚至都不会显示出滑块。这是为什么?因为啊,nPage的值必须远远小于nMax的值。这个要切记,这也是之前的nThumbWigth为什么会为0。因为这样运行出来的滑块最标准了。
(⊙o⊙)…有说错的地方请不要见笑。