多文档-多视图切换,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好久,真正用起多文档,还是对文档,框架,试图,对应关系模糊不清,先谢谢给位啦
...全文
1554 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
  • 打赏
  • 举报
回复
大家继续关注呀,
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,开发一个模仿微信客服交流平台的界面是一项普遍的需求,尤其是在构建企业级沟通工具时。这个名为"仿微信客服交流界面(具备聊天信息本地数据库存储功能)"的项目,致力于为用户创造一个类似于微信的互动体验,并且已经完成了聊天信息在本地数据库中的保存功能,以此保障信息的安全性和可恢复性。另外,项目还包含了网络传输的代码,旨在帮助开发者更好地理解和将此功能整合进自己的应用程序中。 现在让我们深入探究聊天界面的构建过程。微信客服交流界面通常由以下几个核心组件构成:用户个人照片、昵称展示、消息展示气泡、时间标记、输入区域以及发送控制键。这些组件需要经过细致的排布,以确保界面既清晰又便于使用。在用户界面设计方面,一般会采用 Material Design 或者 iOS 的 Human Interface Guidelines 来设计符合平台标准的界面。源代码文件 ChatUIDemo 可能包含了这一界面实现的代码,开发者可以通过查看和调整这个文件来个性化自己的聊天界面。 聊天信息在本地数据库中的存储是一项核心功能。在该项目中,或许选用了SQLite作为轻量级数据库,因为它易于集成,支持事务处理,适合存储结构化的数据,例如用户标识符、接收者标识符、消息内容、发送时刻等。通过运用SQL指令,能够执行数据的增加、删除、修改和查询操作,从而确保聊天记录的完整性和一致性。开发者可能需要关注如何将新接收到的消息添加到数据库中,以及如何从数据库中获取历史记录并在界面上进行展示。 在网络传输方面,可能通过HTTP或HTTPS协议来实现,并且使用了诸如AFNetworking(iOS)或O...
内容概要:本文围绕虚拟同步发电机(VSG)接入弱电网的序阻抗建模与稳定性分析开展研究,基于Matlab/Simulink平台搭建详细的仿真模型,系统复现并验证相关理论方法。研究重点包括VSG在弱电网条件下的正负序阻抗特性建模、基于小信号分析的扫频法建模流程、系统阻抗交互特性及潜在的失稳机理分析。通过具体仿真案例,深入探讨了VSG控制参数对系统稳定性的影响,旨在为新能源并网系统的稳定运行提供理论依据与技术支撑。该内容属于电力电子与电力系统稳定性交叉领域的前沿课题,具有重要的学术价值与工程应用前景。; 适合人群:具备电力系统分析、电力电子变换器控制等基础知识,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、电力系统稳定性研究的研究生、科研人员及工程师;有志于复现高水平期刊论文中阻抗建模与稳定性分析方法的技术开发者。; 使用场景及目标:① 掌握虚拟同步发电机在弱电网中的序阻抗建模理论与实现方法;② 理解并实践基于扫频法的小信号稳定性分析全过程;③ 应用于构网型变流器、虚拟同步机等先进并网技术的稳定性研究与仿真验证。; 阅读建议:建议结合所提供的Simulink仿真模型与技术资料,按照文档结构循序渐进地学习,重点关注建模原理、仿真参数设置与结果分析过程,同时参考链接中的完整资源进行代码调试与深入探究。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估开展研究,利用Matlab代码实现对电动汽车群体作为灵活性资源参与电网辅助服务的建模与仿真分析。研究重点包括基于多面体聚合与闵可夫斯基和的电动汽车可调能力(功率容量)量化方法、其在多时间尺度调度中的响应特性建模、运行备用潜力的聚合评估,以及结合智能优化算法的仿真验证,旨在系统性分析电动汽车在提供运行备用方面的技术可行性、调控潜力与系统价值。; 适合人群:具备电力系统运行与控制、智能优化算法基础,以及Matlab/Simulink编程能力的高校研究生、科研机构研究人员及从事新能源并网、需求响应、智能电网相关工作的工程技术人员。; 使用场景及目标:①掌握电动汽车集群可调能力的数学建模与聚合评估方法;②研究电动汽车参与电力系统多时间尺度协调调度的实现机制;③为高比例可再生能源电力系统的灵活性提升与运行备用资源配置提供技术参考与仿真工具支持。; 阅读建议:建议读者结合文中提供的Matlab代码深入理解电动汽车聚合建模与备用能力评估的具体实现流程,重点关注多面体建模、闵可夫斯基和运算及优化求解部分,并可延伸学习同平台关于V2G、微电网调度等相关资源以构建完整的知识体系。

16,550

社区成员

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

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

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