【发布时间】:2017-11-03 18:02:03
【问题描述】:
我需要在我的 MFC SDI C++ 项目中切换 CFormViews 的帮助。我已经挖掘了很长时间,无法弄清楚为什么我的代码不起作用。通过搜索互联网(包括这个网站),我发现了几个通过向 MainFrm.cpp(继承自 CFrameWnd 的 CMainFrame 对象)添加两个函数来切换表单的教程。其中一个传递了我要切换到的表单的 id,然后获取指向活动视图的指针,并从那里运行一些其他代码。但是,GetActiveView() 始终返回 NULL 指针值。我知道有一个活动视图,因为我正在单击活动表单中的按钮。我的代码如下。这只是我所指的功能。它位于 MainFrm.cpp(启动新 MFC 项目时创建的默认窗口文件)中。
到目前为止,我已经尝试了 Microsoft 知识库中有关如何从 Anywhere 获取当前 CDocument 或 CView 的代码,我尝试先获取活动框架,然后从 @987654330 调用 GetActiveView @,我尝试了下面的代码。一切都无济于事。我显然对 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();
}
}
【问题讨论】:
-
MFC Doc/View:如何获取指向各种对象的指针?link.一个很好的概述,这张表中的一个应该会有所帮助..!
-
如果返回 NULL,则其他窗格、拆分器等可能处于活动状态。但是您仍然可以从现有的 CDocument 中获取关联的 CView。
-
谢谢您,但我已经尝试过您提供的链接。我试过了,从 CMainFrame 获取 CView (这是上面代码的一部分)。其他窗格和拆分器将如何处于活动状态?我正在使用仅打开一个窗口和一个表单的默认 SDI 代码(无论向导设置的默认表单是什么)。如果我需要从 MainFrame 中访问 CView,我将如何从 CDocument 文件中获取视图?我会创建一个 CDocument 对象,然后从其中调用一个函数吗?感谢您的帮助!
-
没有活动视图,但您确定有工作视图?首先尝试从您的工作按钮表单中设置 SetActiveView(..myView..)。