我在MFC SDI C ++项目中切换CFormViews
时需要帮助。我已经挖了很长时间,无法弄清楚为什么我的代码不起作用。通过搜索互联网(包括这个网站),我通过向MainFrm.cpp(一个继承自CMainFrame
的{{1}}对象)添加两个函数,找到了几个用于切换表单的教程。其中一个是传递我要切换到的表单的id,然后获取一个指向活动视图的指针,并从那里运行一些其他代码。但是,CFrameWnd
始终返回GetActiveView()
指针值。我知道有一个活动视图,因为我从活动表单中单击一个按钮。我的代码如下。这只是我指的功能。它驻留在MainFrm.cpp(启动新MFC项目时创建的默认窗口文件)。
到目前为止,我已经尝试了Microsoft知识库中的代码,该代码讨论了如何从任何地方获取当前NULL
或CDocument
,我尝试先获取活动帧,然后调用{{ 1}}来自CView
,我尝试了下面的代码。一切都无济于事。我显然对MFC没有足够的了解。如果您需要我的更多信息,请询问。我可能没有提到我应该拥有的一切。我选择为学校项目做MFC,并且在我知道我可以使这些表格起作用之前,不能继续创建UML或编写任何其他代码。
GetActiveView
答案 0 :(得分:0)
以下代码对我有用:
virtual CView* SwitchToView(CView* pNewView);
和cpp:
CView* CMyDoc::SwitchToView(CView* pNewView)
{
CMDIFrameWndEx* pMainWnd = (CMDIFrameWndEx*)AfxGetMainWnd();
// Get the active MDI child window
CMDIChildWndEx* pChild = (CMDIChildWndEx*)pMainWnd->MDIGetActive();
// Get the active view attached to the active MDI child window.
CView* pOldActiveView = pChild->GetActiveView();
// Exchange control ID of old view
// note: if you have more than two view you have to remember which view you switched to
// so you can set it's old control ID correctly
if(pNewView == m_pMyView)
pOldActiveView->SetDlgCtrlID(CTRLID_MYVIEW2);
if(pNewView == m_pMyView2)
pOldActiveView->SetDlgCtrlID(CTRLID_MYVIEW);
// Exchange control ID of new new
// note: the control ID of the active view must always be AFX_IDW_PANE_FIRST
pNewView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
// Set flag so that document will not be deleted when view is dettached.
BOOL bAutoDelete = m_bAutoDelete;
m_bAutoDelete = FALSE;
// Dettach existing view
RemoveView(pOldActiveView);
// restore flag
m_bAutoDelete = bAutoDelete;
// Show the newly active view and hide the inactive view.
pNewView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
// Attach new view
AddView(pNewView);
pChild->RecalcLayout();
pNewView->UpdateWindow();
pChild->SetActiveView(pNewView);
return pOldActiveView;
}
我希望它可以帮到你。
答案 1 :(得分:0)
要从CDocument获取非活动View但关联的CView,您可以在Doc
中实现此架构{{1}}
然后添加您的SelectView代码
{{1}}