多文档-多视图切换,GetActiveDocument返回NULL
我做了一个多路串口数据采集程序,界面截图如下:

程序中一共六个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)然后用了一个网上比较多的一个切换/创建框架的类,试图激活某一个视图,结果出错
我在上面第四步中,创建的模板指针时,使用的都是用一个文档类: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好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦

程序中一共六个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好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦
...全文
相关推荐
VC 2010 基于CFormView多个窗口切换程序加详细操作说明
单文档程序中通过菜单动态控制多个窗体的切换代码和详细的操作说明,基于vc2010,窗体切换找了好久,没有详细说明的,所以自己实现后写了份操作说明,供大家参考。
VC实现自定义单文档视图中的“标签”代码
使用VC实现单文档界面中的标签项控制,使用标签来选择视图。
Visual C++中TabView的多种实现方法
一篇期刊,作者:周京生 介绍了3种TabView的实现方法,有主要部分的代码。
MFC中 各类的指针和句柄的获取方法
MFC中 各类的指针和句柄的获取方法,各种API函数的使用
MFC创建串口方法
VC创建串口的方法,完整版。创建方法文档里都是通过图片描述!


