进一步了解MDI窗体

       这次的机房收费系统,刚一着手就使我对MDI窗体有了新的认识。

       MDIMultiple Document Interface,多文档界面。MDI窗体用于同时显示多个文档,每个文档显示在各自的窗口中。对应于SDISingle Document Interface),单文档界面。例如,office提供的Word就是MDI,我们可以同时打开多个Word文件,却不能同时打开两个记事本,记事本为SDI

       之前我对MDI的认识仅止于此。


 

       而这次的机房收费系统,刚做主界面,就给我留了一个问题:随便点击了一个CommandButton,在MDI窗体上一画——恩?按钮呢?然后一试,发现大多数控件不能直接在MDI窗体上绘制。PictureBox可以,但是却不能改变其Width属性,Picture.Width总是=MDIForm.ScaleWidth


 

       经查,在MDI窗体上只能包含一个MenuPictureBoxToolBar、具有Align属性的ActiveX控件和自定义控件,以及具有不可见界面的控件(如:Timer)。

       那么,如何在MDI窗体上添加其他控件,满足用户和编程的需要呢?

       实现MDI窗体上添加其他控件,我已知的有两种解决方法:

(1)MDI窗体上添加一个PictureBox,图片框本身为容器控件,可在其内添加其他控件。

使用PictureBox添加控件有一个问题,就是MDI子窗体显示问题——PictureBox控件会遮挡MDI子窗体,使我们看不全甚至看不见其子窗体。

---

解决办法:SetParent()函数,每显示一次子窗体,就要调用一次SetParent()函数。

另外,Picture.Visible=False,也可实现子窗体显示,但同时Picture上的其他控件也一同被隐藏了。

---

追根溯源(PictureBox遮挡MDI子窗体的原因):子窗体实际上是位于MDIClient中,就是说子窗体的父窗体是MDIClient,而放置在MDI中的pictureboxMDIClient是同一级的层次结构。

MDIForm--MDIForm1

---MDIClient

------ Form1 子窗体1

------ Form2 子窗体2

---PictureBox

(2)添加一个MDI子窗体,在子窗体上绘制其他控件,然后在MDI窗体中显示子窗体,也可达到貌似在MDI窗体中添加控件的假象。

  


 

MDI窗体上添加控件和显示子窗体的问题,体现了我们发现问题和一步步解决问题。

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
注意,这是未完成版本!!! 由于作者工作原因,暂时没有时间完成,但是基本功能已经实现,有个小问题如果你解决了欢迎发送给我,谢谢! 请用VS2010打开。内含四个DLL工程,及一个DLL 的测试工程。 其中一个问题是,打开子窗口之后子窗口内容没有显示,单击子窗口客户区之后其内容才显示,目前作者没有解决。 /************************************************************************/ /* MdiPlus框架说明 */ /************************************************************************/ /** 项目名称: MdiPlus框架 版本号: v1.0.1 第一作者: Jef 地址: 中国/江苏 日期: 20100616 电子邮箱: dungeonsnd@126.com 版权: 1.本框架完全开源。您可以免费使用本程序,但在用于商业用途前请获得第一作者的许可。 2.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任, 一概与第一作者及合作单位无关。 3.如果您使用本程序则表示您已经同意此版本协议!否则请勿使用! 项目功能: MdiPlus框架是在Windows平台下把SDI程序行为与MDI程序行为结合在一起的编程手段。 框架最适合: a.以GDI方式输出为主的应用程序。 b.需要多种文档模板输出的MDI程序。 c.需要一个类似于SDI应用程序的固定(禁止改变大小)的View进行绘图。 框架充分进行模块化,把MDI的窗口创建类放在一个单独的DLL中(DllMdiWnd.dll),开发者应该继承 这个类来得到一个文档模板(这样继承者不必考虑创建细节,只负责绘图),并且每一个文档模板最好 放到一个DLL中(如ADoc.dll,BDoc.dll,CDoc.dll)。开发者建立主程序来调用ADoc.dll,BDoc.dll, CDoc.dll,每个文档模板(如ADoc.dll)可产生多个对应子窗口。 不过,DllMdiWnd.dll并没有提供view/doc支持,它的职责只是创建及销毁调用者的需要子窗口。 (如果子窗口是new创建出来的,ADoc.dll的基类CMdiPlus中自己会负责delete,开发者可以不调用 delete)。 当然,如果有必要你可以在DLL(A.dll,B.dll,C.dll)中实现view/doc支持。建议根据 需要开发独立的数据模型模块。 如果按照MVC模式的划分,DllMdiWnd.dll可以理解为C(控制器,创建与销毁窗口),继承类(如ADoc.dll, BDoc.dll,CDoc.dll)类似于V(视图,负责显示数据),这个框架没有提供M(模型,数据存储)。开发者 应该结合不同的文档模板来实现M。 版本历史: v1.0.1 20100616 第一版本 如何使用: 方法1. 进行项目开发时先建立DLL工程(建议选择 add mfc header win32 dll),然后把 DllMdiWnd.dll拷贝到新建项目中。根据应用需要的不同文档模板建立多个对应的Dll工程,这些Dll 都继承自DllMdiWnd.dll的导出类,假定为ADoc.dll,BDoc.dll,CDoc.dll,这些Dll隐式链接DllMdiWnd.dll。 接着建立支持doc/view类型的MDI MFC主程序工程,隐式链接ADoc.dll,BDoc.dll,CDoc.dll。 另外要特别注意的是,主程序要进行必要的修改,如CChildFrame中要修改窗口样式。建立的MDI 主程序运行过程中将完全类似于SDI程序。如,弹出子窗口时它的视图仍然保持最大化(普通的MDI应用 程序中任意一个子窗口从最大化还原时,其它窗口都将处于非最大化状态),并且它永远处于弹出的 子窗口下面,只能(且必须)建立一个CChildFrame。主程序的所有绘图工作都在这个 CChildFrame对应的view上进行。如果需要调用子窗口,只需要创建ADoc.dll(或BDoc.dll,CDoc.dll)导 出类的对象即可。子窗口的所有绘图工作都在ADoc.dll(或BDoc.dll,CDoc.dll)中实现,所以主程序与 ADoc.dll(或BDoc.dll,CDoc.dll)应该同时开发。 方法2. 开发者可以自己根据需要直接修改Demo版进行开发。 其它: 框架有点类似于多个文档模板的MDI应用程序,但是普通的MDI程序在新建一个文档前无法绘图,除非 子类化CMainFrame或截获CMDIClient的消息。这些方式不便进行模块化开发。MdiPlus框架主要优点是在 新建一个文档前就有一个View进行绘图,并且不同功能进行模块化,各模块放到Dll中(如果必要,你也 可以直接写成静态库链接到最终的执行程序里),适合一个项目多人同时进行开发。 **/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值