《VB对话框与菜单程序设计.ppt》由会员分享,可在线阅读,更多相关《VB对话框与菜单程序设计.ppt(108页珍藏版)》请在三一办公上搜索。
1、第8章用户界面设计,对话框是一种特殊的“窗体”,只有一个“关闭”按钮,不能最大化和最小化,大小一般不能改变。一些应用程序中常常需要进行打开和保存文件、选择颜色和字体、打印等操作,这就需要应用程序提供相应的对话框以方便使用。这些对话框作为Windows资源,在VB中已被做成“公共对话框”(Common Dialog)控件。,8.1.1通用对话框,通用对话框是一种ActiveX控件,位于“Microsoft Common Dialog Control 6.0”部件中。,工程部件 Common Dialog Control 6.0,设计时,通用对话框在窗体上显示成一个图标,可以在“属性页”里中进行属
2、性设置,将其设置为不同类型,可以通过代码,使用Action属性或Show方法,将通用对话框设置成不同的具体对话框。,通过在代码中设置不同的Action值可以产生不同的对话框。如果没有设置该属性(默认值为0),运行时通用对话框不会产生任何信息,直到设置了该属性后才会出现相应的对话框。,Action属性返回或设置被显示的对话框的类型:CommonDialogName.Action Value,其中CommonDialogName为通用对话框控件的名字,Value值可以取16的整数,其含义如表示。,注意:使用该控件所产生的对话框仅提供了人-机信息交互的界面,并不能实现真正的操作(如打开、另存、打印等
3、),要想实现这些具体的操作必须进行相应的编程。,ShowX方法设置被显示的对话框的类型,其语法格式为:其中CommonDialogName为通用对话框控件的名字。ShowX方法参考表8-1。,CommonDialogName.ShowX,DialogTitle属性:产生的对话框的标题文字,如不进行设置则会使用默认的标题。CancelError属性:在每个所产生的对话框上都有“取消”按钮,该属性决定程序运行时,用户单击了“取消”按钮后是否会产生出错信息。,该属性取True时,单击“取消”按钮会产生一个错误信息,同时自动将Err对象的Number属性值设置为32755。程序中可以通过代码来访问这个
4、属性以判断是否按下了“取消”按钮,以决定程序的走向。如果该属性值置为False(默认),则当单击“取消”按钮时,不会产生任何出错信息。,“打开”对话框充分利用了操作系统的功能,它可以遍历整个的磁盘目录结构,找到所需要的文件,并以“列表”或“详细资料”的方式显示出来。文件对话框具有两种模式,即Open和Save(Save As),其中Open模式可以使用户指定打开的文件,Save模式可以使用户指定保存的文件。,1.文件对话框,Action属性:对话框类型(取值1或2)DefaultExt属性:对话框默认的文件扩展名DialogTitle属性:对话框标题栏的字符串,1.文件对话框,FileName
5、属性:文件名称该属性值为字符串类型,用于设置或得到用户所选定的文件名。即当程序执行时,用户选定的某个文件名将显示在“文件名”文本框中,同时此文件名及相关路径将以字符串的形式赋值给FileName属性。,1.文件对话框,InitDir属性:初始路径该属性用来指定“打开”对话框中的初始目录。默认设置显示当前目录。初始路径在设计时或代码编写中均可进行设置。例:Cd1.InitDir=”E:教材”将对话框的初始路径设为E盘“教材”文件夹,1.文件对话框,Filter属性:文件类型通过Filter属性在“打开”对话框中设置文件的类型。该属性的值是一个字符串,由一组或多组文件类型表达式构成,每组代表一类文
6、件。构成规则是:类型说明字符串|类型通配表达式|类型说明字符串|类型通配表达式,1.文件对话框,类型说明字符串为对文件类型的说明,类型通配表达式表示需显示的文件类型,各组之间用“|”符号分开。,1.文件对话框,Object.FilterDescription1|Filter1|Description2|Filter2,FilterIndes属性:过滤器索引该属性用于表示用户在“文件类型”列表框中选定的文件类型的序号。例如与图所示相对应,Word文档的该属性值为1,文本文件的该属性值为2。,1.文件对话框,设置适当属性,使对话框的标题为“打开文件”,初始目录为c盘根目录;设置适当属性,使对话框的
7、“文件类型”下拉式组合框中有二行:“Word文档”、“所有文件”,默认的是“所有文件”;编写命令按钮的事件过程,使得单击按钮可以弹出“打开文件”对话框;,例:在窗体上画一个名称为command1的命令按钮,标题为”打开文件“,再画一个名称为CD1的通用对话框。程序运行后,若单击命令按钮,则弹出打开文件对话框,并按下列要求设置属性和代码:,思路:首先,条件、是在对话框属性窗口上配置参数,可在对话框属性窗口内填写“对话框标题”、“初始化路径”的相应内容;其次,过滤器的内容为:Word文档|*.doc|所有文件|*.*;且根据题意,过滤器索引值设为2;另,条件是指编写代码,调用通用对话框,可采用如下
8、程序代码:cd1.action=1 或者 cd1.showopen 均可,书本P232【例8.1】,建立一个命令按钮,用于打开一个Windows应用程序,如“计算器”、“日历”等。,“另存为”对话框为用户在存储文件时提供了一个标准界面,供用户选择或键入所要存入文件的路径及文件名。“另存为”对话框所涉及的属性与“打开”对话框基本相同,只是多了一个DefaultExt属性,该属性用来表示所存文件的默认扩展名。,2.另存为对话框,2.颜色对话框“颜色”对话框中的调色板除了提供基本颜色外,还提供了自定义颜色,供用户调色。对用户来说,使用该对话框,可以获得非常直观的效果。Color属性:用来返回选定的R
9、GB颜色值。,2.颜色对话框 例如,用颜色对话框改变窗体的背景色,“字体”对话框用来设置并返回所用字体的名字、字形、大小、效果及颜色。使用字体对话框时,必须首先设置对话框的Flags属性,然后才能使用ShowFont方法实际显示对话框。,3.字体对话框,Flags属性值可以设置为如下3种情况:cdlCFScreenFonts:屏幕字体。cdlCFPrinterFonts:打印机字体。cdlCFBoth:可以是屏幕字体,也可以是打印机字体。,3.字体对话框,书本P235【例8.4】,例:,Copys:设置或返回打印份数FromPage:打印起始页ToPage:打印终止页PrinterDefaul
10、t:确定在打印对话框中的选择是否用于改变系统默认的打印机设置。,4.打印对话框,8.2.1菜单设计概述菜单提供了一种结构化的方式向使用应用程序的用户提示可用的命令。菜单是Windows应用程序中十分关键的要素之一,以分组的形式组织多个命令或操作。,8.2.1菜单设计概述下拉式菜单弹出式菜单,8.2.2下拉式菜单设计,下拉式菜单是用户在任何时候都可以在顶端菜单条上选择后拉出的菜单。,8.2.2下拉式菜单设计在Visual Basic中,把每个菜单项看成是一个控件。菜单控件只包含一个事件,即Click事件。,8.2.2下拉式菜单设计,主菜单名快捷键热键子菜单标记,主菜单条,分隔线,子菜单名,8.2
11、.2下拉式菜单设计下拉式菜单的设计通过菜单编辑器来完成。打开菜单编辑器的方法:“工具”菜单菜单编辑器 组合键“Ctrl+E”工具栏上的“菜单编辑器”按钮 鼠标右键菜单编辑器,8.2.2下拉式菜单设计,打开“菜单编辑器”:,“Tools”菜单 在“工具栏”上选择“菜单编辑器按钮”,8.2.2下拉式菜单设计,“菜单编辑器”的使用:,菜单列表框,菜单项属性,操作按钮,8.2.2下拉式菜单设计,关于下拉式菜单的说明1Caption:菜单项标题。2Name:菜单项名称。当通过代码处理菜单项时需要使用Name属性。3热键:在菜单的Caption属性中在某个字母前加上“&”符号就可以将该字母变为热键。当文件
12、菜单展开时,同时按下Alt和O就可以选择“打开”菜单命令。4ShortCut:快捷键,不用打开“文件”菜单就可以通过Ctrl+O快捷键来选择“打开”菜单命令。“打开”菜单项的快捷键为Ctrl+O。,5分隔条:将菜单按功能进行分组。通过将Caption属性设置为“-”(减号、连字符)可以将菜单项设置为分隔条。6有效(Enabled)检查框:当某个菜单项的颜色变为灰色时表示该菜单项的功能被禁用。将菜单项的Enabled属性设置为False就可以禁用该菜单项。7可见(Visible)检查框:通过将菜单项的Visible属性设置为False可以隐藏该菜单项,而要重新显示该菜单项仅需将Visible属性
13、重新设置为True。8复选(Checked)检查框:通过将菜单项的Checked属性设置为True可以在菜单项前显示复选标志。,1.利用菜单编辑器定义菜单项,例:为电子标题板增加一个下拉式菜单,利用菜单控制标题板的内容、字号、字体风格等。,设计菜单项:,例:使用菜单控件数组:简化编程,用一段代码处理多个菜单项,弹出式菜单独立于菜单栏而显示在窗体的浮动菜单,操作时使用右键。在弹出式菜单上显示的内容与鼠标位置有关。,与一般菜单的设计相似,弹出式菜单通过菜单编辑器建立。不同的是菜单名的 Visible属性设置为False,或者在菜单编辑器中不选中“可见”复选框。,语法格式:窗体名.PopupMenu
14、 菜单名,flags,x,y说明:省略窗体名,将打开当前窗体的菜单;菜单名是通过菜单编辑器设计的菜单的名称Flags参数为一些常量数值的设置,包含位置常数和行为常数,表示弹出的位置和触发的键位置。,两个常数可以相加或者以or相连,50,例为窗体设计一个弹出式菜单,用于设置窗体背景颜色。,实例,51,例 在窗体上添加一个文本框,通过下拉菜单实现复制、粘贴功能,实例,点击“右键”显示菜单项的时候,应先判断文本框中是否有文本被选中,确定哪些菜单项可用。If Text1.SelLength 0 Then mnuEditCut.Enabled=True mnuEditCopy.Enabled=True
15、Else mnuEditCut.Enabled=False mnuEditCopy.Enabled=False,(1)剪贴板对象Clipboard 剪贴板是内存的一部分区域,所有应用程序都能使用剪贴板中的信息。在VB中,所有与剪贴板有关的操作是通过剪贴板对象实现的。剪贴板对象是用于暂时保存图形和文本的一种特殊的控件,它是VB中预先定义好的控件组。剪贴板对象没有任何属性和事件,但通过它的一些方法可以提供对系统剪贴板的访问(即发送和接收数据)。,剪贴板对象的方法Clipboard.Clear 将剪贴板清空Clipboard.SetText Text1.SelText 将选中的字符串复制到剪贴板Cl
16、ipboard.SetData Data,Format 将非文本数据复制到剪贴板上Clipboard.GetText 将剪贴板上的字符串发送到光标所在位置Clipboard.GetData 将剪贴板上的非文本数据发送到光标所在位置,Private Sub mnuEditCut_Click()If Text1.SelLength 0 Then Clipboard.SetText Text1.SelText Text1.SelText=同时要让粘贴菜单项有效 mnuEditPaste.Enabled=True End IfEnd Sub Text1.SelText表示文本框中选定的文本 Text1
17、.SelLength表示文本框中选定文本的长度,Private Sub mnuEditCopy_Click()If Text1.SelLength 0 Then Clipboard.SetText Text1.SelText mnuEditPaste.Enabled=True End IfEnd Sub 复制与剪切的区别是Text1.SelText=同时要让粘贴菜单项有效,Private Sub mnuEditPaste_Click()If Len(Clipboard.GetText)0 Then Text1.SelText=Clipboard.GetText End IfEnd Sub注意:
18、Text1.SelText=Clipboard.GetText 和 Text1.Text=Clipboard.GetText的区别(在光标所在位置处插入剪贴板上的数据),Private Sub mnuEditSel_Click()If mnuEditSel.Checked=False Then mnuEditSel.Checked=True Text1.SelStart=0 Text1.SelStart表示文本框中选定文本的开始位置 Text1.SelLength=Len(Text1.Text)Else mnuEditSel.Checked=False Text1.SelLength=0 En
19、d IfEnd Sub,Text1.Text:表示文本框中的文本Text1.SelText:表示文本框中选定的文本Text1.SelLength:表示文本框中选定文本的长度Text1.SelStart:表示文本框中选定文本的开始位置,综合实例:参照WINDOWS的记事本程序,建立一个有菜单功能的文本编辑器,8.3 MDI窗体,多重窗体是指一个应用程序中有多个并列的普通窗体,每个窗体都是一个对象,可以有属于自己的对象、属性和事件过程,完成不同的功能。MDI窗体,是指一个应用程序(父窗体)中包含多个文档(子窗体),绝大多数基于Windows的大型应用程序都是MDI窗体,如Microsoft Exc
20、el和Microsoft Word等应用程序都是MDI窗体程序。MDI窗体可以同时打开多个文档,它简化了文档之间的信息交换。,MDI窗体允许创建在单个容器窗体中包含多个窗体的应用程序,允许用户同时显示多个文档,每个文档显示在它自己的窗体中。MDI窗体是有父子关系的窗体,可以根据窗体作用的不同,来确定窗体是父窗体还是子窗体。文档或子窗体被包含在父窗体中,父窗体为应用程序中所有的子窗体提供工作空间,用户在父窗体完成几乎所有的工作。,8.3 MDI窗体,例:Microsoft Excel 允许创建并显示不同样式的多文档窗体,每个子窗体都被限制在 Excel 父窗体的区域之内。当最小化 Excel父窗
21、体时,所有的文档窗体都被最小化,只有父窗体的图标显示在任务栏中。当关闭Excel父窗体时,所有的文档窗体都被关闭,但关闭某个文档窗口时,Excel父窗体不会被关闭。,8.3 MDI窗体,具体什么时候选用单窗体程序,什么时候使用多重窗体或MDI窗体呢?这需要根据应用程序的目的,来决定使用哪种界面样式最好。例:日历程序最好设成单窗体程序,因为没有必要同时打开一个以上日历;,8.3 MDI窗体,一个处理保险索赔的应用程序可能要设计成MDI窗体,使用多文档界面样式,因为一个职员很可能会同时处理一个以上索赔,或者需要对两个索赔进行比较;一个管理信息系统(MIS系统),需要完成的功能比较多,比如最基本的功
22、能添加、修改、删除和查询记录等,这些功能的实现都需要窗体界面,而这些窗体一般都是并列使用,所以像学生成绩管理系统这样的应用程序,一般设计成多重窗体程序。,8.3 MDI窗体,8.3 MDI窗体程序设计,1 MDI窗体特性2 创建MDI应用程序 3 MDI窗体及子窗体4 MDI窗体的菜单,MDI窗体程序由父窗口和子窗口组成,父窗口又称为MDI窗体,它被作为子窗口的容器。子窗口又称为文档窗口,它用于显示各个文档,所有的子窗口都具有相同的功能。,1 MDI窗体特性,在运行时,MDI 窗体及其所有的子窗体都呈现特定的性质:(1)所有子窗体均显示在 MDI 窗体的工作空间内。像其它的窗体一样,用户能移动
23、子窗体和改变子窗体的大小,不过,它们被限制于这一工作空间内。,1 MDI窗体特性,在运行时,MDI 窗体及其所有的子窗体都呈现特定的性质:(2)当最小化一个子窗体时,它的图标将显示于 MDI 窗体上而不是在任务栏中。当最小化 MDI 窗体时,此 MDI 窗体及其所有子窗体将由一个图标来代表。当还原 MDI 窗体时,MDI 窗体及其所有子窗体将按最小化之前的状态显示出来。,(3)当最大化一个子窗体时,它的标题会与 MDI 窗体的标题组合在一起并显示于 MDI 窗体的标题栏上。(4)通过设定 AutoShowChildren 属性,子窗体可以在窗体加载时自动显示(True)或自动隐藏(False)
24、。,1 MDI窗体特性,(5)活动子窗体的菜单(若有)将显示在 MDI 窗体的菜单栏中,而不是显示在子窗体中。MDI 窗体程序在所谓的“以文档为中心的应用”中特别有用,在这种应用程序中,通常同时使用多个窗口来显示或编辑文档。,1 MDI窗体特性,2 创建MDI应用程序,前面已经学习过,可以通过“添加窗体”对话框添加窗体,但这不是MDI窗体,只是多个普通窗体而已。如果创建一个MDI窗体应用程序,可以按以下步骤执行:(1)在“工程”菜单中单击“添加MDI窗体”菜单项,可以创建MDI应用程序的父窗体。,2 创建MDI应用程序,注意,一个应用程序只能有一个 MDI 窗体,如果工程已经有了一个 MDI窗
25、体,则该“工程”菜单上的“添加 MDI 窗体”命令就不可使用。MDI应用程序的父窗体是子窗体的容器,在该窗体中可以有菜单栏、工具栏、状态栏等,但不可以有文本框等控件。菜单栏、工具栏的建立我们在后面几节中介绍。,(2)如果要创建子窗体,首先在“工程”菜单中单击“添加窗体”菜单项,创建一个普通的窗体,然后将该窗体的 MDIChild 属性设为True。一个应用程序可以包含许多相似或者不同样式的 MDI 子窗体,若要建立多个子窗体,则重复上述操作就可以了。,2 创建MDI应用程序,创建以文档为中心的应用程序,一般要求在运行时能提供若干子窗体以存取不同的文档,而在设计时事先创建好若干个子窗体的方法是不
26、可取的。一般是先创建一个子窗体作为这个应用程序文档的模板,然后通过对象变量来实现。,2 创建MDI应用程序,例 假设已经建立了一个名称为“frmMDIChild”的子窗体模板,则使用下面的语句:Dim NewDoc As New frmMDIChild 就会为“frmMDIChild”建立一个新的实例NewDoc,新实例具有与“frmMDIChild”窗体相同的属性、控件和代码。,2 创建MDI应用程序,在运行时,子窗体显示在 MDI 父窗体工作空间之内(其区域在父窗体边框以内及标题与菜单栏之下)。在设计时,子窗体不是限制在 MDI 窗体区域之内,可以添加控件、设置属性、编写代码以及设计子窗体
27、功能,就像在其它 Visual Basic 窗体中做的那样。,2 创建MDI应用程序,通过查看 MDIChild 属性或者检查工程资源管理器,可以确定窗体是否是一个 MDI 子窗体。Visual Basic 在“工程资源管理器”中为 MDI 窗体与 MDI 子窗体显示了特定的图标,如下图所示。,2 创建MDI应用程序,“工程资源管理器”中的MDI 窗体、MDI 子窗体和标准窗体,例8.7,3 MDI窗体及子窗体,(1)加载MDI窗体及子窗体 加载子窗体时,其父窗体(MDI 窗体)会自动加载并显示。而加载 MDI 窗体时,其子窗体并不会自动加载。子窗体是缺省的启动窗体,因而在程序运行时,子窗体和
28、 MDI 窗体两者都会加载。,MDI 窗体有AutoShowChildren 属性,决定是否自动显示子窗体。如果该属性被设置为True,则当改变子窗体的属性(如Caption等)后,会自动显示该子窗体,不再需要使用Show 方法;,3 MDI窗体及子窗体,如果设置该属性为False,则改变子窗体的属性值后,不会自动显示该子窗体,子窗体处于隐藏状态,直至用Show 方法把它们显示出来。这就允许在子窗体变成可见之前更新标题、位置和菜单等各种细节。,3 MDI窗体及子窗体,(2)设置子窗体的大小和位置 如果 MDI 子窗体具有大小可变的边框即 BorderStyle=2,在其加载时,Windows
29、将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于 MDI 窗体的大小,而不是设计时子窗体的大小。当 MDI 子窗体的边框大小不可变(即 BorderStyle=0、1 或3)时,则它将用设计时的 Height 和 Width 属性被载入。,3 MDI窗体及子窗体,(2)设置子窗体的大小和位置 如果设置 AutoShowChildren 为 False,则在 MDI 子窗体载入以后,把它设为可见状态之前,可以改变其大小和位置。,3 MDI窗体及子窗体,定位窗体的代码最好放在窗体的Load过程中,这样会在窗体实际出现在屏幕上之前将窗体位置确定。要将窗体居中,需要在窗体的
30、Load过程中简单地添加代码来计算并指定窗体左上角的位置,3 MDI窗体及子窗体,如下列代码所示:Me.Left=(Screen.Width-Me.Width)/2 Me.Top=(Screen.Height-Me.Height)/2 利用坐标系统可以将窗体定位于屏幕或MDI窗体的任意位置。,3 MDI窗体及子窗体,(3)MDI窗体程序子窗体的排列顺序和方式 在MDI应用程序中,缺省状态下子窗体是按照窗口打开的顺序排列的:当前活动窗体排在最前端,最先打开的窗体排在最底端。我们可以借助ZOrder方法动态地改变子窗体的排列顺序。,3 MDI窗体及子窗体,(3)MDI窗体程序子窗体的排列顺序和方式
31、 ZOrder方法的语法为:窗体名称.ZOrder Position 其中,Position取值为0时表示对象移至最前端,为1时表示对象移至最底端,缺省时值为0。,3 MDI窗体及子窗体,(3)MDI窗体程序子窗体的排列顺序和方式 例如,某一MDI应用程序有三个子窗体:Form1、Form2和Form3,若要将Form3移至最底端,则可在设计代码时加上 Form3.Zorder 1 即可。,3 MDI窗体及子窗体,利用Zorder方法我们也可以创建浮动窗体,浮动窗体总是浮动到表面,也就是说它可以被其他窗体覆盖,但马上自动变成当前窗口并显示在所有窗体的最上层。,3 MDI窗体及子窗体,要创建浮动
32、窗体,需要在窗体上添加一个定时器控件,并将它的Interval属性设置为想让窗体浮现的时间,如500毫秒。在Timer1_Timer事件过程中编写如下代码,便可以使用Zorder方法使窗体浮动到顶部:Private Sub Timer1_Timer()Zorder End Sub,3 MDI窗体及子窗体,使用过Word的用户都知道,Word可同时打开多个文档,并能以不同方式对文档窗口进行排列,如平铺、层叠等。这种重新排列子窗体的功能,在MDI应用程序中是可以通过编程来实现的。具体方法就是在相应的菜单控件的Click事件中调用Arrange 方法,使用 Arrange 方法可以重新对齐子窗体,可
33、以层叠、水平平铺或者沿着 MDI 窗体的下部排列子窗体图标等方式来显示子窗体。,3 MDI窗体及子窗体,Arrange 方法的语法为:MDI窗体对象.Arrange Arrangement 其中,Arrangement用来指定如何排列MDI应用程序的子窗体,其值可以是常数或是数值,Arrangement的取值如下表所示。,3 MDI窗体及子窗体,表 Arrangement的取值,3 MDI窗体及子窗体,例如:若“平铺”菜单项名为mnuHorizon,可编写如下代码,实现子窗体的平铺:Private Sub mnuHorizon_Click()MDIForm1.Arrange vbTileHor
34、izontal MDIForm1为MDI窗体名称 End Sub,3 MDI窗体及子窗体,当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都像具有可变尺寸边框那样被定位,这使得子窗体可能重叠。即使MDI窗体被最小化,仍可以重新排列窗口和图标,当MDI窗体最大化时,可以看到重排的结果。,3 MDI窗体及子窗体,(4)维护子窗体的状态信息,当子窗体被卸载时,其中的内容也会随之消失,所以在用户决定退出 MDI 应用程序时,必须有保存信息的机会,让用户执行存盘操作,这样才能确保数据不会丢失。当数据没有改变而去存盘是没有意义的,因此,应用程序必须随时都能确定自上次保存以来子窗体中的数据是否有改变。,
35、(4)维护子窗体的状态信息,可以通过在每个子窗体中声明一个公用变量来实现此功能,例如:Public DataChangeed As Boolean 当子窗体中的内容改变时,可将此变量设为True。在保存完数据后,再设为False。,在MDI应用程序中,在关闭应用程序时,Visual Basic 将试图卸载 MDI 窗体,当 MDI 窗体被卸载时,QueryUnload 事件首先为 MDI 窗体调用,然后再为每一个打开的子窗体调用。如果在这些 QueryUnload 事件过程中没有代码,则取消 Unload 事件,然后,每一个子窗体被卸载,最后MDI 窗体被卸载。,(4)维护子窗体的状态信息,由
36、于 QueryUnload 事件在窗体卸载之前被调用,因此在窗体卸载前可以给用户一个保存窗体、文件和一些数据的机会。我们可以在该事件过程中,判断前面声明的那个公用变量标志,然后提示用户是否执行保存操作,也可以在窗体的卸载事件(Unload)中判断此变量标志,这样,在MDI应用程序退出时就不会丢失数据了。,(4)维护子窗体的状态信息,4 MDI窗体的菜单,MDI 应用程序的菜单设计与一般应用程序的菜单设计方法一致,可利用【菜单编辑器】来完成,但MDI 应用程序的菜单还有其特殊性。在 MDI 应用程序中,每一个子窗体的菜单都显示在 MDI 窗体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜
37、单(如果有的话)就代替菜单栏上的 MDI 窗体的菜单。如果没有可见的子窗体,或者带有焦点的子窗体没有菜单,则显示 MDI 窗体的菜单。,4 MDI窗体的菜单,MDI 应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel 只显示“文件”与“帮助”菜单。当用户打开一个文件时,其他菜单就会显示出来,如“文件”、“编辑”、“视图”、“插入”、“格式”、“工具”和“窗口”等。,管理 MDI 应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在 MDI 窗体上,
38、当运行该应用程序时,如果没有可见的子窗体,会自动显示 MDI 窗体菜单。把应用于子窗体的菜单控件放置到子窗体中,在运行时,只要有一个子窗体可见,这些菜单标题就会显示在 MDI 窗体的菜单栏中。,4 MDI窗体的菜单,虽然子窗体的菜单可替代主窗体的菜单,但在编写菜单命令的响应事件的处理时却不相同。在Visual Basic中,只能在本窗体内响应菜单命令,因此主菜单的命令处理只能在主窗体模块中进行,而子窗体的命令处理只能在子窗体模块中进行。即使子窗体的菜单显示在主窗体的菜单位置,但它还是子窗体的菜单。,4 MDI窗体的菜单,有些应用程序支持多种类型的文档。例如,在 Microsoft Access
39、 中,可以打开表格、查询、窗体和其它文档类型。要在 Visual Basic 中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和另一个带有完成图表任务菜单的子窗体。在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时,则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示 MDI 窗体的菜单。,4 MDI窗体的菜单,大多数 MDI 应用程序的菜单栏中都有“窗口”这一特殊菜单项,这是一个显示所有打开的子窗体标题的特殊菜单,如下图所示。另外,有些应用程序将操纵子窗体的命令,比如“层叠”、“平铺”与“排列图标”,也放在这个菜单中。,4 MDI窗体的菜单,4 MDI窗体的菜单,