您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 第7章 多文档界面设计
第七章多文档界面设计•7.1MDI的组成•7.2多文档界面设计•习题7.1MDI的组成–MDI是一个能同时处理多重文档的应用程序的用户界面和窗体结构,MDI应用程序可以在单个窗体的用户区保持多个文档窗体。MDI结构分两个部分,第一部分是父窗体,它是应用程序的父窗体,就像一个容器一样可以包含许多子窗体,只有主窗体有菜单;第二部分是子窗体,用来包容文档,这些文档可以是相同类型的文件,也可以是不同类型的文件。7.1MDI的组成•7.1.1父窗体–在MDI应用程序中,父窗体用来为应用文档提供工作区,它能包含一个或多个子窗体。父窗体和普通窗体一样,一般包括标题栏、菜单栏、工具栏和状态栏,并且也可以做与普通窗体一样的操作。所不同的是父窗体并不直接控制自己的用户区,而是在用户区上打开其他的窗体,在这些窗体上完成工作。7.1MDI的组成•7.1.2子窗体–子窗体是一个独立的窗体,显示在父窗体的用户区,没有菜单栏、工具栏和状态栏,但可以使用父窗体的这些工具。在设计阶段创建的MDI子窗体是一个模板,在运行阶段,所有的子窗体只能在父窗体边界内显示,尽管子窗体可以同时被显示,但一次只能有一个子窗体被激活。7.1MDI的组成–创建子窗体的方法和普通窗体类似,只要将它的FormStyle属性设置为fsMDIChild,便表示创建了一个子窗体。–下面介绍几个与MDI应用程序中Form组件相关的事件与方法7.1MDI的组成–(1)OnClose事件:•该事件可用来定义窗体关闭时执行的动作。在该事件处理过程中,可以测试各种数据信息,决定该窗体是否允许关闭等。该事件有一个TCloseEvent类型的Action参数,以决定窗口将执行的动作,其取值及含义如下:–caNone:不允许关闭窗体。–caHide:窗体变成隐藏状态,程序可以访问一个隐藏的窗体。–caFree:关闭窗体,释放相应的内存。–caMinimize:最小化窗体。7.1MDI的组成–(2)OnCloseQuery事件•该事件在调用Close方法或选择系统菜单的Close选项时发生。它包含一个CanClose参数,用于表示是否可以关闭该窗体,该参数的默认值为true,将该参数设置为false,将禁止关闭该窗体。–(3)ArrangeIcons方法•该方法只对MDI父窗体起作用,它将重新均匀地排列窗体中被最小化的子窗体,使得各子窗体不相互覆盖。–(4)Cascade方法•该方法只对MDI父窗体起作用,它使得MDI程序的每个子窗体在父窗体左上角到右下角级联形式排列,每个窗体相互覆盖,被覆盖的窗体只显示窗体的标题,这样可以方便地选择所有的子窗体。7.1MDI的组成–(5)TileMode属性•该属性定义了MDI子窗体在父窗体中的排列方式。它有两种取值:•tbHorizontal:MDI子窗体水平排列。•tbVertical:MDI子窗体垂直排列。–(6)Tile方法•该方法只对MDI父窗体起作用,它根据TileMode属性中定义的各子窗体的排列方式,平铺排列MDI主窗体中的各MDI子窗体。7.1MDI的组成•7.1.3使用多文档模板–Delphi7提供了预先设计好的MDI模板。通过应用模板,用户可以很方便地创建一个简单的MDI应用。–(1)打开MDI模板。•选择File→New→Other菜单命令,进入NewItems对话框后选择Projects选项卡,如图7-1所示。7.1MDI的组成图7-1NewItems对话框7.1MDI的组成–(2)选中MDIApplication选项后,单击OK按钮,弹出选择路径对话框,如图7-2所示。图7-2SelectDirectory对话框7.1MDI的组成•将光标移动到bin目录上,再单击OK按钮,就可以打开MDI模板,打开后如图7-3所示。在MDI模板中,已经布置好了六个组件,如下:•TMainMenu组件:系统定义好的菜单项。•TOpendialog组件:用来设置在选择File菜单下的Open命令时,打开文件对话框。•TActionList组件:用来集中管理程序中各种动作。•TImageList组件:提供菜单项前面的标准位图。•TPanel组件:对应菜单项的九个快捷按钮。•TStateBar组件:窗体底部的状态栏,用来显示信息。7.1MDI的组成–【例7-1】新建一个MDI应用程序,在父窗体中设计两个子窗体和一个主菜单(利用模板),运行结果如图7-5所示。图7-4运行结果7.1MDI的组成–步骤如下:•(1)新建一个工程MDIPrj.dpr,将Form1窗体的Caption的属性值设置为“父窗体”,FormStyle属性值设置为fsMDIForm。•(2)选择File→New→Form菜单命令,新建窗体Form2,将Form2的Caption属性值设置为“子窗体1”,FormStyle属性值设置为fsMDIChild。按照同样方法再新建一个子窗体Form3,将Form3的Caption属性值设置为“子窗体2”,FormStyle属性值设置为fsMDIChild。•(3)在Form1(父窗体)中添加TmainMenu组件,利用模板,创建主菜单如图7-5所示。7.1MDI的组成–也可以使用Delphi7的创建MDI应用程序向导,创建一个MDI应用程序。方法如下:•(1)选择File→New→Other…菜单命令,打开NewItems对话框,如图7-1所示。•(2)在NewItems对话框中选择Projects选项卡,双击其中的MDIApplication,将弹出如图7-2所示的SelectDirectory对话框,选择保存路径,单击“OK”按钮。7.2多文档界面设计–在MDI应用程序中使用的菜单与其他类型应用程序中使用的菜单稍有不同。在MDI应用程序中,子窗体共享父窗体的菜单,又由于存在多窗体,而一些子窗体中又有其特定的菜单项,于是就存在菜单合并和菜单覆盖等问题,Delphi7能够很好地解决这些问题。7.2多文档界面设计•7.2.1菜单合并–TMainMenu组件有一个GroupIndex属性,该属性用来控制子窗体菜单如何同主窗体菜单合并。将子窗体某菜单项的GroupIndex属性值设置为与主窗体所有菜单项的GroupIndex属性值都不相同,则子窗体的菜单项将插入到主窗体的菜单栏中;当主窗体打开一个子窗体时,子窗体的菜单就按上述规则合并到主窗体的菜单中。7.2多文档界面设计–【例7-2】在例7-1中的子窗体1中利用模板添加一个菜单Window,子窗体2中添加一个Font菜单,将子窗体1和子窗体2中的菜单与父窗体菜单合并。图7-6子窗体1窗体设计7.2多文档界面设计•7.2.2菜单覆盖–有时候会出现这样的情形,子窗体和父窗体有同名的主菜单项,在进行菜单合并时,用户要用子窗体的菜单项去替代父窗体的菜单项,这就是菜单覆盖。–菜单覆盖仍然使用主菜单项的GroupIndex属性,将子窗体的某菜单项的GroupIndex属性值设置与主窗体的某菜单项的GroupIndex属性值相同,则子窗体的菜单项将替代主窗体的菜单项,即使两者并不同名也会发生替代现象。7.2多文档界面设计–在上面的例子中,可以在“子窗体1”的主菜单设计器中利用模板再添加一个File主菜单项,将其GroupIndex属性值也设为0。为了与父窗体中的File主菜单项相区别,将“子窗体1”的File菜单设置为FileMenu(forTextEditExample)模板,如图7-10所示。7.2多文档界面设计图7-10子窗体1的菜单图7-11父窗体中的File主菜单7.2多文档界面设计•在子窗体的File菜单项未覆盖父窗体的File菜单项之前,父窗体中的File主菜单如图7-11所示。创建子窗体的File菜单后,运行程序,打开File菜单项,如图7-12所示,父窗体的File菜单项已经被“子窗体1”的File菜单项所覆盖。•事实上,如果设计菜单时忽略了给菜单项的GroupIndex属性赋值,在运行时也会发生菜单覆盖现象。因为主菜单的第一个菜单项的GroupIndex属性的默认值是0,此时父窗体和子窗体的主菜单项的GroupIndex值均为0,所以发生了菜单覆盖现象。7.2多文档界面设计图7-12运行结果习题–1.什么是多文档界面(MDI)?其结构分哪两个部分,各有何用途和区别?–2.创建父窗体和子窗体只需将窗体的FormStyle属性分别设置为何值?–3.什么是菜单合并和菜单覆盖,它们有何区别?在主菜单项的GroupIndex属性设置上有何不同?–4.自己试着建一个MDI应用程序。
本文标题:第7章 多文档界面设计
链接地址:https://www.777doc.com/doc-3213112 .html