如何在 MFC 中动态拆分窗口而不使用 CSplitterWnd::Create
Posted
技术标签:
【中文标题】如何在 MFC 中动态拆分窗口而不使用 CSplitterWnd::Create【英文标题】:How to split a Window dynamically in MFC without using CSplitterWnd::Create 【发布时间】:2012-04-21 03:34:50 【问题描述】:我创建了一个 MFC MDI 应用程序,并希望通过右键单击并选择“AddSplitWnd”弹出菜单项将一个窗口一次动态拆分为两部分。我尝试使用 CSplitterWnd::CreateStatic 来实现它,一旦窗口被拆分,它需要创建一个新视图,但我想使用以前的视图,所以有人知道如何实现它。谢谢。
【问题讨论】:
【参考方案1】:这是一个代码 sn-p,用于在 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。 谢谢,我试试看。以上是关于如何在 MFC 中动态拆分窗口而不使用 CSplitterWnd::Create的主要内容,如果未能解决你的问题,请参考以下文章