在 MFC MDI 程序中拆分子窗口

Posted

技术标签:

【中文标题】在 MFC MDI 程序中拆分子窗口【英文标题】:Splitting Child Window in MFC MDI Program 【发布时间】:2011-03-29 11:07:45 【问题描述】:

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

Create multi views in a CChildFrame using CSplitterWnd

但似乎无法使其正常工作,谁能就这些说明向我提供一些建议,我有一些具体问题:

    CRightView 也是 CView 的派生类吗?如果有的话应该放什么代码?

    m_pLeftView、m_pRightView、m_pPhongView 和 m_pPhongInfo 都是相应类的变量吗?它们有什么特定类型吗?

    CTreeView哪里来的,好像不是标准的基类?

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

我会很感激任何关于这个的建议,真的很难让分离器工作。

谢谢

【问题讨论】:

【参考方案1】:

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

    声明两个视图类,在我的例子中,CElementView 是 CWnd 派生类,CSampleViewer3dViewCView 派生类。

    CChildFrame 中添加一个访问私有的变量,输入CSplitterWnd 并命名为m_wndSplitter

    CChildFrame 中的OnCreateClient 函数添加一个覆盖,这应该添加代码:

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

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

    BOOL m_bInitSplitter;

您还必须添加:

m_bInitSplitter = false;

在 ChildFrm.cpp 的构造函数中,当您使用向导添加变量时,将以下代码添加到 ChildFrm.cpp:

    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
    
    

    将以下代码放入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;  
       
    

    WM_SIZE 消息的覆盖添加到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 更改为您希望每个视图占用的屏幕百分比来编辑每个窗口的大小。

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

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

【讨论】:

由于某种原因,我无法让代码标签适用于某些代码,如果有人想整理它,请随意。

以上是关于在 MFC MDI 程序中拆分子窗口的主要内容,如果未能解决你的问题,请参考以下文章

MFC项目组合:如何将没有文档类的SDI应用程序添加到MDI应用程序中?应该使用子窗口吗?[MFC]

MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断

MFC/VC 在多文档MDI程序中 子窗口初始最大化显示 如何去掉菜单栏右侧的最小化及向下还原按钮

如何使 MDI 子窗口保持在其兄弟窗口之上?

如何从 MDI Visual C++ 2008 应用程序更改子窗口的背景

在 MFC MDI 应用程序中级联特定窗口