第25讲 MDI窗体.ppt_第1页
第25讲 MDI窗体.ppt_第2页
第25讲 MDI窗体.ppt_第3页
第25讲 MDI窗体.ppt_第4页
第25讲 MDI窗体.ppt_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,李德奇 主编,第二十五讲MDI窗体设计,Windows 程序设计案例教程(C#),大连理工大学出版社,2,教学目标,理解MDI窗体的概念 掌握MDI主窗体的设计方法 掌握判别MDI子窗体实例存在性的方法 掌握MDI父窗体和子窗体菜单合并的处理方法 掌握MDI子窗体在父窗体中排列方式的控制方法 完成MDI窗体实例的程序编写,3,教学内容,一、MDI窗体的特性 二、MDI窗体的设计过程 三、MDI窗体的菜单处理 四、MDI窗体的显示控制,4,MDI窗体设计,C#允许在单个容器窗体中创建包含多个子窗体的多文档界面(MDI)。多文档界面的典型例子是Microsoft Office中的Word和Ex

2、cel,在那里允许用户同时打开多个文档,每个文档占用一个窗体,用户可以在不同的窗体间切换,处理不同的文档。,5,一、MDI窗体的特性,在项目中使用MDI窗体时,通常将一个MDI容器窗体作为父窗体,父窗体可以将多个子窗体包容在它的工作区之中。MDI父窗体与其子窗体之间表现出如下的特性: MDI的容器窗体(父窗体)必须且只能有一个,它只能当容器使用,其客户区用于显示子窗体,客户区不能接受键盘和鼠标事件。 不要在容器窗体的客户区加入控件,否则那些控件会显示在子窗体中。 容器窗体的框架区可以有菜单、工具栏和状态栏等控件。 子窗体可以有多个,各个子窗体不必相同。 子窗体被显示在容器窗体的客户区之中,子窗

3、体不可能被移出容器窗体的客户区之外。 子窗体被最小化后,其图标在容器窗体的底部,而不是在任务栏中。 容器窗体被最小化后,子窗体随同容器窗体一起被最小化在任务栏中。 容器窗体被还原后,子窗体随同容器窗体一起还原,并保持最小化之前的状况。 子窗体可以单独关闭,但若关闭容器窗体,子窗体随同容器窗体一起被关闭。 子窗体可以有菜单,但子窗体显示后,其菜单被显示在容器窗体上。,6,二、MDI窗体的设计过程(1/2),1、MDI容器窗体 只要将窗体的IsMdiContainer属性设置为true,它就是容器窗体。为此在窗体的Load事件中加入以下语句就是。 this.IsMdiContainer=true;

4、 容器窗体在显示后,其客户区是凹下的,等待子窗体显示在下凹区。不要在容器窗体的客户区设计任何控件。,7,二、MDI窗体的设计过程(2/2),2、MDI子窗体 MDI子窗体就是一般的窗体,其上可以设计任何控件,此前设计过的任何窗体都可以作为MDI子窗体。 只要将某个窗体实例的MdiParent属性设置到一个MDI父窗体,它就是那个父窗体的子窗体,语法为: 窗体实例名.MdiParent=父窗体对象; 例如,下一段代码编写在一个MDI父窗体的某个事件处理程序中,创建一个子窗体实例formChild1并将其显示在MDI父窗体的客户区中: FormChild formChild1=new FormCh

5、ild(); formChild1.MdiParent=this; formChild1.Show(); 其中窗体类FormChild是一个一般的普通窗体。,8,三、MDI窗体的菜单处理(1/2),可以分别为MDI父窗体和子窗体设计菜单。父窗体显示时,会显示自己的菜单。当子窗体显示在MDI父窗体中时,会将当前活动的子窗体的菜单显示在父窗体上,子窗体的菜单项与父窗体的菜单项合并共同组成MDI父窗体的菜单。在默认的情况下,子窗体的菜单被排列的父窗体的菜单后面。 通过设置各个菜单项的MergeOrder属性和MergeType属性,可以控制父窗体菜单与子窗体菜单合并组成的新菜单的顺序和菜单的组合方式

6、。 MergeOrder属性 菜单项的MergeOrder属性决定菜单项被组合到新菜单中的排列位置,这个属性值是一个整型数。所有菜单项的MergeOrder值不必连续,只需要能区分出大小就行。,9,三、MDI窗体的菜单处理(2/2),MergeType属性 菜单项的MergeType属性决定菜单项被组合到新菜单中的组合形式,这个属性值是MenuMerge类型的枚举量,这些枚举量的含义如下表。 菜单项的MenuMerge枚举,若要在父窗体上仅显示当前活动的子窗体的菜单,需要将父窗体的Menu属性指定到这个子窗体的主菜单。例如在父窗体中有这样的语句: this.Menu=formChild1.Me

7、nu; this是父窗体,formChild1是当前活动的子窗体。这样当子窗体formChild1活动时,父窗体上显示的是子窗体formChild1的菜单,而父窗体自己的菜单却不显示。,10,四、MDI窗体的显示控制(1/4),1、在MDI父窗体中显示子窗体 通常将MDI父窗体作为项目的主窗体,用户登陆后这个窗体就被启动。在MDI父窗体中显示子窗体的方法很简单,创建任何一个窗体的实例,指定本窗体为它的父窗体,就可以将这个实例显示在MDI父窗体中。例如在MDI父窗体中的第一个菜单项单击代码中将本窗体设置为子窗体实例formChild1的父窗体。 private void menuItem1_Cl

8、ick(object sender, System.EventArgs e) FormChild1 formChild1=new FormChild1(); formChild1.MdiParent=this; formChild1.Show(); ,11,四、MDI窗体的显示控制(2/4),上述menuItem1_Click事件处理程序代码能够创建子窗体的实例并显示在MDI父窗体中。倘若用户不断地单击该菜单项,将不断有同类新的子窗体实例被创建并显示,形成重复的子窗体实例在父窗体内堆积,浪费系统资源,造成数据冲突。 为了在MDI父窗体中检测某子窗体实例是否已经存在,定义一个ExistsMdiC

9、hildrenInstance()方法来实现。在该方法中,利用MdiChildren.Name来核对从参数传入的子窗体类型,若存在该子窗体的实例,激活它并返回true;若不存在,返回false。程序代码如下。 pivate bool ExistsMdiChildrenInstance(string MdiChildrenClassName) /遍历每一个MDI子窗体实例 foreach(Form childFrm in this.MdiChildren) /若子窗体的类型与实参相同,则存在该类的实例 if(childFrm.Name=MdiChildrenClassName) /若该窗体实例被

10、最小化了 if(childFrm.WindowState=FormWindowState.Minimized) /最大化这个实例 childFrm.WindowState=FormWindowState.Maximized; /激活该窗体实例 childFrm.Activate(); return true; return false; ,12,四、MDI窗体的显示控制(3/4),有了这个方法,每当在MDI父窗体创建一个子窗体实例之前,先调用这个方法来检测该类子窗体实例的存在性。倘若已存在这个实例,激活它使之占据前台,并返回一个true;若不存在这个实例,返回一个false。调用者根据这个返回

11、值来确定是否需要创建这个子窗体的实例。回过头来修改menuItem1_Click事件处理程序代码如下,子窗体重复堆积的问题就可迎刃而解。 private void menuItem1_Click(object sender, System.EventArgs e) /若不存在FormModiInfo窗体的实例 if(!ExistsMdiChildrenInstance(FormChild1) FormChild1 formChild1=new FormChild1(); formChild1.MdiParent=this; formChild1.Show(); ,13,四、MDI窗体的显示控制(4/4),2、子窗体在MDI父窗体中的排列 在默认的情况下,MDI多个子窗体显示后被层叠排列在父窗体的工作区中,子窗体的菜单按照各菜单项的MergeOrder属性和MergeType属性设置被合并到父窗体的菜单中。当子窗体被最大化后,其标题栏也被合并到父窗体中,标题文本Text被接在父窗体的标题文本之后,并被放在一对之中,窗体控制框被放置在父窗体的菜单栏中。 父窗体的LayoutMdi方法可以改变子窗体在MD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论