4.维护子窗体的状态信息 在用户决定退出MD应用程序时,必须有保存信息的机会。为了使其能够进行,应用程序必须随时 确定自上次保存以来子窗体中的数据是否有改变。通过在子窗体中声明一个公用变量来实现此功 例如: Public bTextChange As Boolean 在子窗体中有一个ext1控件,当该控件中的Text属性每一次改变时, Change事件就会将 bText Change设置为True,表示自上次保存以来 TextI的内容己经改变 Private Sub TextI Change bText Change=True End Sub 如果,用户每次保存子窗体的内容时,将 bText Change设置 False,可以提示Text1的内容不再需要 保存。例如,有一个叫做“保 unsAve)的菜单项和一个用来保存文本框内容的名为 FilesaveProc的过程: Private Sub mnuSave Click ileSaveProc 调用保存Text内容到文件的过程 bTextChange=False 置状态变量 End Sub 同样,当关闭当前活动子窗体时,判断 bTextChange的状态,决定是否要存盘,确保文档的安全性 Private Sub mnuClose-ClickO If bText Change Then FileSaveProc Un load Me End sub aual basic语言程序设计
Visual Basic 语 言 程 序 设 计 4.维护子窗体的状态信息 ◼ 在用户决定退出MDI应用程序时,必须有保存信息的机会。为了使其能够进行,应用程序必须随时 确定自上次保存以来子窗体中的数据是否有改变。通过在子窗体中声明一个公用变量来实现此功能。 ◼ 例如: ◼ Public bTextChange As Boolean ◼ 在子窗体中有一个Text1控件,当该控件中的Text属性每一次改变时,Change事件就会将 bTextChange设置为True,表示自上次保存以来Text1的内容已经改变。 ◼ Private Sub Text1_Change ◼ bTextChange=True ◼ End Sub ◼ 如果,用户每次保存子窗体的内容时,将bTextChange设置False,可以提示Text1的内容不再需要 保存。例如,有一个叫做“保存”(mnuSave)的菜单项和一个用来保存文本框内容的名为 FileSaveProc的过程: ◼ Private Sub mnuSave_Click() ◼ FileSaveProc '调用保存Text1内容到文件的过程 ◼ bTextChange=False '设置状态变量 ◼ End Sub ◼ 同样,当关闭当前活动子窗体时,判断bTextChange的状态,决定是否要存盘,确保文档的安全性。 ◼ Private Sub mnuClose-Click() ◼ If bTextChange Then FileSaveProc ◼ Unload Me ◼ End Sub
5.用 QueryUnload事件卸载MI窗 体 ■在MDI窗体的控制菜单框中,选择“关闭”命令,或选择“文件”菜单上的“退出”命 令,VB将试图卸载MDI窗体 当MDI窗体被卸载时, QueryUnload事件首先为MD窗体调用,然后再为一个打开的子窗 体调用。如果在这些 QueryUnload事件过程中没有代码,则取消 Unload事件,然后,每 个子窗体被卸载,最后,MDI窗体被卸载。Q 由于 QueryUnload事件在窗体卸载之前被调用,因此在窗体卸载前可以给用户一个机会 来保存窗体。下述代码使用 tExt Change标志,来决定是否要提醒用户在子窗体卸载之 前进行保存。 Private Sub mnu Exit Click 当用户在MDI应用程序中选取“文件/退出”命令时,卸载 MDI窗体,为每个打开的子窗体调用 QueryUnload事件 Unload frmMD End sub Private Sub Form QueryUnload(Cancel As Integer, UnloadMode As Integer) If bTextChange Then FileSave End sub aual basic语言程序设计
Visual Basic 语 言 程 序 设 计 5.用QueryUnload事件卸载MDI窗 体 ◼ 在MDI窗体的控制菜单框中,选择“关闭”命令,或选择“文件”菜单上的“退出”命 令,VB将试图卸载MDI窗体。 ◼ 当MDI窗体被卸载时,QueryUnload事件首先为MDI窗体调用,然后再为一个打开的子窗 体调用。如果在这些QueryUnload事件过程中没有代码,则取消Unload事件,然后,每 一个子窗体被卸载,最后,MDI窗体被卸载。 ◼ 由于QueryUnload事件在窗体卸载之前被调用,因此在窗体卸载前可以给用户一个机会 来保存窗体。下述代码使用bTextChange标志,来决定是否要提醒用户在子窗体卸载之 前进行保存。 ◼ Private Sub mnuExit_Click() ◼ '当用户在MDI应用程序中选取“文件/退出”命令时,卸载 ◼ 'MDI窗体,为每个打开的子窗体调用QueryUnload事件。 ◼ Unload frmMDI ◼ End ◼ End Sub ◼ Private Sub Form_QueryUnload(Cancel As Integer,UnloadMode As Integer) ◼ If bTextChange Then FileSaveProc ◼ End Sub
12.1.5MDI应用程序的菜单 大多数MD应用程序都有“窗口”菜单,在“窗口”菜单 上显示了所有打开的子窗体标题,另外还有层叠、平铺和 排列图标命令。 在VB中,如果要在某个菜单上显示所有打开的子窗体标题, 需利用菜单编辑器将该菜单的 Windowlist属性设置为 True,即选中显示窗口列表检查框 ■对子窗体或子窗体图标的层叠、平铺和排列图标命令,通 常是放在“窗口”菜单上,用 Arrange方法来实现的。 Arrange方法形式如下: ■格式:MDI窗体对象. Arrange〈参数 功能:实现窗口的排列方式。 说明:参数是一个整数,表示所使用的排列方式,系统提供四种 选择, aual basic语言程序设计
Visual Basic 语 言 程 序 设 计 12.1.5 MDI应用程序的菜单 ◼ 大多数MDI应用程序都有“窗口”菜单,在“窗口”菜单 上显示了所有打开的子窗体标题,另外还有层叠、平铺和 排列图标命令。 ◼ 在VB中,如果要在某个菜单上显示所有打开的子窗体标题, 只需利用菜单编辑器将该菜单的WindowList属性设置为 True,即选中显示窗口列表检查框。 ◼ 对子窗体或子窗体图标的层叠、平铺和排列图标命令,通 常是放在“窗口”菜单上,用Arrange方法来实现的。 Arrange方法形式如下: ◼ 格式:MDI窗体对象.Arrange 〈参数〉 ◼ 功能:实现窗口的排列方式。 ◼ 说明:参数是一个整数,表示所使用的排列方式,系统提供四种 选择
表12.3排列方式 值 各子窗体按层叠方式排列 各子窗体按水平平铺方式排列 各子窗体按垂直平铺方式排列 当各子窗体被最小化为图标时,能够使图标重新 如果层叠、平铺和排列图标菜单项的名称分别为“ mnuCas cade” motile和“ mnulcon'”, 程序段如下: Private Sub mnuCascade Click frmMDI. Arrange O 层叠子窗体 End Sub Private Sub mnuTile Click frmMD I. Arrange1平铺子窗体 End sub Private Sub mnuIcon Click frmMDI Arrange 3 对已经最小化的子窗体重新排列图标 aual basic语言程序设计
Visual Basic 语 言 程 序 设 计 表12.3 排列方式 ◼ 值 功 能 ◼ 0 各子窗体按层叠方式排列 ◼ 1 各子窗体按水平平铺方式排列 ◼ 2 各子窗体按垂直平铺方式排列 ◼ 3 当各子窗体被最小化为图标时,能够使图标重新 排列 ◼ 如果层叠、平铺和排列图标菜单项的名称分别为“mnuCascade” 、 “mnuTile”和“mnuIcon”,程序段如下: ◼ Private Sub mnuCascade_Click() ◼ frmMDI.Arrange 0 '层叠子窗体 ◼ End Sub ◼ Private Sub mnuTile_Click() ◼ frmMDI.Arrange 1 '平铺子窗体 ◼ End Sub ◼ Private Sub mnuIcon_Click() ◼ frmMDI.Arrange 3 '对已经最小化的子窗体重新排列图标 ◼ End Sub
12.1.6应用MDI窗体注意事项 MD窗体为使用VB进行应用程序的开发提供了高效,多功能的良好平 用MDI编写应用程序时要注意以下事项 ■(1)应尽量少地使用MDI子窗体。因为,每加载一个子窗体,就要占据较 多的内存及系统资源。过多地使用子窗体,会造成内存和系统资源不够, 影响程序运行的速度 (2)在MD应用程序的设计中,若在子窗体中,尽量用Me关键字表示当前 窗体;而在MDI窗体中,则应使用 Activeform属性。 (3)对于在子窗体菜单项、MDI菜单项或工具栏上都要执行的相同功能, 应以过程的形式存放在标准模块(Mode1)中,供各模块共 (4)如果应用程序中所使用的是不可视控件,如 Timer、 CommonDialog控 件等,都应放在MI窗体上,使子窗体也可以使用这些控件 【例12.2】进一步完善简易书写器的功能 aual basic语言程序设计
Visual Basic 语 言 程 序 设 计 12.1.6 应用MDI窗体注意事项 ◼ MDI窗体为使用VB进行应用程序的开发提供了高效、多功能的良好平 台,采用MDI窗体已是非常普遍的技术手段。为了提高其性能,在使 用MDI编写应用程序时要注意以下事项: ◼ (1)应尽量少地使用MDI子窗体。因为,每加载一个子窗体,就要占据较 多的内存及系统资源。过多地使用子窗体,会造成内存和系统资源不够, 影响程序运行的速度。 ◼ (2)在MDI应用程序的设计中,若在子窗体中,尽量用Me关键字表示当前 窗体;而在MDI窗体中,则应使用ActiveForm属性。 ◼ (3)对于在子窗体菜单项、MDI菜单项或工具栏上都要执行的相同功能, 应以过程的形式存放在标准模块(Model)中,供各模块共享。 ◼ (4)如果应用程序中所使用的是不可视控件,如Timer、CommonDialog控 件等,都应放在MDI窗体上,使子窗体也可以使用这些控件。 ◼ 【例12.2】进一步完善简易书写器的功能