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