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

我正在尝试拆分我正在处理但遇到一些问题的 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::OnCreateClient 中的 rc.Width 给出了一个未声明的标识符错误,我应该在这里声明什么吗?

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

谢谢

【问题讨论】:

    标签: visual-c++ mfc


    【解决方案1】:

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

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

    2. CChildFrame 中添加一个访问私有的变量,输入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 的构造函数中,当您使用向导添加变量时,将以下代码添加到 ChildFrm.cpp:

        BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
        {
        }
    
    1. 将以下代码放入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;  
       }  
      
    2. 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 更改为您希望每个视图占用的屏幕百分比来编辑每个窗口的大小。

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

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

    【讨论】:

    • 由于某种原因,我无法让代码标签适用于某些代码,如果有人想整理它,请随意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多