MDI 应用程序中的菜单

在 MDI 应用程序中,每一个子窗体的菜单都显示在 MDI 窗体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单(如果有的话)就代替菜单栏上的 MDI 窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示 MDI 窗体的菜单(见图 6.14 和 6.15)。

MDI 应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel 只显示“文件”与“帮助”菜单。当用户打开一个文件时,其他菜单就会显示出来(“文件”、“编辑”、“视图”、“插入”、“格式”、“工具”、“数据”和“窗口”等等)。

创建 MDI 应用程序的菜单

通过给 MDI 窗体和子窗体添加菜单控件,可以为 Visual Basic 应用程序创建菜单。管理 MDI 应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在 MDI 窗体上(即使没有子窗体可见时)。当运行该应用程序时,如果没有可见的子窗体,会自动显示 MDI 窗体菜单,如图 6.14 所示。

图 6.14 当没有子窗体被加载时,显示 MDI 窗体

把应用于子窗体的菜单控件放置到子窗体中。在运行时,只要有一个子窗体可见,这些菜单标题就会显示在 MDI 窗体的菜单栏中。

有些应用程序支持多种类型的文档。例如,在 Microsoft Access 中,可以打开表格、查询、窗体和其它文档类型。要在 Visual Basic 中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和另一个带有完成图表任务菜单的子窗体。

在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时,则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示 MDI 窗体的菜单。关于创建菜单的详细内容,请参阅本章前面的“在应用程序中使用菜单”部分。

创建“窗口”菜单

大多数 MDI 应用程序(例如:Microsoft Word for Windows 与 Microsoft Excel)都结合了“窗口”菜单。这是一个显示所有打开的子窗体标题的特殊菜单,如图 6.15 所示。另外,有些应用程序将操纵子窗体的命令,比如“层叠”、“平铺”与“排列图标”,放在这个菜单中。

图 6.15 “窗口”菜单显示每个打开子窗体的名称

在 MDI 窗体或者 MDI 子窗体上的任何菜单控件,只要将其 WindowList 属性设置为 True,都可以用于显示打开子窗体的清单。在运行时,Visual Basic 自动管理与显示标题清单,并在当前正有焦点的标题旁边显示一个复选标志。另外,在窗口清单的上方自动放置一个分隔符条。

要设置 WindowList 属性,请按照以下步骤执行:

  1. 选取希望菜单出现其上的窗体,从“工具”菜单中,选取“菜单编辑器”。

    注意 WindowList 属性只应用于 MDI 窗体和 MDI 子窗体。它对标准窗体(非 MDI)不起作用。

  2. 菜单编辑器列表框中,选取希望打开的子窗体的清单显示在其上的菜单。

  3. 选取“WindowList”复选框。

在运行时,这个菜单显示打开的子窗体的清单。另外,这个菜单控件的 WindowList 属性返回 True。

详细信息 请参阅《语言参考》的“WindowList 属性”。

排列子窗体

就象前面所提到的,有些应用程序把诸如平铺 (Tile)、层叠 (Cascade) 与排列图标 (Arrange Icons) 等操作列在和打开的子窗体列表的同一个菜单上。在 MDI 窗体中使用 Arrange 方法来重新对齐子窗体。可以层叠、水平平铺或者沿着 MDI 窗体的下部排列的子窗体图标等方式来显示子窗体。下面的实例示出了“层叠”、“平铺”和“排列图标”菜单控件的 Click 事件过程。

Private Sub mnuWCascade_Click ()
   '层叠子窗体。
   frmMDI.Arrange vbCascade
End Sub

Private Sub mnuWTile_Click ()
   '平铺子窗体。
   frmMDI.Arrange vbTileHorizontal
End Sub

Private Sub mnuWArrange_Click ()
   '排列所有子窗体图标。
   frmMDI.Arrange vbArrangeIcons
End Sub

注意 内部常数 vbCascade、vbTileHorizontal 和 vbArrangeIcons 都在对象浏览器的 Visual Basic (VB) 对象库中列出。

当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都象具有可变尺寸边框那样被定位。这使得子窗体可能重叠。