[VB.NET]单元四 窗体编程
单元四 窗体编程 [学习目标]掌握菜单、工具栏和状态栏的设计、创建和使用,理解单文档(SDI)应用程序界面和多文档(MDI)应用程序界面的概念,掌握多文档(MDI)应用程序的设计。 一个典型的Windows应用程序必然包含菜单、工具栏和状态栏,用户通过单击菜单中的菜单项,来实现应用程序所提供的功能,用户也可以通过单击工具栏上的工具按钮,来实现应用程序中的常用的主要功能,状态栏主要用于显示应用程序当前的状态等信息。菜单、工具栏和状态栏的使用,可以使应用程序的界面友好,方便用户的使用。 本单元分别通过相应的实例来讲述菜单、工具栏和状态栏的使用,结合多文档(MDI)应用程序的设计,对本章的内容作一个综合的应用。 4.1 窗体设计 [案例4-1] 部分常用的窗体属性的测试程序 VB.NET的窗体与VB的窗体相比,增加了许多新的功能,本案例即是测试窗体的各种属性。 [技能目标] 1. 掌握Windows窗体的组成与形态。 2. 能根据各种不同的需要,通过对窗体不同属性的设置来实现窗体的不同行为。 图4-1 窗体属性的测试 [操作要点与步骤] 本程序在窗体上建立了八个命令按钮,来测试窗体的若干个具有一定代表性的属性。窗体的TopMost属性用来表示当前窗体与其它窗体的关系,当窗体的TopMost属性值为"True"时,该窗体总在最前面;当窗体的TopMost属性值为"False"时,只有活动窗体在最前面。窗体的FormBorderStyle属性用来表示窗体的边框类型,当窗体的FormBorderStyle属性值为"Fixed3D"时,该窗体的边框为固定大小的三维立体边框;当窗体的FormBorderStyle属性值为"Sizable"时,该窗体的边框为默认边框,可通过鼠标拖曳窗体边框来改变窗体大小。窗体的Opacity属性用来表示窗体的透明度,取值范围为0到1,当窗体的Opacity属性值为0时,表示该窗体透明;当窗体的Opacity属性值为1时,表示该窗体不透明。窗体的Width属性用表示窗体的宽度,窗体的Height属性用来表示窗体的高度。 Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button1.Click Me.TopMost = True End Sub Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button2.Click Me.TopMost = False End Sub Private Sub Button3_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button3.Click Me.FormBorderStyle = FormBorderStyle.Fixed3D End Sub Private Sub Button4_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button4.Click Me.FormBorderStyle = FormBorderStyle.Sizable End Sub Private Sub Button5_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button5.Click Me.Size = New Size(Me.Size.Width + 10,Me.Size.Height + 10) End Sub Private Sub Button6_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button6.Click Me.Size = New Size(Me.Size.Width - 10,Me.Size.Height - 10) End Sub Private Sub Button7_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button7.Click Me.Opacity = Me.Opacity - 0.1 End Sub Private Sub Button8_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Button8.Click Me.Opacity = Me.Opacity + 0.1 End Sub [相关知识] 在VB.NET中窗体也是一个对象,它有自己的属性、事件和方法,并提供了面向对象的可扩展的类集。 窗体是Windows应用程序在屏幕上的外在表现形式,外观通常是一个矩形,它用来接受用户输入并显示显示信息。窗体可以分为标准窗体、MDI窗体、对话框等。最简单的定义窗体用户界面的方法就是直接将控件放到窗体中,通过设置窗体和控件的属性、事件响应代码,来实现程序的功能。 窗体对象是VB.NET应用程序的基本构造模块,是用户运行应用程序时人机交互操作的实际窗口。窗体有自己的属性、事件和方法用于控制窗体的外观和行为。窗体是包含所有组成程序的用户界面的对象。 1. 窗体的属性 通过设置窗体的属性来改变窗体的外观和执行一些窗体操作。设置窗体属性可以在设计阶段通过属性窗口进行设置,也可以在运行阶段通过代码来进行窗体属性的设置。运行后不再改变的窗体属性通常在窗体设计阶段进行设置,而在运行后需要改变的窗体属性通常在程序运行阶段通过代码来进行窗体属性的设置。任何对窗体的引用都需要使用窗体名称。窗体名称只能在设计阶段设置窗体对象名称,不能在程序代码中修改窗体名称。 窗体的常用属性如表4-1所示。 表4-1 窗体属性 属性名 描 述 Name 标识窗体的名称 Text 设置窗体标题栏上显示的内容 Enable 决定窗体对象是否允许操作。True:允许用户操作;False:禁止用户操作,窗体对象呈暗淡色 Visible 决定窗体对象是否可见,只在运行阶段起作用 Size 窗体对象的高度和宽度,代码设置格式为: 窗体对象名称.Size.Width=窗体宽度值 窗体对象名称.Size.Height=窗体高度值 Location 决定窗体对象的左上角的位置,代码设置: 窗体对象名称.Location=new Point(x,y) Font 决定窗体对象的字体 ControlBox 决定是否在窗体对象的标题栏上显示有关控制框 FormBorderStyle 决定窗体对象边框的外观 MaximizeBox MinimizeBox 决定在窗体对象上是否有最大化或最小化按钮 Startposition 决定窗体对象第一次出现的位置 WindowState 决定窗体对象在运行时的状态。属性值为: Normal:缺省值; Maximized:最大化; Minimized:最小化(以图标方式运行) BackColor 决定窗体对象的背景 在进行窗体透明度设计时,通常不要将窗体的透明度设置为0,当窗体的透明度为0时,将无法对该窗体中的对象进行相关操作。 2. 窗体的事件 窗体事件是指发生在窗体对象上的动作。常用的窗体事件: (1)Load 当窗体对象被首次运行时发生的事件。 (2)Activated 当窗体对象被激活时发生的事件。 (3)Paint 当窗体对象被显示时发生的事件。 (4)GotFocus 当窗体对象获得焦点时发生的事件。 (5)LostFocus 当窗体对象失去焦点时发生的事件。 (6)Click 当窗体对象被单击时发生的事件。 (7)DbClick 当窗体对象被双击时发生的事件。 (8)Closed 当窗体对象被关闭时发生的事件。 如果在VB.NET项目中包含了多个窗体,则必须指定一个窗体为启动窗体(默认的启动窗体为项目中第一个建立的窗体)。指定的启动窗体将会是在程序运行时第一个加载的窗体。通常使用"项目"→"***属性"→"启动对象",选择启动对象,完成启动窗体的设置。 4.2 菜单的制作 菜单是Windows界面的重要组成部分,VB.NET菜单的形式丰富,功能强大。菜单按使用形式可分为下拉式菜单和弹出式菜单两种。下拉式菜单通常位于窗体的顶部,弹出式菜单是独立于窗体菜单栏而显示在窗体内的浮动菜单。 [案例4-2]部分常用的窗体属性的测试程序(增加菜单方式) [技能目标] 1. 掌握菜单的结构与组成。 2. 能根据应用程序的功能规划、设计一般的菜单。 图4-2 窗体属性的测试程序(增加菜单栏)界面 图4-3 窗体属性的测试程序的弹出菜单 (a) (b) (c) (d) (e) 图4-4 窗体属性的测试程序的下拉菜单 [开发步骤] 下拉式菜单的设计操作步骤: 1. 启动或打开相关项目 2. 添加MainMenu控件 在"工具箱"中找到并双击MainMenu控件,即向窗体添加了一个菜单对象。 3. 建立菜单和菜单项 在窗体中添加了MainMenu控件对象,即向窗体添加了一个菜单对象。菜单对象显示内容为"请在此输入"。单击文本"请在此输入",输入菜单名称。在已输入菜单的下方和右方出现"请在此输入"菜单框,按设计要求完成菜单的设计。 4. 设置各菜单和菜单项的属性 本例各菜单和菜单项和设置见表4-2。 5. 输入各菜单项的代码 双击已建立的菜单项,进入相关菜单项的代码段,输入完成该项菜单项功能的代码。 [代码分析] 本实例是在上一节程序内容的基础上,增加了相应的菜单(包括下拉菜单和弹出菜单)来实现相关功能。并增加了一个退出菜单项。 本程序在原有程序的基础上增加了相应的窗体菜单来实现相关的功能。 在程序中增加了退出功能。用"close()"命令来关闭窗体退出程序,可以触发窗体对象的Close事件。部分常用的窗体属性的测试程序代码(仅实现菜单功能部分代码) Private Sub MenuItem6_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)_ Handles MenuItem6.Click Me.Close() End Sub Private Sub MenuItem8_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem8.Click Me.TopMost = False End Sub Private Sub MenuItem12_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem12.Click Me.Size = New Size(Me.Size.Width - 10,Me.Size.Height - 10) End Sub Private Sub MenuItem7_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem7.Click Me.TopMost = True End Sub Private Sub MenuItem9_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem9.Click Me.Opacity = Me.Opacity - 0.1 End Sub Private Sub MenuItem10_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem10.Click Me.Opacity = Me.Opacity + 0.1 End Sub Private Sub MenuItem11_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem11.Click Me.Size = New Size(Me.Size.Width + 10,Me.Size.Height + 10) End Sub Private Sub MenuItem13_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem13.Click Me.FormBorderStyle = FormBorderStyle.Fixed3D End Sub Private Sub MenuItem14_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem14.Click Me.FormBorderStyle = FormBorderStyle.Sizable End Sub 本实例中各菜单和菜单项的属性设置如表4-2所示。 表4-2 菜单项属性设置 Name Text Shortcut MenuItem1 程序(&G) MenuItem2 窗体位置(&P) MenuItem3 窗体透明度(&O) MenuItem4 窗体大小(&S) MenuItem5 窗体边框(&B) MenuItem6 退出(&X) CtrlX MenuItem7 窗体总在最前面(&F) MenuItem8 活动窗体在最前面(&A) MenuItem9 增加透明度(&A) MenuItem10 降低透明度(&D) MenuItem11 增加窗体尺寸(&A) MenuItem12 减小窗体尺寸(&D) MenuItem13 FIXED3D边框(&F) MenuItem14 SIZEABLE边框(&S) 菜单快捷键可以在菜单项不可见的情况下使用; 菜单热键只有在所对应的菜单或菜单项可见的情况下可用; [相关知识] 下面以VB.NET的环境为例来说明有关菜单的若干个基本概念。 图4-5 菜单实例 1. 菜单 菜单有下拉式菜单和弹出式菜单两种类型。 图4-5中的"程序"、"窗体位置"、窗体透明度等都是下拉式菜单,这种类型的菜单通常以菜单栏的形式出现在窗体的顶端,当单击菜单栏中的每个菜单时,则下拉出该项菜单的所有菜单项。图4-5中,鼠标单击了菜单栏中的"程序"菜单,下拉出了"程序"菜单中的所有菜单项,供用户进一步选取。如果某个菜单项右侧有一个黑色三角,就表示该菜单项为一个子菜单,当单击该子菜单时,将会展开其所对应的所有菜单项。 2. 菜单栏 图4-5中窗体标题栏下面"程序"、"窗体位置"等菜单所在的区域为菜单栏。 3. 菜单项 菜单项,也称为菜单命令,是菜单中的最小值单位,单击菜单项就执行菜单项所对应的相关命令。图4-5中的"退出"是"程序"菜单中的菜单项,当鼠标单击"退出"菜单项时,就执行"退出"菜单项所对应的相关命令。 4. 菜单热键 图4-5中的"程序"菜单右侧的"G"就是"程序"菜单的热键,"退出"菜单项右侧的"X"为"退出"菜单项的热键。当程序运行后,用户按下Alt+G组合键,等效于鼠标单击"程序"菜单,再按Alt+X组合键,等效于用鼠标单击"退出"菜单项。 5. 菜单快捷键 图4-5中,"程序"下拉菜单中的"退出"菜单项最右侧的Ctrl+X就是菜单快捷键。当用户按Ctrl+X组合键等效于用户用鼠标单击"退出"菜单项。 6. 子菜单 当菜单项的右侧出现黑色三角时,表示该菜单项为子菜单。 在设计菜单时要注意以下几点: 菜单和菜单项的首字母大写; 为每个菜单项分配唯一的菜单热键; 可为菜单项设置快捷键 弹出式菜单也称快捷菜单,操作时是通过右键弹出的。弹出式菜单的设计操作步骤如下: 1. 打开相关项目 2. 添加ContextMenu控件 在"工具箱"中找到并双击ContextMenu控件,即向窗体添加了一个"上下文菜单"。 3. 在"上下文菜单"菜单中建立菜单项 选中"ContextMenu1",在"上下文菜单"菜单中显示内容为"请在此输入"框。单击文本"请在此输入",输入菜单项名称。在已输入菜单项的下方出现的"请在此输入"框中,按设计要求继续输入相关内容,完成弹出式菜单的设计。见图4-6。 4. 设置各菜单和菜单项的属性 本例弹出式菜单各菜单项的设置如表4-3。 表4-3 弹出式菜单的菜单项的属性设置 Name Text MenuItem15 增加窗体透明度(&A) MenuItem16 降低窗体透明度(&D) MenuItem17 退出(&X) 5. 输入各菜单项的代码 双击已建立的菜单项,进入相关菜单项的代码段,输入完成该项菜单项功能的代码。 代码如下: Private Sub MenuItem15_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem15.Click Me.Opacity = Me.Opacity - 0.1 End Sub Private Sub MenuItem16_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem16.Click Me.Opacity = Me.Opacity + 0.1 End Sub Private Sub MenuItem17_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem17.Click Close() End Sub 6. 设置窗体Contextmenu属性 选中窗体,将窗体的ContextMenu属性设置为"ContextMenu1"。 图4-6 弹出菜单实例 一般情况下,任何VB.NET可视控件对象都有一个"ContextMenu"属性,利用该属性可以关联弹出式菜单。 4.3 工具栏与状态栏 [案例4-3]部分常用的窗体属性的测试程序(增加了工具栏和状态栏) 本实例是在上节内容的基础上增加了工具栏和状态栏,工具栏中设置了两组三个按钮,第一组两个按钮用于控制窗体的透明度,第二组一个按钮用于退出当前程序。在状态栏中设置了四个窗格,显示制作者的有关信息和系统当前的时期和时间。 图 4-7 [技能目标] 1. 掌握开发工具栏所用到的ToolBar控件与ImageList控件的使用方法。 2. 能根据应用程序的功能规划设计一般的工具栏。 [操作要点与开发步骤] 1. 在项目中创建工具栏的步骤: (1)在当前窗体中添加工具条对象和图像列表对象: 选中要添加工具栏的窗体,在"工具箱"中找到并双击"ToolBar"控件,在当前窗体中就增加了一个"ToolBar1"工具条对象,在"工具箱"中找到并双击"ImageList"控件,在当前窗体中就增加了一个"ImageList1"图像列表对象。 (2)ImageList1对象添加图像: 选中ImageList1对象,双击ImageList1对象的Images属性右侧的" "按钮,弹出"Image集合编辑器"对话框,在Image集合编辑器中单击"添加"按钮,逐个添加按钮图标文件,在VB.NET的安装目录下的/Common7/Graphic/bitmaps/Outline目录下的PLUS.bmp、MINUS.bmp以及在VB.NET的安装目录下的/Common7/Graphic/bitmaps/assorted/BELL.bmp图标文件。见图4-8。 图 4-8 Image集合编辑器 (3)选中当前窗体中的ToolBar1对象,将ToolBar1对象的ImageList属性设置为ImageList1。 (4)创建工具栏中的按钮 选中窗体中的"ToolBar1"对象,双击"ToolBar1"工具条对象的"Button"属性右侧的" "按钮,弹出"ToolBarButton集合编辑器"对话框(见图4-8)。单击该对话框中的"添加"按钮,添加工具栏按钮,并进行相应的按钮属性设置(见表4-4)。 图 4-9 ToolBarButton集合编辑器 表 4-4 工具栏按钮属性设置 Name Imageindex Style ToolTipText 说明 ToolBarButton1 0 PushButton 增加透明度 ToolBarButton2 1 PushButton 降低透明度 ToolBarButton3 2 Separator 分隔条 ToolBarButton4 3 PushButton 退出 (5)编写ButtonClick事件处理代码 'ButtonClick事件处理代码 Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object,_ ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 Me.Opacity = Me.Opacity - 0.1 Case 1 Me.Opacity = Me.Opacity + 0.1 Case 3 Me.Close() End Select End Sub 2. 在项目中创建状态栏的步骤: (1)在当前窗体中添加状态栏对象 选中要添加工具栏的窗体,在"工具箱"中找到并双击"StatusBar"控件,在当前窗体中就增加了一个"StatueBar1"状态栏对象。 (2)将StatusBar1对象的ShowPanels属性设置为"True"。 (3)双击StatusBar1对象的Panels属性右侧的" "按钮,弹出"StatueBarPanels集合编辑器"对话框(见图 4-10)。单击StatueBarPanels集合编辑器中的"添加"按钮,逐个添加状态栏中的窗格,并设置相关的属性(见表4-5)。 表4-5 StatusBarPanels属性设置 Name AutoSize BorderStyle Text 说明 StatusBarPanel1 Contents Sunken 制作者: StatusBarPanel2 Contents Raised 黄毅峰 StatusBarPanel3 Contents Sunken 当前时间: StatusBarPanel4 Contents Sunken (4)添加Timer1对象,将该对象的Enabled属性设置为"True",并编写如下代码。 Private Sub Timer1_Elapsed(ByVal sender As System.Object,ByVal e As _ System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed StatusBar1.Panels(3).Text = Now End Sub 图 4-10 StatueBarPanels集合编辑器 [相关知识] 每一个Windows应用程序都提供一个包含工具栏控件的工具栏系统,用户可以借助工具栏控件方便地使用命令。每个工具栏都可以定位在应用程序窗口的顶部、底部以及左边或者右边,也可以作为浮动窗口放置在工作区的任何位置上。每个工具栏控件都是一个简单的图形化的控件。 1. ToolBar对象的常用属性 (1)Appearance属性:设置工具栏按钮的外观。其属性值为: Normal:立体效果,为默认值; Flat:平面效果; (2)ImageList属性:设置与当前ToolBar对象相关联的ImageList对象。 (3)ShowToolTips属性:决定是否显示工具栏按钮的提示。 (4)TextAlign属性:设置工具栏按钮的文本对齐方式。 (5)ButtonSize属性:设置工具栏按钮的大小。 2. ToolBarButton对象的常用属性 (1)Enabeld属性:决定是不启用该工具栏按钮 (2)Imageindex属性:设置分配给按钮的图像索引值 (3)Style属性:设置工具栏按钮样式 (4)ToolTipText属性:设置工具栏按钮的提示文本 (5)Visible属性:设置工具栏按钮是不可见 状态栏通常位于窗体的底部。它是一个矩形的区域,通常在状态栏中显示系统的时间和应用程序的各种状态信息。可使用Statusar控件来添加窗体的状态栏,该控件最多可添加16个窗格(Panels)。 状态栏窗格的常用属性: (1) Text属性:设置窗格的显示文本 (2) AutoSize属性:设置窗格在调整时的特点。其属性值为: None:窗格的宽度不随内容的变化而变化 Contexts: 窗格的宽度随内容的变化而变化 Spring:窗格共享状态栏上的空间 (3) BorderStyle属性:设置窗格边框的样式。其属性值为: None:不显示边框 Raisd:窗格以凸起方式显示 Sunken:窗格以凹陷方式显示 (4) Icon属性:设置窗格显示的图标。 (5) Style属性:设置窗格的样式。其属性值为: OwnerDraw:表示窗格可显示图像,或以不同字体显示 Text:表示窗格以标准字体显示文本 只有当状态栏对象的ShowPanels属性值设置为"True"时,状态栏中才能显示有关窗格内容。 4.4 MDI窗体 [案例4-4] 多文档应用程序实例 本实例是主要介绍多文档界面窗体的设计,在制作过程中复习菜单栏、状态栏和工具栏等知识。本实例具有如下功能: 文档的新建和关闭 可运用菜单、工具栏、弹出菜单实现文档中文本的剪切、复制和粘贴功能 多个文档窗体的按一定规则的排列(叠放、水平平铺和垂直平铺) 图 4-11 多文档应用程序实例界面 [技能目标] 1. 掌握MDI窗体的概念与组成,了解主窗体、子窗体的区别与联系。 2. 会设计简单的MDI窗体程序。 [操作要点与开发步骤] 在本实例中设计阶段包含了二个窗体的设计,一个为主窗体,命名为MainFrm,另一个为子窗体,命名为ChildFrm。通过相关代码可创建和关闭多个子窗体,并实现相关功能。 1. 主窗体的设计 新建一个项目,选中系统自动添加的Form1窗体,将Form1窗体的属性按表4-6进行设置。 表 4-6 主窗体属性设置 属性 属性值 说明 Name MainFrm 窗体名称 IsMDIContainer True 将窗体设置为MDI窗体 Text 多文档应用程序实例 设置窗体标题 系统默认的启动窗体为Form1,本例中将Form1窗体名称改名为MainFrm后,必须将启动窗体设置为MainFram。 具体操作如下: 在"解决方案资源管理器"窗口中选中本项目,单击"项目"菜单中的"属性页"菜单项,在"属性页"对话框(见图4-12)中,将启动对象设置为"MainFrm"。 图 4-12 "属性页"对话框 2. 子窗体的设计 单击"项目"菜单中的"添加Windows窗体"菜单项,在出现的"添加新项"对话框中,选中"Windows窗体",在名称文本框中输入"ChildFrm",单击"打开"按钮,在项目中就添加了一个名为"ChildFrm"的新窗体。在名为"ChildFrm"的新窗体上添加一个RichTextBox控件的对象RichTextBox1,将RichTextBox1对象的Dock属性设置为"Fill"。 3. 在主窗体上建立菜单栏 在"解决方案资源管理器"窗口中选中MainFrm.vb文件,然后,在"工具箱"中找到并双击MainMenu控件,这样在MainFrm窗体上就增加了名为MainMenu1对象,依次建立各菜单和菜单项(如图4-13),并将各菜单和菜单项的属性按表4-7设置。 (a)"文件"菜单 (b)"编辑"菜单 (c)"窗口"菜单 图4-13 菜单项 表4-7 菜单和菜单项属性 Name Text Shortcut MdiList Menufile 文件(&F) None False Menunew 新建(&N) None False Menuclose 关闭(&C) None False Menuexit 退出(&X) None False Menuedit 编辑(&E) None False Menucut 剪切(&X) CtrlX False Menucopy 复制(&C) CtrlC False Menupaste 粘贴(&V) CtrlV False Menuwindow 窗口(&W) None True Menucascade 叠放(&C) None False Menuwv 水平平铺(&V) None False Menuwh 垂直平铺(&H) None False 当主窗体中的名称为"menuwindow"的菜单项的MdiList属性设置为"True"时,在主窗体中打开的每一个文档的标题都会出现在相应的菜单中,并且在当前活动的菜单项前打勾。 4. 在主窗体mailFrm窗体中添加如下代码: Public Class mainfrm Inherits System.Windows.Forms.Form Private intwindowcount As Integer '添加的代码 #Region " Windows 窗体设计器生成的代码 " Public Sub New() MyBase.New() '该调用是 Windows 窗体设计器所必需的。 InitializeComponent() '在 InitializeComponent() 调用之后添加任何初始化 Dim f As New childfrm '添加的代码 f.Text = "文档1" '添加的代码 f.MdiParent = Me '添加的代码 f.Show() '添加的代码 intwindowcount = 1 '添加的代码 End Sub 上述代码定义了一个局部变量intwindowcount,在整个主窗体模块中有效,用于记录当前打开的文档窗口的个数。同时,在主窗体启动时,打开一个子窗体,并将它的标题命名为"文档1"。 5. 相关菜单功能的实现 (1) "新建"菜单项的Click事件过程代码 Private Sub Menunew_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menunew.Click Dim f As New childfrm intwindowcount += 1 f.Text = "文档" & CStr(intwindowcount) f.MdiParent = Me f.Show() If Menuclose.Enabled = False Then Menuclose.Enabled() = True End If End Sub (2) "关闭"菜单项的Click事件过程代码 Private Sub Menuclose_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menuclose.Click Me.ActiveMdiChild.Close() intwindowcount -= 1 If intwindowcount = 0 Then Menuclose.Enabled = False End If End Sub (3) "退出"菜单项的Click事件过程代码 Private Sub Menuexit_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Hndles Menuexit.Click End End Sub (4) "剪切"菜单项的Click事件过程代码 Private Sub Menucut_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menucut.Click Dim f As childfrm f = Me.ActiveMdiChild Clipboard.SetDataObject(f.RichTextBox1.SelectedText) f.RichTextBox1.SelectedText = "" End Sub (5)"复制"菜单项的Click事件过程代码 Private Sub Menucopy_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menucopy.Click Dim f As childfrm f = Me.ActiveMdiChild Clipboard.SetDataObject(f.RichTextBox1.SelectedText) End Sub (6) "粘贴"菜单项的Click事件过程代码 Private Sub Menupaste_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menupaste.Click Dim f As childfrm Dim idata As IDataObject = Clipboard.GetDataObject f = Me.ActiveMdiChild If idata.GetDataPresent(DataFormats.Text) Then f.RichTextBox1.SelectedText = CType(idata.GetData(DataFormats.Text),String) End If End Sub (7)"叠放"菜单项的Click事件过程代码 Private Sub Menucascade_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menucascade.Click Me.LayoutMdi(MdiLayout.Cascade) End Sub (8)"水平平铺"菜单项的Click事件过程代码 Private Sub Menuwv_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles Menuwv.Click Me.LayoutMdi(MdiLayout.TileVertical) End Sub (9)"垂直平铺"菜单项的Click事件过程代码 Private Sub Menuwh_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Hndles Menuwh.Click Me.LayoutMdi(MdiLayout.TileHorizontal) End Sub 6. 工具栏的设计 在"解决方案资源管理器"窗口中选中MainFrm.vb,在"工具箱"中找到并双击"ToolBar"控件,在当前窗体中就增加了一个"ToolBar1"工具条对象,在"工具箱"中找到并双击"ImageList"控件,在当前窗体中就增加了一个"ImageList1"图像列表对象。选中ImageList1对象,双击ImageList1对象的Images属性右侧的" "按钮,弹出"Image集合编辑器"对话框,在Image集合编辑器中单击"添加"按钮,逐个添加按钮图标,在VB.NET的安装目录下的/Common7/Graphic目录下可找到相关的图标。见图4-14 图 4-14 Image集合编辑器 选中当前窗体中的ToolBar1对象,将ToolBar1对象的ImageList属性设置为ImageList1。选中窗体中的"ToolBar1"对象,双击"ToolBar1"工具条对象的"Button"属性右侧的" "按钮,弹出"ToolBarButton集合编辑器"对话框(见图4-15)。单击该对话框中的"添加"按钮,添加工具栏按钮,并进行相应的按钮属性设置(见表4-8)。 图 4-15 ToolBarButton集合编辑器 表 4-8 工具栏按钮属性设置 Name Imageindex Style ToolTipText 说明 ToolBarButton1 0 PushButton 剪切 ToolBarButton2 1 PushButton 复制 ToolBarButton3 2 PushButton 粘贴 ToolBarButton4 3 Separator 分隔条 ToolBarButton5 4 PushButton 退出 ButtonClick事件处理代码如下: Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object,_ ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 Menucut_Click(Menucut,e) Case 1 Menucopy_Click(Menucopy,e) Case 2 Menupaste_Click(Menupaste,e) Case 4 Menuexit_Click(Menuexit,e) End Select End Sub 7. 状态栏的设计 选中要添加工具栏的窗体,在"工具箱"中找到并双击"StatusBar"控件,在当前窗体中就增加了一个"StatueBar1"状态栏对象。将StatusBar1对象的ShowPanels属性设置为"True"。双击StatusBar1对象的Panels属性右侧的" "按钮,弹出"StatueBarPanels集合编辑器"对话框(见图 4-16)。单击StatueBarPanels集合编辑器中的"添加"按钮,逐个添加状态栏中的窗格,并设置相关的属性(见表4-9)。 表4-9 StatusBarPanels属性设置 Name AutoSize BorderStyle Text 说明 StatusBarPanel1 Contents None 制作者: StatusBarPanel2 Contents Raised 黄毅峰 StatusBarPanel3 Contents None 当前时间: StatusBarPanel4 Contents Sunken 本例中当程序运行时,要在状态栏中显示时间,在Form1_Load过程中添加如下代码: Private Sub Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MyBase.Load StatusBar1.Panels(3).Text = Now End Sub 这样,就完成了本例状态栏部分的设计。 图 4-16 StatueBarPanels集合编辑器 8、弹出菜单的设计 选中要添加上下文菜单对象ChildFrm子窗体,在"工具箱"中找到并双击"ContextMenu"控件,在当前窗体中就增加了一个"ContextMenu1" 上下文菜单对象。如图4-17设计相关菜单项,按表4-10设置有关菜单项属性,选中RichTextBox1对象,将RichTextBox1对象的ContextMenu属性的属性值设置为"ContextMenu1"。 图4-17 表4-10 弹出式菜单属性设置 Name Text MenuItem1 剪切(&X) MenuItem2 复制(&C) MenuItem3 粘贴(&V) 相关菜单项的Click事件过程代码如下: Private Sub MenuItem1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem1.Click Clipboard.SetDataObject(RichTextBox1.SelectedText) RichTextBox1.SelectedText = "" End Sub Private Sub MenuItem2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem2.Click Clipboard.SetDataObject(RichTextBox1.SelectedText) End Sub Private Sub MenuItem3_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _ Handles MenuItem3.Click Dim idata As IDataObject = Clipboard.GetDataObject If idata.GetDataPresent(DataFormats.Text) Then RichTextBox1.SelectedText = CType(idata.GetData(DataFormats.Text),String) End If End Sub 到此完成了整个实例的设计,保存并运行程序,测试相关功能。 练习园地4 一、基础题 1. 概念题 (1)菜单热键(又称为访问键)与快捷键的区别? (2)工具栏中工具提示(TooTip)的作用?如何设置? (3)如何在多文档窗体中建立弹出菜单? (4)在多文档窗体中是如何记录当前打开的文档数的? (5)如何在工具栏按钮上设置图像? (6)如何在工具栏按钮上设置文本? (7)如何在状态栏中显示小图标? (8)下面_____语句将StatusBar1状态栏中的第一个窗格内容改为了"VB.NET"? A、"VB.NET"=StatusBar1.Panels(1).Text B、StatusBar1.Panels(1).Text="VB.NET" C、StatusBar1.Panel1.Text="VB.NET" D、StatusBar1.Panels(0).Text="VB.NET" 二、实战题 1. 编写一个带有菜单、状态栏和工具栏的单文档的窗体界面,实现剪切、复制、粘贴以及退出程序,并建立相关的弹出菜单。 三、挑战题 1. 为第三章挑战题中完整的计算器程序添加的相关的菜单功能。 2. 如何制作"增加透明度"和"降低透明度"的工具栏按钮图像,并用它们替换本章中原有实例程序中的有关图像? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |