Mfc CPropertySheet中对话框的垂直滚动条不工作

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

我是MFC的初学者。我在属性表中嵌入了一个对话框。 由于对话框比属性表大,因此会裁剪某些部分

所以我计划添加一个垂直滚动条。我试过两种方法

  • 在对话框本身的工具箱中添加了滚动条控件
  • 创建了一个控制变量

    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