Mfc CPropertySheet中对话框的垂直滚动条不工作
我是MFC的初学者。我在属性表中嵌入了一个对话框。 由于对话框比属性表大,因此会裁剪某些部分 所以我计划添加一个垂直滚动条。我试过两种方法Mfc CPropertySheet中对话框的垂直滚动条不工作,mfc,scrollbar,propertysheet,Mfc,Scrollbar,Propertysheet,我是MFC的初学者。我在属性表中嵌入了一个对话框。 由于对话框比属性表大,因此会裁剪某些部分 所以我计划添加一个垂直滚动条。我试过两种方法 在对话框本身的工具箱中添加了滚动条控件 创建了一个控制变量 DDX_控件(pDX、IDC_滚动条、m_滚动条); 添加了如下消息映射: ON\u WM\u VSCROLL(IDC\u滚动条,OnVScroll) 在OnInitDialog()中添加了以下代码: SCROLLINFO SCROLLINFO; ScrollInfo.cbSize=sizeof
DDX_控件(pDX、IDC_滚动条、m_滚动条);
添加了如下消息映射:
ON\u WM\u VSCROLL(IDC\u滚动条,OnVScroll)
在OnInitDialog()
中添加了以下代码:
SCROLLINFO SCROLLINFO;
ScrollInfo.cbSize=sizeof(ScrollInfo);
ScrollInfo.fMask=SIF_ALL;
ScrollInfo.nMin=0;
ScrollInfo.nMax=100;
ScrollInfo.nPage=40;
ScrollInfo.nPos=50;
ScrollInfo.nTrackPos=0;
m_ctlScrollBar.SetScrollInfo(&ScrollInfo,TRUE);
OnVScroll()
函数重写如下:
void CFeesPage::OnVScroll(UINT nSBCode、UINT npo、CScrollBar*pScrollBar)
{
滚动信息滚动信息;
m_ctlcollbar.GetScrollInfo(&ScrollInfo);
交换机(nSBCode)
{
case SB_BOTTOM://滚动到右下角。
打破
case SB_ENDSCROLL://结束滚动。
打破
case SB_LINEDOWN://向下滚动一行。
m_ctlcollbar.SetScrollPos(m_ctlcollbar.GetScrollPos()+1,TRUE);
打破
case SB_LINEUP://滚动一行。
m_ctlcollbar.SetScrollPos(m_ctlcollbar.GetScrollPos()-1,TRUE);
打破
case SB_PAGEDOWN://向下滚动一页。
m_ctlcollbar.SetScrollPos(m_ctlcollbar.GetScrollPos()+ScrollInfo.nPage,TRUE);
打破
case SB_PAGEUP://向上滚动一页。
m_ctlcollbar.SetScrollPos(m_ctlcollbar.GetScrollPos()-ScrollInfo.nPage,TRUE);
打破
案例SB_位置:
打破
案例SB_THUMBTRACK:
m_ctlScrollBar.SetScrollPos(nPos,TRUE);
打破
case SB_TOP://滚动到左上角。
打破
}
}
在本例中,滚动条移动,但子控件不移动
OnInitDialog
中为属性页启用了滚动条控件,如下所示:
CScrollBar*test=this->GetScrollBarCtrl(SB\u VERT);
如上所述设置滚动信息OnVScroll
如下所示:
void CSubTranSheet::OnVScroll(UINT nSBCode、UINT nPos、CScrollBar*pScrollBar)
{
滚动信息滚动信息;
GetScrollInfo(SB_VERT和ScrollInfo);
交换机(nSBCode)
{
case SB_BOTTOM://滚动到右下角。
打破
case SB_ENDSCROLL://结束滚动。
打破
case SB_LINEDOWN://向下滚动一行。
SetScrollPos(SB_VERT,GetScrollPos(SB_VERT)+1,TRUE);
打破
case SB_LINEUP://滚动一行。
SetScrollPos(SB_VERT,GetScrollPos(SB_VERT)-1,TRUE);
打破
case SB_PAGEDOWN://向下滚动一页。
SetScrollPos(SB_VERT,GetScrollPos(SB_VERT)+ScrollInfo.nPage,TRUE);
打破
case SB_PAGEUP://向上滚动一页。
SetScrollPos(SB_VERT,GetScrollPos(SB_VERT)-ScrollInfo.nPage,TRUE);
打破
案例SB_位置:
打破
案例SB_THUMBTRACK:
设置crollpos(SB_VERT,nPos,TRUE);
打破
case SB_TOP://滚动到左上角。
打破
}
}
在这种情况下,滚动条也会移动,但子对话框不会移动
请帮我做这个。我不确定哪种方法是正确的。提前感谢。PropertySheet将选择最大的页面对话框,并调整自身大小,以便显示所有页面对话框。除非对PropertySheet的大小有覆盖,或者在
CMyPropertyPage::OnInitDialog中添加了其他控件,否则不需要滚动
此外,最终用户的屏幕可能具有较低的分辨率,在这种情况下,属性表的部分将被遮挡。你只需要制作更小的对话框页面,不超过1000像素,或者大约300个对话框点
出现问题的代码是试图更新滚动条。除了更新滚动条,还必须滚动对话框本身
from@AndrewTruckle显示了如何使用滚动窗口
来实现这一点
或者,您可以手动移动所有子控件,如下所示。这稍微容易一些,因为您可以调整对话框的大小和滚动范围,而不用担心子控件的对齐
#包括
CMyPropertyPage类:公共CPropertyPage
{
std::映射rc_儿童;
正确的rc_最大值;
无效OnSize(UINT标志、int cx、int cy);
VSCROLL无效(UINT nSBCode、UINT NPO、CScrollBar*pScrollBar);
声明消息映射()
};
void CMyPropertyPage::OnSize(UINT标志、int cx、int cy)
{
CPropertyPage::OnSize(标志、cx、cy);
正确的rc;
如果(!rc_最大底部)
{
//初始化一次:
对于(CWnd*p=GetWindow(GW_CHILD);p;p=p->GetWindow(GW_HWNDNEXT))
{
//保存所有子控件的矩形
p->GetWindowRect(&rc);
ScreenToClient(&rc);
rc_children[p]=rc;
//在对话框中找到最低点
如果(钢筋混凝土底部>钢筋混凝土最大底部)
rc_max.bottom=rc.bottom;
}
}
GetClientRect&rc;
SCROLLINFO={sizeof(info)};
info.fMask=SIF_ALL;
info.nMin=0;
info.nMax=(rc_max.bottom+100);//最低控件下方100像素
info.nPage=rc.bottom;
设置crollinfo(SB_VERT和info,TRUE);
}
无效CMyP