最近新开发的项目中,页面控件太多,子对话框的长度明显大于主对话框,嵌入到主对话框后,会覆盖主对话框页面,需要实现子对话框页面的滚动,网上查了很多方法,大多需要拖动滑块,实现滚动,没有响应鼠标滚动的,在此记录一下,参考博客[MFC] 对话框自带滚动条的使用_丶布布的博客-优快云博客_mfc 滚动条
1.添加消息响应函数OnVScroll,和OnMouseWheel

2.在对话框初始函数中增加
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
//设置滚动条
SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
scrollinfo.nMin = 0;
scrollinfo.nPage = 50; //设置滑块大小
scrollinfo.nMax = 112; //设置滚动条的最大位置
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
scrollinfo.nPage、scrollinfo.nMax可以根据自己的具体对话框大小进行调整
3.重写OnVScroll函数
void MyDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SCROLLINFO scrollinfo;
GetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
int unit = 3;
switch (nSBCode)
{
case SB_LINEUP: //Scroll one line up
scrollinfo.nPos -= 1;
if (scrollinfo.nPos < scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, unit);
break;
case SB_LINEDOWN: //Scroll one line down
scrollinfo.nPos += 1;
if (scrollinfo.nPos + scrollinfo.nPage > scrollinfo.nMax) //此处一定要注意加上滑块的长度,再作判断
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, -unit);
break;
case SB_PAGEUP: //Scroll one page up.
scrollinfo.nPos -= 5;
if (scrollinfo.nPos <= scrollinfo.nMin)
{
scrollinfo.nPos = scrollinfo.nMin;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, unit * 5);
break;
case SB_PAGEDOWN: //Scroll one page down
scrollinfo.nPos += 5;
if (scrollinfo.nPos + scrollinfo.nPage >= scrollinfo.nMax) //此处一定要注意加上滑块的长度,再作判断
{
scrollinfo.nPos = scrollinfo.nMax;
break;
}
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
ScrollWindow(0, -unit * 5);
break;
case SB_ENDSCROLL: //End scroll
break;
case SB_THUMBPOSITION: //Scroll to the absolute position. The current position is provided in nPos
break;
case SB_THUMBTRACK: //Drag scroll box to specified position. The current position is provided in nPos
ScrollWindow(0, (scrollinfo.nPos - nPos)*unit);
scrollinfo.nPos = nPos;
SetScrollInfo(SB_VERT, &scrollinfo, SIF_ALL);
break;
}
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
4.重写OnMouseWheel函数,增加对OnVScroll的调用
BOOL MyDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDialog::OnMouseWheel(nFlags, zDelta, pt);
if (zDelta < 0)
{
OnVScroll(SB_LINEDOWN, GetScrollPos(SB_VERT), GetScrollBarCtrl(SB_VERT));
}
else if (zDelta > 0)
{
OnVScroll(SB_LINEUP, GetScrollPos(SB_VERT), GetScrollBarCtrl(SB_VERT));
}
return TRUE;
}
注意:1.添加OnMouseWheell的消息映射后,无需在对话框增加竖直滚动条,vertical scrollbar的属性依然是false,运行时,会自动出现竖直滚动条

2.对于对话框的设置,子对话框正常布局,只是在显示的时候,设定需要显示的子对话框大小
void MyDlg::SetPosition(UINT left, UINT top)
{
CRect tempRect;
m_rWinRect.left = left;
m_rWinRect.top = top;
GetWindowRect(&tempRect);
m_rWinRect.right = left + tempRect.Width();
m_rWinRect.bottom = top + 430/*tempRect.Height()*/;//嵌入主对话框
}
这里430就是重新设置的对话框长度,以这个长度嵌入,不会覆盖主对话框上的一些控件
本文介绍如何在MFC子对话框中添加滚动条以响应鼠标滚动,包括添加OnVScroll和OnMouseWheel消息响应,设置SCROLLINFO,以及重写相应函数来实现页面滚动效果。
768

被折叠的 条评论
为什么被折叠?



