我做了一个多路串口数据采集程序,界面截图如下:
程序中一共六个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好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦