MFC SDI GetActiveView()始终返回NULL

时间:2017-10-31 05:28:50

标签: c++ mfc sdi

我在MFC SDI C ++项目中切换CFormViews时需要帮助。我已经挖了很长时间,无法弄清楚为什么我的代码不起作用。通过搜索互联网(包括这个网站),我通过向MainFrm.cpp(一个继承自CMainFrame的{​​{1}}对象)添加两个函数,找到了几个用于切换表单的教程。其中一个是传递我要切换到的表单的id,然后获取一个指向活动视图的指针,并从那里运行一些其他代码。但是,CFrameWnd始终返回GetActiveView()指针值。我知道有一个活动视图,因为我从活动表单中单击一个按钮。我的代码如下。这只是我指的功能。它驻留在MainFrm.cpp(启动新MFC项目时创建的默认窗口文件)。

到目前为止,我已经尝试了Microsoft知识库中的代码,该代码讨论了如何从任何地方获取当前NULLCDocument,我尝试先获取活动帧,然后调用{{ 1}}来自CView,我尝试了下面的代码。一切都无济于事。我显然对MFC没有足够的了解。如果您需要我的更多信息,请询问。我可能没有提到我应该拥有的一切。我选择为学校项目做MFC,并且在我知道我可以使这些表格起作用之前,不能继续创建UML或编写任何其他代码。

GetActiveView

2 个答案:

答案 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}}