三、多文档界面(MDI)的程序设计
多文档界面MDI(Mulgiple Document Interface)是指在一个父窗口下面可以同时打开多个子窗口。MDI应用程序允许用户同时显示多个文档,每个文档显示在它自己的窗口中,文档或子窗口被包含在父窗口中,父窗口为应用程序中所有的子窗口提供工作空间。子窗口归属于父窗口,如果父窗口关闭,则所有子窗口全部关闭。常见的Windows应用的界面,例如微软Office的几个组件程序,全部采用的都是多文档界面。
1、MDI应用程序设计示例
创建MDI应用程序的方法比较简单。首先必须插入一个MDI窗体。下面以一个示例来说明如何利用VB中的MDI进行程序设计。
(1)设置初始窗体属性
首先启动一个新的工程,在屏幕一就会出现一个空白的窗体,窗体的属性。
属性 |
设置 |
Name |
Form1 |
Caption |
Form1 |
AutoRedraw |
True'窗体的自动重绘处于有效的状态 |
BorderStyle |
2-Sizable'在程序的运行过程中窗体可以改变大小 |
MDIChild |
True'窗体可以作为MDI窗体的子窗体 |
Moveable |
True'在程序的运行过程窗体可以移动 |
任何普通窗体都可以被设置为MDI应用程序的子窗体。方法是把普通窗体的MDIChild属性设置为True。一个应用程序可以包含许多相似或者不同样式的MDI子窗体。
(2)添加MDI窗体,设置属性
选择菜单“工程(Project)”/“添加MDI窗体(Add MDI Form)”,弹出对话框,单击[打开]按钮,添加一个MDI窗体,窗体的属性设置。
属性 |
设置 |
Name |
MDIform1 |
AutoShowChildern |
FalseMDI'窗体不能够自动的显示子窗体 |
Caption |
MDIForm1 |
Moveable |
False'窗体在程序的运行过程中不能移动 |
StartUpPosition |
2-CenterScreen'窗体始终位于屏幕的中央 |
注意:一个应用程序只能有一个MDI窗体。如果工程已经有了一个MDI窗体,则该“工程”菜单上的“添加MDI窗体”命令就不可使用。
(3)添加子窗体,设置属性
选择菜单“工程Project”/“添加窗体Add Form”,就会弹出对话框。
在AddForm对话框中选择About Dialog(关于对话框),单击[打开]按钮,就在MDI窗体上添加一个子窗体,子窗体FrmAbout的属性设置如下
属性 |
设置 |
Name |
FrmAbout |
BorderStyle |
3-Fixed Dialog'窗体在程序的运行过程中不能改变大小 |
Caption |
About MyApp |
MDIChild |
True'窗体为MDI窗体的一个子窗体 |
Moveable |
True'程序运行时可以移动窗体 |
Visible |
True |
(4)为子窗体Form1添加代码
在程序的设计阶段双击子窗体Form1,在它的Form_Load()过程中添加下列代码:
Private Sub Form_Load()
Dim X As Integer
For X=0 TO 3000 Step 75
Line(0,1000)-(x,0)'画线
line(0,1000)-(x,2000)
Line(3000,1000)-(3000-x,2000)
Line(3000,1000)-(3000-x,0)
Next
End Sub
程序说明:程序首先定义了一个整型变量X,然后进入一个循环,在循环中通过四个画直线的语句来实现程序中绘制图形的功能。
(5)为MDI窗体添加菜单
选择菜单“工具Tool”/“菜单编辑器Menu Editor”,就会弹出对话框,在菜单编辑器中,建立两个菜单项,即“文件”和“退出”,在“文件”项下还有两个菜单,即“绘图(名称:Draw)”和“关于(名称:About)”。

(6)添加菜单单击事件响应代码
分别响应三个菜单项的鼠标单击事件的代码如下:
1)单击"关于"菜单项
Private Sub About_Click()
Form1.Hide '隐藏窗体Form1. frmAbout.Show '显示窗体frmAbout
End Sub
2)单击"绘图"菜单项
Private Sub Draw_Click()
frmAbout.Hide '隐藏窗体frmAbout Form1.Show '显示窗体Form1.
End Sub
3)单击"退出"菜单项
Private Sub Exit _Click()
End
End Sub
(7)运行程序
[程序演示] [程序下载]
2、MDI应用程序中的菜单设计
在MDI应用程序中,每一个子窗体的菜单都显示在MDI窗体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单就代替菜单上的MDI窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示MDI窗体的菜单。
MDI应用程序经常使用几套菜单。当打开一个文档时,应用程序显示与该类文档相关的菜单,通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel只显示"文件"与"帮助"菜单。当用户打开一个文件时,其他菜单就会显示出来。
(1)创建MDI应用程序的菜单
通过给MDI窗体和子窗体添加菜单控件,可以为VB应用程序创建菜单。管理MDI应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在MDI窗体上。当运行该应用程序时,如果没有可见的子窗体,会自动显示MDI窗体菜单。
把应用于子窗体的菜单控件放置到子窗体中。在运行时,只要有一个子窗体可见,这些菜单标题就会显示在MDI窗体的菜单栏中。
有些应用程序支持多种类型的文档。要在VB中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和加一个带有完成图表任务菜单的子窗体。在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示MDI窗体的菜单。
(2)创建"窗口"菜单
大多数MDI应用程序都结合了"窗口"菜单,另外,有些应用程序将操纵子窗体的命令。
在MDI窗体或者MDI子窗体上的任何菜单控件,只要将其WindowList属性设置为True,都可以用于显示打开子窗体的清单。在运行时,VB自动管理与显示标题清单,并在当前正有焦点的标题旁边显示一个复选标志。另外,在窗口清单的上方自动放置一个分隔符条。
设置WindowList属性的步骤如下:
◆选取希望菜单出现其上的窗体,从"工具"菜单中,选取"菜单编辑器"。
◆在菜单编辑器列表框中,选取希望打开的子窗体的清单显示在其上的菜单。
◆选取"WindowList"复选框。
注意:WindowList属性只应用于MDI窗体和MDI子窗体。它对标准窗体(非MDI窗体)不起作用,另外只能有一个菜单设置选中WindowList属性。
(3)窗口的排列功能
在MDI窗体中使用“Arrange”方法来重新对齐子窗体。格式为:
MDI窗体.Arrange 方式
其中“MDI窗体”是MDI窗体窗体的名字;“方式”是一个整数值或符号常量,其值为0、1、2、3。
VbCascade(或用0表示)——层叠窗体。如:frmMDI.Arrange vbCascade(或frmMDI.Arrange 0)
vbTileHorizontal(或用1表示)——水平平铺窗体。如:frmMDI.Arrange vbTileHorizontal
vbTileVertical(或用2表示)——垂直平铺窗体。如:frmMDI.Arrange vbTileVertical
VbArrangeIcons(或用3表示)——当子窗体被最小化为图标后,图标在父窗体的底部重新排列。如:frmMDI.Arrange vbArrangeIcons
例:在上面的例子中添加如下代码:
Private Sub MDIForm_Load() Form1.Show frmAbout.Show MDIForm1.Arrange 1 '也可以设置为其它的数,试一试。 End Sub
并且将frmAbout的属性Borderstyle设置为2,MaxButton、MixButton设置为True;MDIForm1的“文件”菜单的"WindowList"复选框选中;设置MDIForm1窗体为“启动窗体”。
[程序演示] [程序下载]
(4)创建工具栏
为MDI应用程序手工创建工具栏的步骤如下:
◆在MDI窗体上放置一个图片框。
◆在图片框中,可以放置任何在工具栏上显示的控件。
◆设置属性。
◆编写事件响应代码。
◆编写工具栏的代码。
(5)MDI应用中要注意协调菜单与工具栏的外观
通过设置窗体的NegotiateToolbars属性决定了链接或嵌入对象的工具栏是不固定的调色板还是被放置在父窗体上。这种性能不要求工具栏出现在MDI父窗体上。如果MDI窗体的NegotiateToolbars属性设为True,则对象的工具栏出现在MDI父窗体上。如果MDI窗体的NegotiateToolbars属性设为False,则对象的工具栏就为不固定的调色板。
如果MDI窗体包含工具栏,它通常被包含在父窗体的PictureBox控件中。图片框的NegotiateToolbars属性决定了被激活时容器的工具栏是继续显示还是被对象的工具栏所代替。如果NegotiateToolbars设置为Ture,则除了容器的工具栏外还显示对象的工具栏。如果NegotiateToolbars设置为False,则对象的工具栏代替容器的工具栏。
要执行菜单与工具栏的协调,步骤如下:
◆在MDI窗体中添加工具栏
◆在子窗体上放置一个可插入的对象
◆设置NegotiateMenus,NegotiateToolbars以及Negotiate属性
◆运行此应用程序,然后双击该对象。
|