多文档-多视图切换,GetActiveDocument返回NULL

程序员小哈 CSDN会员 程序员小哈 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我做了一个多路串口数据采集程序,界面截图如下:



程序中一共六个View,我做的过程如下:
1)首先创建想切换的六个视图类(view类)
2)然后在xx.cpp文件中(XX代表工程名)即CxxApp类的cpp文件中,包含切换的六个类的头文件
3)在 CxxApp的头文件里申请六个CMultiDocTemplate指针
形如:CMultiDocTemplate *m_pView1DocTemplate;
...
4)在CxxApp的InitInstance()函数内,创建上面六个指针指向的实例
形如:
m_pView1DocTemplate = new CMultiDocTemplate(
IDR_VIEW1,
RUNTIME_CLASS(CMDIDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView1));
AddDocTemplate(m_pView1DocTemplate);
5)然后,我打开了六个View
void CMDIDemoApp::OnFileNew()
{
// TODO: Add your command handler code here
BeginWaitCursor(); // 开始漏斗鼠标

CMDIDemoDoc *pDoc1 = (CMDIDemoDoc *)m_pView1DocTemplate->OpenDocumentFile(NULL);
CMDIDemoDoc *pDoc2 = (CMDIDemoDoc *)m_pView2DocTemplate->OpenDocumentFile(NULL);
CMDIDemoDoc *pDoc3 = (CMDIDemoDoc *)m_pView3DocTemplate->OpenDocumentFile(NULL);
CMDIDemoDoc *pDoc4 = (CMDIDemoDoc *)m_pView4DocTemplate->OpenDocumentFile(NULL);
CMDIDemoDoc *pDoc5 = (CMDIDemoDoc *)m_pView5DocTemplate->OpenDocumentFile(NULL);
CMDIDemoDoc *pDoc6 = (CMDIDemoDoc *)m_pView6DocTemplate->OpenDocumentFile(NULL);

EndWaitCursor(); // 停止漏斗鼠标
}

6)然后用了一个网上比较多的一个切换/创建框架的类,试图激活某一个视图,结果出错

void CMainFrame::CreateOrActivateFrame(CDocTemplate *pTemplate,CRuntimeClass *pViewClass)
{
// CMainFrame *pFrame = (CMainFrame*) AfxGetMainWnd();
// CMDIChildWnd* pMDIActive = pFrame->MDIGetActive(); //获得活动子窗口

CMDIChildWnd* pMDIActive = MDIGetActive(); //获得活动子窗口
ASSERT(pMDIActive != NULL);
CDocument* pDoc = pMDIActive->GetActiveDocument(); //获得活动doc
ASSERT(pDoc != NULL);
---问题就出在这!GetActiveDocument返回为空

CView* pView;
POSITION pos = pDoc->GetFirstViewPosition(); //查询此doc下的所有已创建view
while (pos != NULL)
{
pView = pDoc->GetNextView(pos); //如果已创建此view 则设其为活动
if (pView->IsKindOf(pViewClass))
{
pView->GetParentFrame()->ActivateFrame();
return;
}

// pView->UpdateWindow(); //视图更新显示;
}

// This view doesn't exist for this document, create it
CMDIChildWnd* pNewFrame = (CMDIChildWnd*)(pTemplate->CreateNewFrame(pDoc, NULL));
if (pNewFrame == NULL)
{
return; // not created
}
ASSERT_KINDOF(CMDIChildWnd, pNewFrame);
pTemplate->InitialUpdateFrame(pNewFrame, pDoc);
pNewFrame->UpdateWindow(); //***
}



我在上面第四步中,创建的模板指针时,使用的都是用一个文档类:CMDIDemoDoc,为什么GetActiveDocument返回的为NULL呢,我看网上这篇文章,http://hi.baidu.com/yuhuiniu/blog/item/cffa2489de1128a80f2444f6.html
我做的一步不少,为什么他的可以正常运行呢?


m_pView1DocTemplate = new CMultiDocTemplate(
IDR_VIEW1,
RUNTIME_CLASS(CMDIDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView1));
AddDocTemplate(m_pView1DocTemplate);


希望各位指定一下,用了VC好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦
...全文
评论 17
收藏 已收藏
分享
返回顶部
程序员小哈 CSDN会员
程序员小哈 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
VC/MFC 16,550 成员 421,606 内容