MFC多文档应用程序同时显示两个视图
本文是对网络上各种资料进行了梳理,并在VisualC++6.0下进行了实验测试。
1. 在MFC多文档应用程序中同时显示两个视图,其中一个视图显示电路原理图,另外一个显示仿真结果。
2. 两个视图需要同时显示,但是并非分割显示,而是通过切换(切换功能尚未实现)
在多文档应用程序中,视图类是由CMultiDocTemplate来负责管理的。自动生成的MFC框架中在C**App类的InitInstance()函数中,有以下的语句:
2pDocTemplate= new CMultiDocTemplate(
3 IDR_**TYPE,
4 RUNTIME_CLASS(C**Doc),
5 RUNTIME_CLASS(CChildFrame), // custom MDI child frame
6 RUNTIME_CLASS(C**View));
7 AddDocTemplate(pDocTemplate);
8
由于有两个视图需要显示,所以需要创建两个CMultiDocTemplate对象来管理,其中每个对象管理不同的View对象
为了方便在其他类中引用,我在C**App类中增
2 CMultiDocTemplate* m_pTemplateDataView;
3 CMultiDocTemplate* m_pTemplateSchematicView;
然后在InitInstance()函数替换原有创建CMultiDocTemplate对象指针的语句,这里我的代码是:
2 IDR_TR_UWBTYPE,
3 RUNTIME_CLASS(CTR_UWBDoc),
4 RUNTIME_CLASS(CChildFrame), // custom MDI child frame
5 RUNTIME_CLASS(CTR_UWBView));
6 AddDocTemplate(m_pTemplateSchematicView);
7
8 m_pTemplateDataView = new CMultiDocTemplate(
9 IDR_TR_UWBTYPE,
10 RUNTIME_CLASS(CTR_UWBDoc),
11 RUNTIME_CLASS(CChildFrame), // custom MDI child frame
12 RUNTIME_CLASS(CDataView));
13 AddDocTemplate(m_pTemplateDataView);
而此时就有了两个视图,而MFC应用程序默认是只打开一个视图的,所以这时运行程序就会出现一个要求选择显示哪个视图的对话框
为了自动显示,我们需要重写C**App类的OnFileNew()函数
2{
3 m_pTemplateSchematicView->OpenDocumentFile(NULL);
4}
注意:该函数无法用classwizard添加,只能使用member function添加
根据MSDN2001,需要在C**App类的消息响应中添加一句话才能使该函数被响应
2 //{{AFX_MSG_MAP(CTR_UWBApp)
3 ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
4 ON_COMMAND(ID_FILE_NEW, OnFileNew)
5 // NOTE - the ClassWizard will add and remove mapping macros here.
6 // DO NOT EDIT what you see in these blocks of generated code!
7 //}}AFX_MSG_MAP
红色的是添加的那个句子。
注:MSDN2001:
CWinApp::OnFileNew
You must add an
ON_COMMAND( ID_FILE_NEW, OnFileNew )
statement to your CWinApp class message map to enable this member function.
到目前为止,程序还只能显示一个view,另外一个view还没有被显示出来。
我们需要在C**Doc类中添加一些东西
在OnNewDocument()函数中我们添加如下
2CreateNewWindow(p_app->m_pTemplateDataView, this);
然后添加成员函数:
2{
3 ASSERT_VALID( pTemplate );
4 ASSERT_VALID( pDocument );
5 CFrameWnd* pFrame = pTemplate->CreateNewFrame(pDocument, NULL);
6 if( pFrame == NULL )
7 {
8 TRACE0( "Warning: failed to create new frame.\n" );
9 return NULL;
10 }
11 CRect rect;
12 GetClientRect(pFrame->m_hWnd,&rect);
13 pFrame->MoveWindow(0,0,rect.Width(),rect.Height());
14 ASSERT_KINDOF( CFrameWnd, pFrame );
15 pTemplate->InitialUpdateFrame( pFrame, pDocument );
16
17 return pFrame;
18}
此时再运行则可以一下子显示两个view了,不是重叠的。但是原理图view显示不完整,因为不是全窗口大小。我把它设置了一下
在CChildFrame类中改写虚函数ActivateFrame(int nCmdShow) ,nCmdShow默认值就是-1
2{
3 // TODO: Add your specialized code here and/or call the base class
4 if (nCmdShow == -1) {
5 nCmdShow = SW_SHOWMAXIMIZED;
6 }
7
8 CMDIChildWnd::ActivateFrame(nCmdShow);
9}
这样显示的窗口就最大化了
后面会继续更新,补充用tab键或其它方法在两个视图之间切换
本文参考的网址和文档:
http://topic.csdn.net/u/20111019/09/b54b0574-162d-4f80-8209-660070ac3feb.html
http://hi.baidu.com/liyy011/blog/item/150ce08080b449d2bd3e1e19.html
http://topic.okbase.net/200612/2006122710/2831427.html
http://blog.csdn.net/zhuimengzh/article/details/6976011
MSDN2001
侯捷著,《深入浅出MFC》
http://www.cppblog.com/cs-xiaolee/archive/2011/12/01/161292.html
MFC多文档应用程序同时显示两个视图相关推荐
- MFC单文档应用程序的基础
一.口令对话框 例题1:编写一个单文档应用程序,在视图中显示自己的姓名:单击鼠标左键,在消息框中显示 鼠标左键被按下的次数:单击鼠标右键,在消息框中显示鼠标右键被按下的次数. 操作步骤: 1.创建一个 ...
- VC++ MFC单文档应用程序SDI下调用glGenBuffersARB(1, pbo)方法编译通过但执行时出错原因分析及解决办法:glewInit()初始化的错误...
1.问题症状 在VC++环境下,利用MFC单文档应用程序SDI下开发OpenGL程序,当调用glGenBuffersARB(1, &pbo)方法编译通过但执行时出错,出错代码如下: OpenG ...
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...
- VC6.0 MFC 单文档 机器人巡检
机器人巡检 一.整体框架 主要包括三个类:场景类(CChangJing):机器人类(小车(CCar).无人机(CWuRenJi)):煤气泄露类(CMeiQiXieLou). 二.场景类 目标主要是数据 ...
- VC6.0 MFC 单文档 五子棋游戏 基础入门
五子棋游戏 一.整体思路 1.目的:通过五子棋,掌握面向对象的思想,这是我们的目的.提升分析问题.解决问题的能力,在做项目之前要有一个系统的思路,第一步干什么,第二步干什么-- 2.思路:拿到这个问题 ...
- MFC让文档/视图结构程序支持滚动条
MFC让文档/视图结构程序支持滚动条 2009-06-30 09:26要通过滚动条显示文档,还必须知道文档滚动到了什么位置:一旦用户拖动滚动条时要告诉视图改变在文档中 的位置.所有这些,由MFC的CS ...
- 【MFC】利用MFC向导生成单文档应用程序框架
00. 目录 文章目录 00. 目录 01. 解决方案与工程 02. 使用向导生成单文档应用程序框架 03. 预留 04. 附录 01. 解决方案与工程 每个应用程序都作为一个工程来处理,它包含了头文 ...
- MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结
MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...
- 利用MFC向导生成单文档应用程序框架
HelloWorld 点击文件(File)->新建(New)->项目(Project).弹出新建项目(New Project). 如果安装完VS2010以后第一启动时已经设置为VC++,则 ...
最新文章
- C#命名规则、开发习惯和风格
- JSP标签:jsp内置标签、jstl标签、自定义标签
- VR是一场“大骗局”, 另一种声音
- hdu 3065 病毒侵袭持续中(AC自动机)
- QT的QQmlNdefRecord类的使用
- input自适应_深度残差网络+自适应参数化ReLU(调参记录18)Cifar10~94.28%
- 【机器学习】神经网络BP理论与python实例系列
- 信息学奥赛一本通(2064:【例2.1】交换值)
- UISlider 滑块控件—IOS开发
- 基于keepalived实现多种模式的高可用集群网站架构
- 国内电动车召回12万辆有余 电池衰减和充电故障成头号问题
- es支持的操作及性能
- 功夫小子实践开发-开发环境的基本搭建和配置
- 计算机控制系统的输入输出信号,谈谈自动控制系统的输入输出信号
- Java基础篇--编程之路,道长且艰,千里之行,始于足下
- 抖音原创视频如何制作?鹰迪电子商务
- 超链接一般有两种表现形式_网站内链分为哪几种?内链的七种表现形式
- 霍夫曼树(赫夫曼树、哈夫曼树)
- append和extend的区别
- 虚拟服务器传文件,虚拟机与主机传输文件
热门文章
- php 追查框架生命周期,ThinkPHP5框架的生命周期:从发出请求到响应完成
- sklearn 决策树例子_机器学习|决策树的生成过程是怎样?(一)
- mysql 360怎么安装_MySQL安装方法
- 正则表达式给html添加属性,正则表达式替换html元素属性的方法
- GD32如何替换STM32?
- HDLBits答案(15)_Verilog有限状态机(2)
- 《c语言从入门到精通》看书笔记——第4章 运算符与表达式
- 基于jsp的教师科研工作量_javaweb教师工作量管理系统
- mysql设置作业_MySQL-作业1
- 20220213-CTF MISC-a_good_idea(stegsolve工具的使用)-2017_Dating_in_Singapore