为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第12章 多重窗体与MDI窗体程序设计

2021-10-16 86页 ppt 662KB 4阅读

用户头像 个人认证

丹丹

暂无简介

举报
第12章 多重窗体与MDI窗体程序设计第12章多重窗体与MDI窗体程序设计多重窗体与MDI窗体概述12.1多重窗体程序设计12.2MDI窗体程序设计12.312.1多重窗体与MDI窗体概述多重窗体是指一个应用程序中有多个并列的普通窗体,每个窗体都是一个对象,可以有属于自己的对象、属性和事件过程,完成不同的功能。MDI窗体,是指一个应用程序(父窗体)中包含多个文档(子窗体),绝大多数基于Windows的大型应用程序都是MDI窗体,如MicrosoftExcel和MicrosoftWord等应用程序都是MDI窗体程序。MDI窗体可以同时打开多个文档,它简化了文档之间的...
第12章  多重窗体与MDI窗体程序设计
第12章多重窗体与MDI窗体程序设计多重窗体与MDI窗体概述12.1多重窗体程序设计12.2MDI窗体程序设计12.312.1多重窗体与MDI窗体概述多重窗体是指一个应用程序中有多个并列的普通窗体,每个窗体都是一个对象,可以有属于自己的对象、属性和事件过程,完成不同的功能。MDI窗体,是指一个应用程序(父窗体)中包含多个文档(子窗体),绝大多数基于Windows的大型应用程序都是MDI窗体,如MicrosoftExcel和MicrosoftWord等应用程序都是MDI窗体程序。MDI窗体可以同时打开多个文档,它简化了文档之间的信息交换。在多重窗体中,窗体分为模态(Modal)和非模态(Nonmodal)两种类型。在屏幕上显示后用户必须响应的窗体叫模态(Modal)窗体,除非用户单击OK(确定)或Cancel(取消)按钮、或者关闭这个窗体,否则这种窗体将一直得到输入焦点。用户可以随意在其间切换的窗体叫非模态(Nonmodal)窗体或无模式窗体。为了方便用户使用,大多数Windows下的应用程序在显示信息时,都使用非模态窗体。因此,在VisualBasic中建立新窗体时,非模态窗体是缺省设置。窗体的很多属性都可以独立设置,其中包括窗体的标题、大小、边框类型、前景颜色、背景颜色、显示字库和背景画面等。MDI窗体允许创建在单个容器窗体中包含多个窗体的应用程序,允许用户同时显示多个文档,每个文档显示在它自己的窗体中。MDI窗体是有父子关系的窗体,可以根据窗体作用的不同,来确定窗体是父窗体还是子窗体。文档或子窗体被包含在父窗体中,父窗体为应用程序中所有的子窗体提供工作空间,用户在父窗体完成几乎所有的工作。例如:MicrosoftExcel允许创建并显示不同样式的多文档窗体,每个子窗体都被限制在Excel父窗体的区域之内。当最小化Excel父窗体时,所有的文档窗体都被最小化,只有父窗体的图标显示在任务栏中。当关闭Excel父窗体时,所有的文档窗体都被关闭,但关闭某个文档窗口时,Excel父窗体不会被关闭。具体什么时候选用单窗体程序,什么时候使用多重窗体或MDI窗体呢?这需要根据应用程序的目的,来决定使用哪种界面样式最好。例如:日历程序最好设成单窗体程序,因为没有必要同时打开一个以上日历;一个处理保险索赔的应用程序可能要设计成MDI窗体,使用多文档界面样式,因为一个职员很可能会同时处理一个以上索赔,或者需要对两个索赔进行比较;而一个管理信息系统(MIS系统),需要完成的功能比较多,比如最基本的功能添加、修改、删除和查询记录等,这些功能的实现都需要窗体界面,而这些窗体一般都是并列使用,所以像学生成绩管理系统这样的应用程序,一般设计成多重窗体程序。12.2多重窗体程序设计在多重窗体程序中,要建立的界面有多个窗体组成,每个窗体的界面的设计与前面学过的完全一样。程序代码也是针对每个窗体编写的,因此也与单一窗体程序设计中的代码编写类似,只要注意各个窗体之间的相互关系就可以了。多重窗体实际上是单一窗体的集合,而单一窗体是多重窗体程序设计的基础。掌握了单一窗体程序的设计,多重窗体的程序设计是很容易的。1.添加窗体如果想在现有的中添加一个窗体,需要使用“添加窗体”对话框(如图12-1所示),可以用三种方法打开“添加窗体”对话框:(1)通过“工程”(Project)菜单中的“添加窗体”(AddForm)命令(2)单击工具栏上的“添加窗体”按钮(3)在“工程资源管理器”窗口内单击右键,在弹出菜单中选择“添加”,再在下一级子菜单中选择“添加窗体”图12-1“添加窗体”对话框“新建”选项卡在“添加窗体”对话框里,可以选择“新建”选项卡新建一个窗体,也可以选择“现存”选项卡把一个属于其他工程的窗体添加到当前工程中,这是因为每个窗体都是以独立的文件保存的(扩展名为frm)。当新建一个窗体时,可以选择欲建立窗体的类型(VisualBasic的不同版本预定义窗体集也不一样),默认是建立一个新的空白窗体,你可以选择建立为特定任务设计的半成品窗体。程序中第一个窗体被默认命名为Form1,后续的窗体则分别命名为Form2、Form3等,为了便于在代码中引用窗体,最好是根据窗体的功能进行重新命名。当添加一个已经存在的窗体到当前工程时,有两个问题需要注意:(1)该工程内的每个窗体的Name属性不能相同,否则不能将现存的窗体添加进来。(2)在该工程内添加进来的现存窗体实际上在多个工程中共享,因此,对该窗体所做的改变,会影响到共享该窗体的所有工程。2.设置启动对象在单一窗体程序中,程序的执行没有其他选择,即只能从这个窗体开始执行。多重窗体程序由多个窗体构成,而且多个窗体多是并列关系,VisualBasic怎么知道是从哪个窗体开始执行呢?程序运行过程中,首先执行的对象被称为启动对象。VisualBasic规定,对于多重窗体程序,必须指定其中一个对象为启动对象。缺省情况下,第一个创建的窗体被默认指定为启动对象,即启动窗体。启动对象既可以是窗体,也可以是Main子过程。如果启动对象是Main子过程,则程序启动时不加载任何窗体,以后由该过程根据不同的情况决定是否加载或加载哪一个窗体。需要注意的是,Main子过程必须放在模块中,绝对不能放在窗体模块内。可以通过“工程”菜单中“工程属性”命令来指定启动对象。执行该命令后,将打开“工程属性”对话框,然后选择该对话框中的“通用”选项卡,将显示的对话框如图12-2所示。图12-2“工程属性”对话框的“通用”选项卡在图12-2所示的对话框中,单击“启动对象”栏右端的箭头,将下拉显示当前工程中所有窗体的列,如图12-3所示。此时条形光标位于当前启动对象上,如果需要改变,则单击作为启动对象的名字,然后单击“确定”按钮,即可把所选择的窗体设置为启动对象。图12-3指定启动对象3.与多重窗体程序设计有关的语句和方法在单窗体程序设计中,所有的操作都在一个窗体中完成,不需要在多个窗体间切换。而在多窗体程序中,需要打开、关闭、隐藏或显示指定的窗体,这可以通过相应的语句和方法来实现。下面是与多重窗体程序设计有关的语句和方法:(1)Load语句该语句把一个在编程环境中已经建立的窗体装入内存。当VisualBasic执行了该语句后,窗体并没有显示出来,只是被调入内存,但你可以在程序中的任一事件过程中访问它,而且使用它所定义的任何属性和方法。用Load语句装入新窗体的语法格式为:Load窗体名称例如,语句:LoadForm2,则工程中的名称为Form2的窗体就会被调入内存。如果想把该窗体的Caption属性设置为“系统主界面”,可在任何事件过程中键入下述语句:Form2.Caption="系统主界面"。在首次使用Load语句将窗体调入内存时依次触发窗体的Initialize和Load事件。(2)Unload语句该语句与Load语句的功能相反,它从内存中删除指定的窗体。该语句的语法格式为:Unload窗体名称Unload的一种常见用法是UnloadMe,其意义是关闭窗体自己。在这里,关键字Me代表UnloadMe语句所在的窗体。(3)Show方法该方法用来显示一个窗体,它兼有加载和显示窗体两种功能。也就是说,使用Show方法时,如果窗体不在内存中(即以前没有执行Load语句),则Show方法自动把窗体装入内存,然后再显示出来。Show方法的语法格式为:[窗体名称.]Show[模式]如果省略了“窗体名称”,则显示当前窗体。参数“模式”用来确定窗体是以模态加载还是非模态加载,它可以取0和1两个值(注意不是False和True)。当“模式”值为1(或常量vbModal)时,表示窗体是“模态型”窗体。在这种情况下,鼠标只在此窗体内起作用,不能到其他窗口内操作,只有在关闭该窗口后才能对其他窗口进行操作。例如,MicrosoftWord中“帮助”菜单的“关于”命令所打开的对话框窗口就是这种窗口。当“模式”值为0(或省略该参数)时,表示窗体为“非模态型”窗口,不用关闭该窗体就可以对其他窗口进行操作。例如,要以非模态窗体形式显示Form2,可使用如下语句:Form2.Show。VisualBasic提供独立的Load语句使程序能够预先将窗体装入内存,这样,Show方法执行得会非常快,用户往往感觉不到任何延迟。建议你最好预先装入窗体,特别是当窗体包含很多对象或艺术修饰时,这样做尤其必要。(4)Hide方法该方法用来将窗体暂时隐藏起来,但并没有从内存中删除,因此它与Unload语句的作用是不一样的。其语法格式为:[窗体名称.]Hide当省略窗体名称时,默认隐藏当前窗体。Hide方法和Unload语句的区别:使用Hide方法把窗体隐藏后,窗体虽然看不见了,但它仍驻留在内存中,可以供程序使用。隐藏窗体和通过设置窗体的Visible属性使窗体不可见的效果是相同的。使用Unload语句卸载窗体,是把窗体从内存中清除,卸载窗体释放了用来存贮窗体对象和图形的内存空间,但并不释放窗体事件过程占用的空间,这些事件过程常驻内存。窗体被卸载后,其运行时的值和属性也就丢失了。当再装入该窗体时,这些值恢复为程序代码中设定的初始值。4.不同窗体间数据的存取不同窗体数据的存取分为两种情况:(1)存取控件中的属性在当前窗体中要存取另一个窗体中某个控件的属性,表示如下:另一个窗体名称.控件名.属性例如,设置当前窗体(Form1)中的文本框(Text1)的值,使它等于另一个窗体(Form2)中的两个文本框(Text1和Text2)的数值之和,实现的语句如下:Text1.Text=Val(Form2.Text1.Text)+Val(Form2.Text2.Text)(2)存取变量的值根据变量的定义位置和所使用的变量定义语句的不同,VisualBasic中的变量可以分为3类,即局部变量、模块变量及全局变量,其中模块变量包括窗体模块变量和标准模块变量。各种变量位于不同的层次。在过程(事件过程或通用过程)内定义的变量叫做局部变量,其作用域是它所在的过程。某一过程的执行只对该过程内的变量产生作用,对其他过程中相同名字的局部变量没有任何影响。因此,可以在不同的过程中定义相同名字的局部变量,它们之间没有任何关系。对于局部变量,可以使用Dim或Static语句声明,也可以在需要时直接给出变量名。变量的类型可以使用类型说明符标识。如果没有类型说明符,VisualBasic把该变量指定为变体数据类型。窗体变量可用于该窗体内的所有过程。一个窗体可以包含若干个过程,当同一窗体内的不同过程使用相同的变量时,则可以使用窗体变量。在使用窗体变量前,必须先声明,也就是说窗体变量不能默认声明。其方法是在程序代码窗口的“对象”框中选择“通用”,并在“过程”框中选择“声明”。声明的时候,可以使用Dim、Private或Public语句。标准模块变量与窗体变量是类似,这里不在叙述。全局变量的作用域最大,可以在工程的每个模块、每个过程使用。和模块级变量类似,全局变量也在“通用”部分声明。所不同的是,全局变量必须用Public或Global语句声明,不能用Dim语句声明,更不能用Private语句声明。同时,全局变量只能在标准模块中声明,不能在过程或窗体模块中声明。在应用程序中任何地方都可以修改全局变量,因此使用全局变量要格外小心,特别是在没有强制要求定义变量的情况下。我们在多个窗体之间存取变量时,变量必须是窗体级变量,先用Public语句声明,其引用格式如下:窗体名称.变量名例如,工程中有两个窗体(Form1和Form2),在Form1的“通用”里这样声明一个变量:PublictestAsString。则在Form2中的就可以这样引用Form1中的变量:a=Form1.test为了方便起见,要在多个窗体中存取的变量一般放在一个标准模块内,用Public语句或Global语句声明成全局变量。5.多重窗体程序设计举例例12-1(参看教材P228-230)例12-2(参看教材P230-232)12.3MDI窗体程序设计12.3.1MDI窗体特性12.3.2创建MDI应用程序12.3.3MDI窗体及子窗体12.3.4MDI窗体的菜单和工具栏设计12.3.5使用VB应用程序向导MDI窗体程序由父窗口和子窗口组成,父窗口又称为MDI窗体,它被作为子窗口的容器。子窗口又称为文档窗口,它用于显示各个文档,所有的子窗口都具有相同的功能。12.3.1MDI窗体特性在运行时,MDI窗体及其所有的子窗体都呈现特定的性质:(1)所有子窗体均显示在MDI窗体的工作空间内。像其它的窗体一样,用户能移动子窗体和改变子窗体的大小,不过,它们被限制于这一工作空间内。(2)当最小化一个子窗体时,它的图标将显示于MDI窗体上而不是在任务栏中。当最小化MDI窗体时,此MDI窗体及其所有子窗体将由一个图标来代表。当还原MDI窗体时,MDI窗体及其所有子窗体将按最小化之前的状态显示出来。(3)当最大化一个子窗体时,它的标题会与MDI窗体的标题组合在一起并显示于MDI窗体的标题栏上。(4)通过设定AutoShowChildren属性,子窗体可以在窗体加载时自动显示(True)或自动隐藏(False)。(5)活动子窗体的菜单(若有)将显示在MDI窗体的菜单栏中,而不是显示在子窗体中。MDI窗体程序在所谓的“以文档为中心的应用”中特别有用,在这种应用程序中,通常同时使用多个窗口来显示或编辑文档。12.3.2创建MDI应用程序前面已经学习过,可以通过“添加窗体”对话框添加窗体,但这不是MDI窗体,只是多个普通窗体而已。如果创建一个MDI窗体应用程序,可以按以下步骤执行:(1)在“工程”菜单中单击“添加MDI窗体”菜单项,可以创建MDI应用程序的父窗体。注意,一个应用程序只能有一个MDI窗体,如果工程已经有了一个MDI窗体,则该“工程”菜单上的“添加MDI窗体”命令就不可使用。MDI应用程序的父窗体是子窗体的容器,在该窗体中可以有菜单栏、工具栏、状态栏等,但不可以有文本框等控件。菜单栏、工具栏的建立我们在后面几节中介绍。(2)如果要创建子窗体,首先在“工程”菜单中单击“添加窗体”菜单项,创建一个普通的窗体,然后将该窗体的MDIChild属性设为True。一个应用程序可以包含许多相似或者不同样式的MDI子窗体,若要建立多个子窗体,则重复上述操作就可以了。不过,创建以文档为中心的应用程序,一般要求在运行时能提供若干子窗体以存取不同的文档,而在设计时事先创建好若干个子窗体的方法是不可取的。一般是先创建一个子窗体作为这个应用程序文档的,然后通过对象变量来实现。例如,假设已经建立了一个名称为“frmMDIChild”的子窗体模板,则使用下面的语句:DimNewDocAsNewfrmMDIChild就会为“frmMDIChild”建立一个新的实例NewDoc,新实例具有与“frmMDIChild”窗体相同的属性、控件和代码。在运行时,子窗体显示在MDI父窗体工作空间之内(其区域在父窗体边框以内及标题与菜单栏之下)。在设计时,子窗体不是限制在MDI窗体区域之内,可以添加控件、设置属性、编写代码以及设计子窗体功能,就像在其它VisualBasic窗体中做的那样。通过查看MDIChild属性或者检查工程资源管理器,可以确定窗体是否是一个MDI子窗体。VisualBasic在“工程资源管理器”中为MDI窗体与MDI子窗体显示了特定的图标,如图12-10所示。图12-10“工程资源管理器”中的MDI窗体、MDI子窗体和标准窗体例12-3(参看教材P234-236)12.3.3MDI窗体及子窗体1.加载MDI窗体及子窗体加载子窗体时,其父窗体(MDI窗体)会自动加载并显示。而加载MDI窗体时,其子窗体并不会自动加载。在例12.3中,子窗体是缺省的启动窗体,因而在程序运行时,子窗体和MDI窗体两者都会加载。如果在应用程序中改变启动窗体为MDIForm1,然后运行应用程序,则只有MDI窗体被加载。当从“文件”菜单中选取“新建”命令时,才会加载第一个子窗体。MDI窗体有AutoShowChildren属性,决定是否自动显示子窗体。如果该属性被设置为True,则当改变子窗体的属性(如Caption等)后,会自动显示该子窗体,不再需要使用Show方法;如果设置该属性为False,则改变子窗体的属性值后,不会自动显示该子窗体,子窗体处于隐藏状态,直至用Show方法把它们显示出来。这就允许在子窗体变成可见之前更新标题、位置和菜单等各种细节。2.设置子窗体的大小和位置如果MDI子窗体具有大小可变的边框〔即BorderStyle=2〕,在其装载时,Windows将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于MDI窗体的大小,而不是设计时子窗体的大小。当MDI子窗体的边框大小不可变(即BorderStyle=0、1或3)时,则它将用设计时的Height和Width属性被载入。如果设置AutoShowChildren为False,则在MDI子窗体载入以后,把它设为可见状态之前,可以改变其大小和位置。定位窗体的代码最好放在窗体的Load过程中,这样会在窗体实际出现在屏幕上之前将窗体位置确定。要将窗体居中,需要在窗体的Load过程中简单地添加代码来计算并指定窗体左上角的位置,如下列代码所示:Me.Left=(Screen.Width-Me.Width)/2Me.Top=(Screen.Height-Me.Height)/2利用坐标系统可以将窗体定位于屏幕或MDI窗体的任意位置。3.MDI窗体程序子窗体的排列顺序和方式在MDI应用程序中,缺省状态下子窗体是按照窗口打开的顺序排列的:当前活动窗体排在最前端,最先打开的窗体排在最底端。我们可以借助ZOrder方法动态地改变子窗体的排列顺序。ZOrder方法的语法为:窗体名称.ZOrder[Position]其中,Position取值为0时表示对象移至最前端,为1时表示对象移至最底端,缺省时值为0。例如,某一MDI应用程序有三个子窗体:Form1、Form2和Form3,若要将Form3移至最底端,则可在设计代码时加上Form3.Zorder1即可。利用Zorder方法我们也可以创建浮动窗体,浮动窗体总是浮动到表面,也就是说它可以被其他窗体覆盖,但马上自动变成当前窗口并显示在所有窗体的最上层。要创建浮动窗体,需要在窗体上添加一个定时器控件,并将它的Interval属性设置为想让窗体浮现的时间,如500毫秒。在Timer1_Timer事件过程中编写如下代码,便可以使用ZOrder方法使窗体浮动到顶部:PrivateSubTimer1_Timer()ZOrderEndSub使用过Word的用户都知道,Word可同时打开多个文档,并能以不同方式对文档窗口进行排列,如平铺、层叠等。这种重新排列子窗体的功能,在MDI应用程序中是可以通过编程来实现的。具体方法就是在相应的菜单控件的Click事件中调用Arrange方法,使用Arrange方法可以重新对齐子窗体,可以层叠、水平平铺或者沿着MDI窗体的下部排列子窗体图标等方式来显示子窗体。Arrange方法的语法为:MDI窗体对象.ArrangeArrangement其中,Arrangement用来指定如何排列MDI应用程序的子窗体,其值可以是常数或是数值,Arrangement的取值如表12-2所示。表12-2Arrangement的取值重排最小化MDI子窗体的图标3vbArrangeIcons垂直平铺所有非最小化MDI子窗体2vbTileVertical水平平铺所有非最小化MDI子窗体1vbTileHorizontal层叠所有非最小化MDI子窗体0vbCascade描述值常数例如:若“平铺”菜单项名为mnuHorizon,可编写如下代码,实现子窗体的平铺:PrivateSubmnuHorizon_Click()MDIForm1.ArrangevbTileHorizontal'MDIForm1为MDI窗体名称EndSub当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都像具有可变尺寸边框那样被定位,这使得子窗体可能重叠。即使MDI窗体被最小化,仍可以重新排列窗口和图标,当MDI窗体最大化时,可以看到重排的结果。4.维护子窗体的状态信息当子窗体被卸载时,其中的内容也会随之消失,所以在用户决定退出MDI应用程序时,必须有保存信息的机会,让用户执行存盘操作,这样才能确保数据不会丢失。当数据没有改变而去存盘是没有意义的,因此,应用程序必须随时都能确定自上次保存以来子窗体中的数据是否有改变。这可以通过在每个子窗体中声明一个公用变量来实现此功能,例如:PublicDataChangeedAsBoolean当子窗体中的内容改变时,可将此变量设为True。在保存完数据后,再设为False。在MDI应用程序中,在关闭应用程序时,VisualBasic将试图卸载MDI窗体,当MDI窗体被卸载时,QueryUnload事件首先为MDI窗体调用,然后再为每一个打开的子窗体调用。如果在这些QueryUnload事件过程中没有代码,则取消Unload事件,然后,每一个子窗体被卸载,最后MDI窗体被卸载。由于QueryUnload事件在窗体卸载之前被调用,因此在窗体卸载前可以给用户一个保存窗体、文件和一些数据的机会。我们可以在该事件过程中,判断前面声明的那个公用变量标志,然后提示用户是否执行保存操作,也可以在窗体的卸载事件(Unload)中判断此变量标志,这样,在MDI应用程序退出时就不会丢失数据了。5.显示所有已打开子窗体标题如果想要实现这一功能,只要在设计MDI窗体及子窗体时的“窗口”菜单时,将WindowList属性设置为True(即选中该复选框)即可。在运行时,VisualBasic自动管理与显示标题清单,并在当前正有焦点的标题旁边显示一个复选标志。另外,还在窗口清单的上方自动放置一个分隔符条。WindowList属性在运行时是只读的,只能在设计时设置。只能将菜单栏中的某一个菜单的WindowList属性设置为True,打开窗口的列表只出现在WindowList属性设置为True的菜单对象中,如果单击窗口列表中的某一个窗体名称,就可以激活那个窗体。12.3.4MDI窗体的菜单和工具栏设计MDI应用程序的菜单设计与一般应用程序的菜单设计方法一致,可利用【菜单编辑器】来完成,但MDI应用程序的菜单还有其特殊性。在MDI应用程序中,每一个子窗体的菜单都显示在MDI窗体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单(如果有的话)就代替菜单栏上的MDI窗体的菜单。如果没有可见的子窗体,或者带有焦点的子窗体没有菜单,则显示MDI窗体的菜单。MDI应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,MicrosoftExcel只显示“文件”与“帮助”菜单。当用户打开一个文件时,其他菜单就会显示出来,如“文件”、“编辑”、“视图”、“插入”、“格式”、“工具”和“窗口”等。管理MDI应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在MDI窗体上,当运行该应用程序时,如果没有可见的子窗体,会自动显示MDI窗体菜单。把应用于子窗体的菜单控件放置到子窗体中,在运行时,只要有一个子窗体可见,这些菜单标题就会显示在MDI窗体的菜单栏中。虽然子窗体的菜单可替代主窗体的菜单,但在编写菜单命令的响应事件的处理时却不相同。在VisualBasic中,只能在本窗体内响应菜单命令,因此主菜单的命令处理只能在主窗体模块中进行,而子窗体的命令处理只能在子窗体模块中进行。即使子窗体的菜单显示在主窗体的菜单位置,但它还是子窗体的菜单。有些应用程序支持多种类型的文档。例如,在MicrosoftAccess中,可以打开、查询、窗体和其它文档类型。要在VisualBasic中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和另一个带有完成图表任务菜单的子窗体。在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时,则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示MDI窗体的菜单。大多数MDI应用程序的菜单栏中都有“窗口”这一特殊菜单项,这是一个显示所有打开的子窗体标题的特殊菜单,如图12-12所示。另外,有些应用程序将操纵子窗体的命令,比如“层叠”、“平铺”与“排列图标”,也放在这个菜单中。图12-12VisualBasic中的“窗口”菜单工具栏(也称为发条或者控制栏)已经成为许多基于Windows的应用程序的标准功能,它提供了应用程序中最常用的功能。利用工具栏可以对应用程序中最常用的命令快速访问,还可以进一步增强应用程序的界面。创建工具栏的方法有两种:手工创建或使用ToolBar等控件创建。1.手工创建工具栏手工创建工具栏是利用图片框和命令按钮或图像框控件制作,比较烦琐。具体步骤如下:(1)在MDI窗体上放置一个图片框(PictureBox)控件,并设置其Align属性,通常Align属性可以设置为1或2。当Align属性值为1时,图片框的宽度会沿MDI窗体顶端自动伸展,直到填满MDI窗体工作空间;当Align属性值为2时,图片框的宽度会沿MDI窗体底端自动伸展,直到填满MDI窗体工作空间。工作空间就是窗体边框以内的区域,不包括标题条、菜单栏或所有的工具栏、状态栏或者可能在窗体上的滚动条。前面我们说过,只能把那些直接支持Align属性的控件放置在MDI窗体上,而图片框是支持这一属性的唯一的标准控件。(2)在图片框中,可以放置任何想在工具栏上显示的控件。典型地,用命令按钮或Image控件来创建工具栏按钮。要在图片框中添加控件,单击工具栏中的控件按钮,然后在图片框中画出它。(3)设置设计时属性。使用工具栏的一个好处是可以显示一个形象的命令图示,Image控件是作为工具栏按钮的一个很好的选择,因为可以用它来显示一个位图。在设计时设置其Picture属性来显示一个位图,再通过设置工具栏按钮的ToolTipText属性,实现自动提示功能。设置工具栏按钮的ToolTipText属性后,运行时当用户把鼠标指针停留在该按钮上时,就可以自动显示ToolTipText属性的内容。(4)调整各工具栏按钮的位置和大小(也可以在Form_Load事件过程中编程实现)。(5)编写各工具栏按钮的代码。因为工具栏频繁地用于提供访问某些应用程序命令的快捷方法,因而在大部分时间内都是在按钮的Click事件中调用其它过程。例如,在VisualBasic的工具栏上的“保存”按钮,它的功能和“文件”菜单中“保存工程”菜单项的功能完全一样。与其把这些功能代码重复两次,还不如把代码放到窗体的一个公用过程中,然后在上面的任何一个事件过程调用这个过程。图12-13是一个含有Image控件的工具栏。图12-13手工创建的工具栏2.使用ToolBar和ImageList控件创建工具栏使用ToolBar控件创建工具栏非常容易且很方便,它在VisualBasic的专业版与企业版中是可用的。使用这种方法创建工具栏比手工创建要方便得多,而且外形更美观,更接近于Windows的风格。ToolBar控件包含用来创建工具栏的按钮对象的集合,也就是显示在工具栏上的一组按钮。每个按钮对象都可有图像、标题和提示,其中图像是由相关的ImageList控件所提供。使用ToolBar和ImageList控件来创建工具栏的步骤如下:(1)鼠标右键单击工具箱,选“部件”命令,打开“部件”对话框(也可以在“工程”菜单中选择“部件”菜单项打开)。单击“部件”对话框的“控件”选项卡,在控件的列表里选中“MicrosoftWindowsControls6.0”复选框,将ToolBar和ImageList等控件添加到工具箱,新添加的控件如图12-14所示。图12-14工具箱(2)分别双击ToolBar和ImageList控件,把它们添加到窗体上。(3)设置ImageList控件的属性。ImageList控件不单独使用,专门为其他控件提供图像库,是一个图像容器控件。工具栏按钮的图像就是通过ToolBar控件从ImageList控件的图像库中获得的。用鼠标右键单击ImageList控件,选择“属性”命令,可以打开“属性页”对话框,在“属性页”对话框里设置ImageList控件的属性。该对话框包括三个选项卡:通用、图像和颜色。其中“通用”选项卡用于设置图片大小,“图像”选项卡用于插入图片,“图像”选项卡如图12-15所示。图12-15ImageList控件的“图像”选项卡在“图像”选项卡中,单击“插入图片”按钮,选择希望作为工具栏按钮图标的图片,图像文件的扩展名为.ico、.bmp、.gif、.jpg等。插入图片后,“索引”框将从1开始,按插入顺序自动编号,此编号与ToolBar控件属性页中“按钮”选择项的“图像”框中的数字相对应,“图像”框中的数字为1,则工具栏上该按钮的图标就是ImageList控件中索引值为1的图片。“关键字”表示每个图像的标识名,可以在ToolBar控件中引用。“删除图片”按钮,用于删除选中的图片。“图像数”表示已经插入的图像数目。(4)右键单击ToolBar控件,选择“属性”,打开ToolBar控件的属性页对话框。它也有三个选项卡:通用、按钮和图片。单击“通用”选项卡,在“图像列表”下拉框中选择所需要的ImageList控件,建立ImageList控件与ToolBar控件间的关联,如图12-16所示。图12-16ToolBar控件的“通用”选项卡在“样式”下拉框中可以选择工具栏的不同样式:0-tbrStandard型或1-tbrFlat型。0-tbrStandard型工具栏按钮呈突出状,单击时有按下并弹起的效果;1-tbrFlat型则呈平面,当鼠标移至按钮上方时,按钮突出显示,与Windows95下的工具栏按钮风格类似。“可换行的”复选框被选中表示当工具栏的长度不能容纳所有工具按钮时,在下一行显示,如个不选中该复选框,则当工具栏的长度不能容纳所有工具按钮时,剩余的就不再显示。切换到“按钮”选项卡,如图12-17所示。最开始只有“插入按钮”一项可用,其余选项要在插入按钮后方可使用。其中有三个属性值得注意:样式、工具提示文本和图像。工具提示文本属性用于设置提示文本以实现自动提示功能。图像属性只有在“通用”选项卡中设置里“图像列表”属性后才可用,它分别设置各个工具按钮的图像。样式属性决定按钮的行为,其值如表12-3所示。图12-17ToolBar控件的“按钮”选项卡表12-3“样式”属性的取值具有下拉菜单的工具按钮,其下拉菜单可通过“按钮”选项卡下端的“插入按钮菜单”命令按钮来添加。5tbrDropdown占位符样式按钮的功能如同“哑”按钮,该按钮的作用是在ToolBar控件中占据一定位置,以便显示其他控件(如ComboBox控件或ListBox控件)。例如,Word中的选择字体框4tbrPlaceholder分隔符类型只是创建宽度为8个像素的按钮,此外没有任何功能。该类型的按钮可以将其他按钮分隔开,或者将tbrButtonGrop样式的按钮封闭起来。3tbrSeparator当一组功能相互排斥时,可以使用该样式。相互排斥的意思是说一组功能同时只能有一个有效。例如,Word工具栏的文字对齐按钮,在任何时刻只能按下一个按钮。注意:同意时刻只能按下一个按钮,但所有按钮可能同时处于抬起状态。2TbrButtonGrop当按钮代表的功能是某种开关类型时,可使用该样式。例如,Word工具栏中的“加粗”按钮。1tbrCheck如果按钮所代表的功能不依赖于其他功能,其按钮被按下,在完成功能后它会自动地弹起,这时使用该样式。0tbrDefault描述值常数(5)分别为工具栏按钮编写代码。图12-18是使用ToolBar和ImageList控件创建的工具栏。图12-18使用ToolBar和ImageList控件创建的工具栏12.3.5使用VB应用程序向导VisualBasic6.0新增了“VB应用程序向导”功能,它能够帮助用户生成多文档界面、单文档界面以及资源管理器方式的界面。根据向导中的友好提示,用户只需做出简单的选择,就可以生成漂亮实用的应用程序界面。界面生成以后,还可根据实际情况,对界面的内容以及代码的内容进行修改、添加等操作。本节将介绍用“VB应用程序向导”创建MDI应用程序。执行“文件”菜单中的“新建工程”菜单项,可以打开“新建工程”对话框,从中选择“VB应用程序向导”,如图12-19所示,然后单击“确定”按钮。图12-19“新建工程”对话框单击“确定”按钮后,就会出现如图12-20所示的对话框。在这个对话框中,向用户简要介绍了“VB应用程序向导”的功能和使用方法。图12-20应用程序向导—介绍单击“下一步”按钮,就会出现选择应用程序界面类型的对话框,如图12-21所示。在这个对话框中,用户可以选择生成应用程序的界面类型。它有三个单选项,分别用来生成多文档应用程序、单文档应用程序和资源管理器样式的应用程序。在这里,我们选择第一项,以便生成MDI应用程序。图12-21应用程序向导—界面类型然后再单击“下一步”按钮,就会出现选择菜单和子菜单项的对话框,如图12-22所示。应用程序向导提供了文件、编辑、视图、工具、窗口和帮助六个菜单名,每个菜单名下有若干菜单项。用户可以自由地选择、取消菜单名或菜单项,由此,应用程序向导替用户省去了编辑菜单的时间。图12-22应用程序向导—菜单继续单击“下一步”按钮,就会出现自定义工具栏的对话框,如图12-23所示。应用程序向导提供了的工具栏有13个按钮,用户也可以根据需要增加(右移所选按钮)或删除(左移所选按钮)按钮。图12-23应用程序向导—自定义工具栏继续单击“下一步”按钮,出现的对话框询问用户是否为应用程序中的字符使用资源文件,一般情况下选择“否”单选按钮。继续“下一步”,出现Internet连接对话框,在该对话框中,可以选择是否希望用户从应用程序中访问Internet。若选中,可生成一个小型的Web浏览器。应用程序向导还提供了加入其他窗体的功能,这可使应用程序更完美,如图12-24所示。此外应用程序向导还提供了与数据库的链接等功能。图12-24应用程序向导—标准窗体最后,显示一个“已创建应用程序”对话框,如图12-25所示,单击“确定”就可以生成MDI应用程序。图12-25应用程序向导—已创建应用程序说明:(1)在使用应用程序向导的过程中,任何时候单击“完成”按钮,表示以默认的方式快速生成应用程序。(2)生成应用程序主要是节省了用户设计界面的工作量,这仅仅是完成了应用程序的框架,很多过程还是要用户根据实际问题来加以完善。(3)在生成的应用程序中,我们可以使用【菜单编辑器】重新设计菜单,还可以使用用我们前面介绍的方法重新设置ToolBar控件和ImageList控件的属性,更改工具栏按钮和按钮的图标。(4)生成的应用程序中,许多菜单项和工具栏按钮的代码还没有设计,需要我们添加程序代码,而有些代码还需要我们根据应用程序的目的进行修改。
/
本文档为【第12章 多重窗体与MDI窗体程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索