如何在MFC中动态拆分窗口而不使用CSplitterWnd::Create

如何在MFC中动态拆分窗口而不使用CSplitterWnd::Create,mfc,csplitterwnd,Mfc,Csplitterwnd,我创建了一个MFC MDI应用程序,并希望通过右键单击并选择“AddSplitWnd”弹出菜单项,一次动态地将窗口拆分为两部分。我尝试使用CSplitterWnd::CreateStatic来实现它,一旦窗口被拆分,它就需要创建一个新的视图,但是我想使用以前的视图,所以任何人都知道如何实现它。谢谢。这里是一段代码片段,用于在SDI环境中的拆分器中交换视图。这也适用于MDI中的工作 CView* CDoc::SwitchToView(CView* pNewView) { CFrameWnd

我创建了一个MFC MDI应用程序,并希望通过右键单击并选择“AddSplitWnd”弹出菜单项,一次动态地将窗口拆分为两部分。我尝试使用CSplitterWnd::CreateStatic来实现它,一旦窗口被拆分,它就需要创建一个新的视图,但是我想使用以前的视图,所以任何人都知道如何实现它。谢谢。

这里是一段代码片段,用于在SDI环境中的拆分器中交换视图。这也适用于MDI中的工作

CView* CDoc::SwitchToView(CView* pNewView)
{
    CFrameWndEx* pMainWnd = (CFrameWndEx*)AfxGetMainWnd();
    CView* pOldActiveView;
    pOldActiveView = pMainWnd->GetActiveView();
    CSplitterWnd* pSplitter = (CSplitterWnd *)pOldActiveView->GetParent();

    // in this case Pane 0,0 is exchanged
    pOldActiveView = (CView*) pSplitter->GetPane(0,0);

    // set flag so that document will not be deleted when view is destroyed
    m_bAutoDelete = FALSE;    
    // Dettach existing view
    RemoveView(pOldActiveView);
    // set flag back to default 
    m_bAutoDelete = TRUE;

    // Set the child window ID of the active view to the ID of the corresponding
    // pane. Set the child ID of the previously active view to some other ID.
    ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, 0);
    ::SetWindowLong(pNewView->m_hWnd, GWL_ID, pSplitter->IdFromRowCol(0,0));

    // Show the newly active view and hide the inactive view.
    pNewView->ShowWindow(SW_SHOW);
    pOldActiveView->ShowWindow(SW_HIDE);

    // Attach new view
    AddView(pNewView);

    // Set active 
    pSplitter->GetParentFrame()->SetActiveView(pNewView);
    pSplitter->RecalcLayout(); 
    return pOldActiveView;
}

HTH

您好,谢谢您的回答。关键是将新视图的控件id设置为旧活动视图的id。但是当我尝试这样做的时候,有一些问题。我通过CSplitterWnd::CreateView()创建了一个新视图。假设我有一个由m_splitter1创建的分割窗口,它有两个视图pView1和pView2,下次我在pView1上创建另一个分割窗口时,我想有一个pView3,pView4,当我创建pView3时,我总是得到与pView1相同的地址,这很奇怪,但是pView1的成员已经被再次初始化,所以我无法再次得到它。您是否满足了这样的条件?在不使用CSplitterWnd::CreateView的情况下创建视图。只需公开构造函数并调用new、Create和InitialUpdate即可。谢谢,我会尝试一下。