我的程序是MDI程序,包含了两种不同的视图,分别叫做A,B
我只需要对A类视图进行拆分(左右两部分)
该如何实现呀?

解决方案 »

  1.   

    BOOL CChildFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
    {
    if(!m_wndSplitter.CreateStatic(this,1,2,WS_CHILD|WS_VISIBLE))
    {
    TRACE("Failed to CreateStaticSplitter\n");
    return FALSE;
    } if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(Adverse),CSize(275,200),pContext))
    {
    TRACE("Failed to Create command view pane\n");
    return FALSE;
    } if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyView),CSize(400,400),pContext))
    {
    TRACE("Failed to Create preview view pane\n");
    return FALSE;
    } return TRUE;
    }http://search.csdn.net/Expert/topic/979/979600.xml?temp=.4390222
      

  2.   

    mfc深入浅出一书通过改写OnWindowNew实现同源子窗口:
    先派生个view: CHexView 然后做两个文档模版,对应原来的view 和CHexView:
    CMultiDocTemplate* pDocTemplate;
            pDocTemplate = new CMultiDocTemplate(
                    IDR_TEXTTYPE,
                    RUNTIME_CLASS(CTextDoc),
                    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
                    RUNTIME_CLASS(CTextView));
            AddDocTemplate(pDocTemplate);        m_pTemplateTxt = new CMultiDocTemplate(
                    IDR_TEXTTYPE,
                    RUNTIME_CLASS(CTextDoc),
                    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
                    RUNTIME_CLASS(CTextView));        m_pTemplateHex = new CMultiDocTemplate(
                    IDR_TEXTTYPE,
                    RUNTIME_CLASS(CTextDoc),
                    RUNTIME_CLASS(CChildFrame), // custom MDI child frame
                    RUNTIME_CLASS(CHexView));
    然后在需要创建新子窗口时,模仿OnWindowNew的内容:
    void CMainFrame::OnWindowText()
    {
            CMDIChildWnd* pActiveChild = MDIGetActive();
            CDocument* pDocument;
            if (pActiveChild == NULL ||
               (pDocument = pActiveChild->GetActiveDocument()) == NULL)
            {
                TRACE0("Warning: No active document for WindowNew command\n");
                AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
                return;     // command failed
            }        // otherwise we have a new frame!
            CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateTxt;
            ASSERT_VALID(pTemplate);
            CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
            if (pFrame == NULL)
            {
                TRACE0("Warning: failed to create new frame\n");
                AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
                return;     // command failed
            }        pTemplate->InitialUpdateFrame(pFrame, pDocument);
    }
    void CMainFrame::OnWindowHex()
    {
            CMDIChildWnd* pActiveChild = MDIGetActive();
            CDocument* pDocument;
            if (pActiveChild == NULL ||
               (pDocument = pActiveChild->GetActiveDocument()) == NULL)
            {
                TRACE0("Warning: No active document for WindowNew command\n");
                AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
                return;     // command failed
            }        // otherwise we have a new frame!
            CDocTemplate* pTemplate = ((CTextApp*) AfxGetApp())->m_pTemplateHex;
            ASSERT_VALID(pTemplate);
            CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, pActiveChild);
            if (pFrame == NULL)
            {
                TRACE0("Warning: failed to create new frame\n");
                AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
                return;     // command failed
            }        pTemplate->InitialUpdateFrame(pFrame, pDocument);
    }这样就产生了两个同源子窗口,你如果要将其中之一拆分,另一个不拆分
    可以把不拆分的文档模板直接用CMDIChildWnd 产生,需要拆分的用CChildFrame,然后在其中用CSplitterWnd
      

  3.   

    我刚找到一个解决方案:
    在OnCreateClient函数中
    if pContext->m_pNewViewClass->m_lpszClassName == 'a'
        拆分
    else
       不拆分
      

  4.   

    成功解决MDI+多视+拆分,解决办法如下:
    BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    // TODO: Add your specialized code here and/or call the base class
    const char* pszViewName = "CModuleView";
    if (strcmp(pszViewName, pContext->m_pNewViewClass->m_lpszClassName) == 0) 
    {
    if (!m_wndSplitter.CreateStatic(this, 1, 2) || \
    !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CModuleView),CSize(230, 0), pContext) || 
    !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CModuleView),CSize(0, 0), pContext)) 
    {
    return FALSE;
    }
    else
    return TRUE;
    }
    return CMDIChildWnd::OnCreateClient(lpcs, pContext);
    }