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

程序员小哈
嵌入式领域优质创作者
博客专家认证
2011-10-19 09:58:15
我做了一个多路串口数据采集程序,界面截图如下:



程序中一共六个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好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦
...全文
1199 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
weitaoerya 2013-05-13
  • 打赏
  • 举报
回复
虽然时间久了 ,但是还是说一下吧。这个问题好解决,只是一个头文件的事。 你将"XXView.cpp"中的"xxdoc.h"头文件剪切到"XXView.h"这个问题就解决了。XX就是你的工程名字了。
程序员小哈 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 visualeleven 的回复:]

是不是你的Doc,View和Frame没有关联好?
你的OpenDocumentFile返回的不是CDocument*指针吗?
[/Quote]

老大来了啊,帖子刚结,都放弃解决了^_^


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);
返回的应该是CDocument*指针,我里面是这样定义的:class CMDIMultiViewDoc : public CDocument

关联部分我用了六个类似语句:
m_pView1DocTemplate = new CMultiDocTemplate(
IDR_VIEW1,
RUNTIME_CLASS(CMDIDemoDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CView1));
AddDocTemplate(m_pView1DocTemplate);

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


出现这样的结果,我感觉我程序中好多个文档呢?我上面的操作都是在使用一个文档吧?

老大帮我看看呗,这个帖子结了,一会单独开贴给你分啊,先谢谢啦
Eleven 2011-10-24
  • 打赏
  • 举报
回复
是不是你的Doc,View和Frame没有关联好?
你的OpenDocumentFile返回的不是CDocument*指针吗?
程序员小哈 2011-10-24
  • 打赏
  • 举报
回复
问题没有解决,但帖子时间太长了,还是结了吧,感觉csdn人气没有以前旺了呢
程序员小哈 2011-10-20
  • 打赏
  • 举报
回复
新的一天了,没啥音信,自己顶一下
程序员小哈 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fandh 的回复:]

惭愧,本来学的就不好,再加上时间久了,我现在也挺模糊的,建议你调试跟踪一下看看!
[/Quote]

恩,已经很感谢你啦
fandh 2011-10-20
  • 打赏
  • 举报
回复
惭愧,本来学的就不好,再加上时间久了,我现在也挺模糊的,建议你调试跟踪一下看看!
程序员小哈 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fandh 的回复:]

这么一说,我倒是有点印象,貌似我以前也碰到过这个问题,我的方法是自己写了一个函数,里面是先取得activeframe,再取得activeview,再取得activedocument
[/Quote]

我都有点迷糊啦,^_^
AddDocTemplate(m_pView1DocTemplate);这个语句是把我自己定义的文档模板添加到文档管理器中了吗?
CDocument* pDoc = pMDIActive->GetActiveDocument(); 这句返回的不是上面那个文档管理器对应的文档吗?莫非这个程序好几个模板?嘻嘻,再次讨饶
fandh 2011-10-20
  • 打赏
  • 举报
回复
当然,这只是我的印象!
fandh 2011-10-20
  • 打赏
  • 举报
回复
这么一说,我倒是有点印象,貌似我以前也碰到过这个问题,我的方法是自己写了一个函数,里面是先取得activeframe,再取得activeview,再取得activedocument
程序员小哈 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fandh 的回复:]
你做个判断,是不是框架还没有创建好?
CDocument* pDoc = pMDIActive->GetActiveDocument(); //获得活动doc

if (pDoc == NULL)
return;
[/Quote]

我的程序已经运行了,而且界面也跟帖子中提出来的一样了,框架应该运行了吧?主要我不明白pMDIActive->GetActiveDocument(); 返回的是我添加的哪个代码?我的程序中有几个文档啊?谢谢朋友,希望能得到您的再次回复
程序员小哈 2011-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xuying123456 的回复:]
楼主去看我的帖子吧,我也要做这个,而且我后续也要开发那种画图的东西,就项CPU实时数据一样,可惜啊,没人教我,我就蜗牛慢慢爬了
[/Quote]

朋友你这个问题解决了吗?
fandh 2011-10-20
  • 打赏
  • 举报
回复
你做个判断,是不是框架还没有创建好?
CDocument* pDoc = pMDIActive->GetActiveDocument(); //获得活动doc

if (pDoc == NULL)
return;
Lindsay 2011-10-20
  • 打赏
  • 举报
回复
楼主去看我的帖子吧,我也要做这个,而且我后续也要开发那种画图的东西,就项CPU实时数据一样,可惜啊,没人教我,我就蜗牛慢慢爬了
wwwhhb4006 2011-10-19
  • 打赏
  • 举报
回复

mark
程序员小哈 2011-10-19
  • 打赏
  • 举报
回复
代码中原来不能用颜色标注呀,把上面标注的,重发一下,大家帮帮忙啊

CDocument* pDoc = pMDIActive->GetActiveDocument(); //获得活动doc
ASSERT(pDoc != NULL);
---问题就出在这!GetActiveDocument返回为空
程序员小哈 2011-10-19
  • 打赏
  • 举报
回复
大家继续关注呀,

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧