CFormViews
我需要在 MFC SDI C++ 项目之间切换的帮助。我已经挖掘了很长时间,无法弄清楚为什么我的代码不起作用。通过搜索互联网(包括这个网站),我发现了几个通过向 MainFrm.cpp(CMainFrame
继承自 的对象CFrameWnd
)添加两个函数来切换表单的教程。其中一个传递了我要切换到的表单的 id,然后获取指向活动视图的指针,并从那里运行一些其他代码。但是,GetActiveView()
总是返回一个NULL
指针值。我知道有一个活动视图,因为我正在单击活动表单中的按钮。我的代码如下。这只是我所指的功能。它位于 MainFrm.cpp(启动新 MFC 项目时创建的默认窗口文件)中。
到目前为止,我已经尝试了 Microsoft 知识库中有关如何获取当前CDocument
或CView
从任何地方的代码,我尝试先获取活动框架,然后GetActiveView
从调用CFrameWnd
,然后我尝试了下面的代码。一切都无济于事。我显然对 MFC 知之甚少,无法弄清楚。如果您需要我提供更多信息,请询问。我可能没有提到我应该拥有的一切。我为一个学校项目选择了 MFC,在我知道我可以让这些表单工作之前,我无法继续创建 UML 或编写任何其他代码。
void CMainFrame::SelectView(UINT ViewID)
{
// If the view the user selected is already displaying, do nothing
if (ViewID == m_CurrentView)
return;
// Get a pointer to the current view
CView* pCurrentView = GetActiveView();
// We are about to change the view, so we need a pointer to the runtime class
CRuntimeClass* pNewView = NULL; // Added = NULL because it wouldn't allow program to be run without initialization of pNewView
// We will process a form
// First, let's change the identifier of the current view to our integer
::SetWindowLong(pCurrentView->m_hWnd, GWL_ID, m_CurrentView);
// Now we will identify what form the user selected
switch (ViewID)
{
case IDD_CHOOSE_ITEM:
pNewView = RUNTIME_CLASS(CChooseItemView);
break;
case IDD_ITEM_INFORMATION:
pNewView = RUNTIME_CLASS(CItemInformationView);
break;
}
// We will deal with the frame
CCreateContext crtContext;
// We have a new view now. So we initialize the context
crtContext.m_pNewViewClass = pNewView;
// No need to change the document. We keep the current document
crtContext.m_pCurrentDoc = GetActiveDocument();
CView* pNewViewer = STATIC_DOWNCAST(CView, CreateView(&crtContext));
// Now we can create a new view and get rid of the previous one
if (pNewViewer != NULL)
{
pNewViewer->ShowWindow(SW_SHOW);
pNewViewer->OnInitialUpdate();
SetActiveView(pNewViewer);
RecalcLayout();
m_CurrentView = ViewID;
pCurrentView->DestroyWindow();
}
}