在MFC MDI程序中拆分子窗口

时间:2011-03-29 11:07:45

标签: visual-c++ mfc

我正在尝试拆分我正在处理的MFC MDI程序的子窗口,但是遇到了一些问题。我知道我必须使用CSplitterWnd类,并且一直在尝试按照帖子上的说明进行操作:

Create multi views in a CChildFrame using CSplitterWnd

但似乎无法让它发挥作用,任何人都可以就这些说明向我提供一些建议,我有一些具体的问题:

  1. CRightView也是一个CView派生类,如果有的话应该包含哪些代码?

  2. m_pLeftView,m_pRightView,m_pPhongView和m_pPhongInfo是否是相应类的所有变量,它们是否具有任何特定类型?

  3. CTreeView来自哪里,似乎不是标准的基类?

  4. CChildFrame中的rc.Width :: OnCreateClient给出了一个未声明的标识符错误,我应该在这里声明某个地方吗?

  5. 我很感激任何关于此的建议,真的很难让分离器工作。

    由于

1 个答案:

答案 0 :(得分:0)

经过几天的努力,我已经设法解决了我自己的问题,我正在为其他可能遇到同样问题的人添加解决方案。

  1. 声明两个视图类,在我的例子中是CElement View,它是一个CWnd派生类,CSampleViewer3dView是一个CView派生类。

  2. 在每个类中添加一个访问私有的变量,键入CSplitterWnd并命名为m_wndSplitter。

  3. 在CChildFrame中添加OnCreateClient函数的覆盖,这应该添加代码:

    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    

    到ChildFrm.h,你还应该在ChildFrm.h中添加一个布尔标志m_bInitSplitter:

    BOOL m_bInitSplitter;
    

    你还必须添加:

    m_bInitSplitter = false; 在使用向导添加变量时,对ChildFrm.cpp的构造函数添加以下代码:

    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
    {
    }
    
  4. 将以下代码放入CChildFrame :: OnCreateClient:

    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)  
    {  
        CRect cr;  
        GetWindowRect( &cr );  
    
        if (!m_wndSplitter.CreateStatic(this, 1, 2))   
        {   
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);   
            return FALSE;   
        }  
    
        if (!m_wndSplitter.CreateView( 0, 0, RUNTIME_CLASS(CElementView), 
    CSize(cr.Width()/2, cr.Height()), pContext ) )   
        {   
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);  
            return FALSE;   
        }  
    
        if (!m_wndSplitter.CreateView( 0, 1, RUNTIME_CLASS(CSampleViewer3dView), 
    CSize(cr.Width()/2, cr.Height()), pContext))   
        {    
            MessageBox("Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR);  
        return FALSE;   
        }  
        m_bInitSplitter = TRUE;  
    
        return TRUE;  
    }  
    
  5. 为CChildFrame添加尺寸覆盖广告插入以下代码:

    void CChildFrame::OnSize(UINT nType, int cx, int cy)  
    {  
        CMDIChildWnd::OnSize(nType, cx, cy);  
        CRect cr;  
        GetWindowRect(&cr);  
    
        if (m_bInitSplitter && nType != SIZE_MINIMIZED)  
        {  
            m_wndSplitter.SetRowInfo( 0, cy, 0 );  
            m_wndSplitter.SetColumnInfo(0, cr.Width()*0.25 / 2, 50);  
            m_wndSplitter.SetColumnInfo(1, cr.Width()*0.75 / 2, 50);  
    
            m_wndSplitter.RecalcLayout();  
        }  
    } 
    

    您可以通过将0.25和0.75的值更改为您希望每个视图占用的屏幕所需的百分比来编辑每个窗口的大小。

  6. 将两个视图的头文件添加到ChildFrm.cpp,例如ElementView.h和SampleViewer3dView.h。

  7. 然后,您应该在MDI程序的子窗口中有两个独立的视图。