1、Visual Basic 程序设计,第十七讲 2课时,教学目标及基本要求,了解多文档界面MDI的特性及应用 掌握工具栏和状态栏的创建及应用 使用画点的Pset方法、画直线和矩形的Line方法、画圆和椭圆的Circle方法绘制图形,教学重点,多文档界面MDI的创建及应用 工具栏的创建及应用 状态栏的创建及应用 图形设计的基础知识,教学难点,工具栏、状态栏及图形的设计;,教学内容,多文档界面的特性 创建和设计多文档界面 使用MDI窗体与子窗体 MDI应用程序中的菜单 多文档界面应用程序中的子窗体排列 工具栏设计 状态栏设计 图形设计中的坐标系统 图形设计中颜色的设置 图形处理,多文档界面设计,多文
2、档界面的特性 设计阶段多文档界面的特性 运行期间MDI窗体的特性,多文档界面设计,创建和设计多文档界面 创建和设计MDI窗体 (1) 添加MDI窗体:执行“工程”菜单中的“添加MDI窗体”命令,会弹出“添加MDI窗体”对话框,选择“新建MDI窗体”或“现存”的MDI窗体,其名称为默认值MidiForm1。 (2) 设计MDI窗体:在MDI窗体上,可以创建菜单栏、工具栏和状态。,多文档界面设计,创建和设计多文档界面 创建和设计MDI子窗体 创建MDI子窗体:MDI子窗体是一个MDIChild属性为True的普通窗体。因此,要创建一个MDI子窗体,应先创建一个新的普通窗体,然后将它的MDIChil
3、d属性置为True。如果要创建多个子窗体,只须重复前面操作。在工程管理器窗口中可以看到MDI子窗体的图标与普通窗体的图标的不同。 设计MDI子窗体:MDI子窗体运行时包含在MDI窗体中,但界面设计与MDI窗体无关。通常,MDI子窗体主要用于显示应用程序的文档,因此,在该窗体上应有文本框或者有供用户输入和显示的文档(如RichTextBox),也可有子窗体菜单。,多文档界面设计,使用MDI窗体与子窗体 设置活动子窗体和活动控件 在NewClient子过程中的语句MDIForm1.ActiveForm.Text1.Text =name + vbCrLf即表示为MDIForm1父窗体中最后一个获得焦
4、点的子窗体的文本框设置Text属性值。 同样,当在一个窗体上显示的控件不止一个时,可以通过ActiveControl属性得到或指定哪一个控件为得到焦点的控件。当访问ActiveForm属性时,至少应有一个MDI子窗口被加载或可见,否则会返回一个错误。,多文档界面设计,使用MDI窗体与子窗体 保存子窗体中文档的内容 在决定退出MDI应用程序时,必须保存文档内容。因而必须时刻记录自上次保存以来窗体中的数据是否有改变。此功能可通过在子窗体中声明一个公共变量来实现,例如:Public FLChange AS Boolean 这样窗体中的RichTextBox1控件的Text属性每一次改变时,Chang
5、e事件就会将FLChange设置为Ture,表示自上次保存以来RichTextBox1的内容已经改变,即Private Sub RichTextBox1_Change()FLChange=TrueEnd Sub,多文档界面设计,相反,用户每次保存子窗体的内容时,就必须将FLChange 设置为False,以指示RichTextBox1内容不再须要保存。Sub Msave_Click()FileSaveProc 调用保存RichTextBox1内容到文件FLChange=False 设置状态变量End SubPublic Sub FileSaveProc()MDIForm1.ActiveForm
6、.RichTextBox1.SaveFile “D:TSGLTT.txt“, rtfText将控件中的文档保存在D盘的TSGL子目录的TT.txt文件中End Sub,多文档界面设计,同样,当关闭当前活动子窗体时,应该判断FLChange的状态,来决定是否存盘Private Sub MClose_Click()if FLChange Then FileSaveProc End Sub,多文档界面设计,使用MDI窗体与子窗体 用QueryUnload卸载MDI窗体 为了避免随着父窗体的关闭而使所有的子窗体结束,造成子窗体内容的丢失,VB提供了QueryUnload事件。当MDI窗体被卸载时,Qu
7、eryUnload事件首先为MDI窗体调用,然后再为每一个打开的子窗体调用。由于QueryUnload事件在窗体卸载之前被调用,因此可以在窗体卸载前给用户一个保存子窗体内容的机会。,多文档界面设计,下面是QueryUnload事件的实例: Private Sub Form_QueryUnload (Cancel As Integer, UnloadMode As Integer)Dim Msg 声明变量If UnloadMode 0 Then 如果正在退出应用程序Msg = “你真想退出应用程序吗?“FileSaveProc 调用保存数据的过程FileSaveProcElse 如果正在关闭窗体
8、Msg = “你真想关闭窗体吗?“End If 如果用户单击No按钮,则停止QueryUnload。If MsgBox(Msg, VbQuestion + VbYesNo, Me.Caption) = VbNo Then Cancel = True End Sub,多文档界面设计,MDI应用程序中的菜单 在MDI应用程序中,菜单可以建立在父窗体上,也可以建立在子窗体上,也可以分别建立。每个子窗体的菜单在MDI父窗体上显示,而不是在子窗体显示。当一个子窗体为活动窗(即有焦点)时,如果该子窗体的有菜单,则该菜单将取代MDI窗体菜单条上的菜单。如果没有可见的子窗体,或者有焦点的子窗体没有菜单,则显示
9、MDI父窗体的菜单。,多文档界面设计,MDI应用程序中的菜单 通过把某个菜单的WindowList属性设置为True,可以用MDI窗体或子窗体上的任何菜单显示已打开的子窗体的列表。设置WindowList属性的步骤如下所述。 选择要显示菜单的窗体(父窗体或子窗体),执行“工具”菜单中的“菜单编辑器”命令,打开“菜单编辑器”窗口。 在菜单项显示区中,选择要将窗体列表显示在其中的菜单,如“用户”菜单。 选择“显示窗口列表”(WindowList)复选框。,多文档界面设计,多文档界面应用程序中的子窗体排列 如果需要在“窗口”菜单中出现“层叠”、“平铺”和“排列图标”等命令,用于重新排列子窗体,可通过
10、调用MDI窗体的Arrange方法来实现。 Arrange方法语法为MDI窗体对象. Arrange排列方式,多文档界面设计,多文档界面应用程序中的子窗体排列 排列方式可以使用VB常数或常数值,其排列方式参数设置值见表13-1。,表13-1 Arrange方法的方式设置值,多文档界面设计,多文档界面应用程序中的子窗体排列 Arrange方法用以重排MDIForm对象中的窗口或图标,例如:某工程的“窗口”菜单下即为排列窗口的命令,其中“垂直排列”单击事件为Private Sub Varrange_Click()MDIForm1.Arrange 2End Sub其中,“2”为排列方式参数。,工具栏
11、设计,制作工具栏的两种方法 手工制作:利用图形框和命令按钮,这种方法比较烦琐。 通过ToolBar、ImageList控件制作。,工具栏设计,创建工具栏的步骤 添加MSCOMCTL.OCX文件,用鼠标右键单击工具箱,选择快捷菜单中的“部件”命令,在图13-2所示的“控件”选项卡中选择“Microsoft Windows Common Controls6.0”,然后单击“确定”按钮,则在图13-3所示的工具箱中就会出现ToolBar控件和ImageList控件。 创建ImageList控件作为要使用的图形集合。 创建ToolBar控件,并将ToolBar控件与ImageList控件相关联,创建B
12、utton对象。并在ImageList控件中添加图像。 在ButtonClick事件中添加代码。,工具栏设计,图13-2 部件对话框,图13-3 工具箱,工具栏设计,在ImageList控件中添加图像 创建ImageList控件 ImageList控件的作用像图像的储藏室,ImageList控件不能独立使用,它需要Toolbar控件(比如ListVew、ToolBar、TabStrip、Header、IMAGEcOMBO和TreeView控件)来显示所存储的图像。 ImageList控件的ListImage属性是对象的集合,该集合中的每个对象可存放图像文件,ImageList控件不能独立使用,
13、只是作为一个便于向其他控件提供图像的资料中心。如工具栏控件(ToolBar)中的图像就是从ImageList控件中获取的。,工具栏设计,在ImageList控件中添加图像 在ImageList控件中添加图像 在ToolBar控件上添加ImageList控件(如ImageList1控件)后,用右键单击ImageList1控件,在弹出的快捷菜单中选择“属性”命令,打开图13-4所示“属性页”对话框,选择其中的“图像”选项卡,在“图像”选项卡中插入图片。一旦ImageList关联到其他控件,就不能再删除或插入图片。,工具栏设计,图13-4 ImageList 控件属性页之“图像”选项卡,工具栏设计,
14、将ToolBar控件与ImageList控件相关联 创建一个ToolBar控件ToolBar1。 用鼠标右键单击ToolBar控件出现弹出式菜单,选择“属性”命令,则出现“属性页”,如图13-5所示。,工具栏设计,图13-5 ToolBar控件“属性页”,工具栏设计,将ToolBar控件与ImageList控件相关联 在“属性页”的“通用”选项卡的“图像列表”中,单击下拉箭头,选择“ImageList1”。 将“属性页”切换到“按钮”选项卡,创建按钮(Button)对象,如图13-6所示。单击“插入按钮”来添加新“Button”,设置标题、关键字、式样及工具提示文本等属性值,设置图像属性为Im
15、ageList控件中图像的索引。例如,“借书”按钮与ImageList2中的第六个图像对应,则图13-6中的“图像”属性设置值为6。 重复创建其他按钮,创建的工具栏如图13-7所示。,工具栏设计,图13-6 Toolbar控件“按钮”选项卡,图13-7 创建的工具栏实例,工具栏设计,响应Toolbar控件的事件 Toolbar控件的主要事件有ButtonClick事件(对应按钮样式0-2)和ButtonMenuClick事件(对应按钮样式5)。由于工具栏上的按钮为控件数组,故既可以用索引(Index属性),也可以用关键字(Key属性)来识别按钮,但要注意用户可用“自定义工具栏”对话框重新安排按
16、钮对象,Index属性值可能并不一定总指示按钮的位置。因此,最好的方法是用Key属性值识别按钮对象。,工具栏设计,响应Toolbar控件的事件 下列的ButtonClick 事件代码就用到按钮对象的Key 属性(假设在Form1窗体上增添了通用对话框控件CommonDialog1)。,工具栏设计,Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)Select Case Button.KeyCase “TNew“Form1.CommonDialog1.ShowNewCase “TOpen“Form1.Commo
17、nDialog1.ShowOpen End SelectEnd Sub,工具栏设计,响应Toolbar控件的事件 ButtonMenuClick事件的语法格式类似为:Private Sub Toolbar1_ButtonMenuClick(ByVal ButtonMenu As MSComctlLib.ButtonMenu)End Sub,状态栏设计,StatusBar控件 StatusBar控件就是一个窗体,该窗体通常放在父窗体的底部,或通过其Align属性设置其出现的位置。通过StatusBar控件,应用程序能显示各种状态数据。StatusBar控件由面板(Panel)对象组成,一个Sta
18、tusBar控件最多可以有16个Panel对象,每一个Panel对象都可包含文本和/或图片。可以控制每个Panel对象的外观属性,包括Width、Alignment(文本和图片的)和Bevel(文本显示的样式)。还可以使用Style属性值中的一个自动地显示公共数据。,状态栏设计,状态栏的建立 在默认情况下,StatusBar控件也不会出现在工具箱中,为了使用StatusBar控件,应首先打开“部件”对话框,选中“Microsoft Windows Common Controls6.0”,将控件添加到Virsual Basic工具箱中,如图13-3所示。 在设计时,在窗体上增加StatusBar
19、1控件后,用鼠标右键单击StatusBar1控件,选择快捷菜单中的“属性”命令,打开状态栏的“属性页”对话框,如图13-8所示。选择其属性页的“窗格”选项卡,如图13-9所示,并进行必要的设置,以建立面板并定制它们的外观。,状态栏设计,图13-8 状态栏属性,图13-9 状态栏“窗格”选项卡,状态栏设计,状态栏的建立 在属性页的“窗格”选项卡中,单击“插入窗格”按钮,就可以在状态栏中添加新的窗格了,但最多只能分成16个窗格,并设置各窗格的文本、宽度、对齐及斜面等属性。此外,能使用样式属性的7个值自动显示公共数据,比如日期、时间及键盘状态等,具体状态栏的Style属性见表13-2,还可以在程序代
20、码中设置属性窗格的属性。,状态栏设计,表13-2 状态栏的Style属性,状态栏设计,状态栏的建立 图13-10所示是一个设计好的状态栏实例效果图,其状态栏设置了8个窗格。,图13-10 设计好的状态栏,包括8个面板,图形设计,坐标系统 设置坐标刻度 在Visual Basic坐标系统中有3种刻度,它们分别是:缺省刻度、标注刻度和自定义刻度。在大多数情况下,采用缺省的刻度作为坐标系统。这时坐标刻度单位是缇(Twip,567缇1厘米),基点位置在容器对象的左上角,即基点坐标为(0,0)。,图形设计,当须要采用系统提供的其他标准刻度单位时,可以通过设置ScaleMode属性来获得。其属性设置值及其
21、作用见表13-3。,表13-3 ScaleMode属性设置值及其作用,图形设计,从表13-3中知道,除了0和3外,其他所有模式都是打印长度单位。例如,一个对象长为10个单位,当ScaleMode属性值设为6时,打印时就是10毫米长。其他设置类似,同样在程序代码中可以使用如下语句形式。ScaleMode7 设置窗体的刻度单位为厘米Picture1.ScaleMode3 设置Picture1的刻度单位为像素 设置ScaleMode属性值后,Visual Basic会重定义ScaleWidth和ScaleHeight,使它们与新刻度保持一致,然后,自动将ScaleTop和ScaleLeft设置为0。
22、,图形设计,如果直接设置了ScaleWidth、ScaleHeight、ScaleTop和ScaleLeft的值,将自动使ScaleMode的值设为0,例如:ScaleLeft=100ScaleTop=100Picture1.ScaleLeft200Picture1.ScaleTop=100,图形设计,坐标系统 刻度的转换 如果要将一种刻度模式转换为另一种刻度模式,就可以使用ScaleX和ScaleY方法来实现。这些方法的语法格式为: Object.ScaleX(value,fromScale,toScale) Object.ScaleY(value,fromScale,toScale)其中,
23、Object可以是窗体、图片框或Printer对象。,图形设计,坐标系统 Scale方法 Scale方法用于窗体、图片框或Printer对象设置新坐标系。其语法格式为:Object. Scale (x1, y1) (x2, y2),图形设计,坐标系统 设置当前坐标 Current X和Current Y属性是用于设置当前水平坐标和垂直坐标,即下一次打印或绘图的起点坐标。例如:将当前坐标设置为原点的位置。Form1.Scale(100,100) - (200,200)Form1.CurrentX=100Form1.CurrentY=100,图形设计,颜色的设置 REG函数 REG函数用于在运行时
24、指定颜色值。其语法格式为:REG(红,绿,蓝),图形设计,颜色的设置 QBColor函数 QBColor函数是用来表示对应颜色值的RGB颜色码。其语法格式为:QBColor(颜色参数),图形设计,颜色的设置 颜色属性 BackColor属性:设置背景颜色。 ForeColor属性:设置前景颜色,前景色是指图形方法或Print方法使用的颜色。 BorderColor属性:设置边框颜色,可以用于Shape控件。 FillColor属性:设置填充颜色,用于Circle方法创建的圆或直线(Line)方法创建的方框及Shape控件形成图形的内部填充颜色。,图形设计,颜色的设置 使用内部常数来设置颜色,表
25、13-6 常用颜色值常数,图形设计,图形处理 直线和形状控件 直线(Line)控件直线控件用于在窗体、框架或图片框中绘制简单的线段。它是通过设置起点坐标X1、Y1和终点坐标X2、Y2属性 改变线段的长短,通过设置BoderWith、BorderStyle和 BorderColor属性可以改变线段的粗细、线型和颜色。 形状(Shape)控件形状控件用于在窗体、框架或图片框中绘制预定义的几 何形状,比如正方形、矩形、圆、椭圆、圆角矩形和圆角正 方形等。,图形设计,图形处理 图形方法 Pset方法 Pset方法用于在窗体或图片框设置指定点处像 素的颜色,即画点。点的大小由对象的DrawWidth属
26、性指定。使用Pset方法的语法格式为:对象.PsetStep(x, y),颜色,图形设计,Line方法Line方法用于在窗体或图片框对象上画直线(斜线也属直 线)和矩形。使用Line方法的语法格式为对象.LineStep(x1,y1)-Step(x2,y2),颜色BF,图形设计,Circle方法 Circle方法可用于在窗体、图片框或打印机等对象上画圆、 椭圆或圆弧。使用Circle方法的语法格式为:对象.CircleStep(x,y),半径,颜色,起点。终点,纵横比,图形设计,PaintPicture方法 使用PaintPicture方法的语法格式为:对象. PaintPicture 图片,
27、x1,y1,宽度1,高度1,x2,y2,宽度2,高度2,位操作常数,图形设计,Cls方法Cls方法用于清除所有图形方法和Print方法显示的文本或图形,并将光标移到原点位置。使用Cls方法的语法格式为对象.Cls,图形设计,图形处理 AutoRedraw属性 AutoRedraw属性对于图形的重新显示非常重要。当窗体被其他窗体覆盖,或当重新移出窗体以及内容须要重新显示时,窗体和控件的重新显示由Windows管理和控制,而窗体、图片框中的图形和用Print方法显示的文本的重新显示,由AutoRedraw属性来确定。 在设计时窗体、图片框的AutoRedraw属性默认时为False,则图形不具有持
28、久性,当窗体被覆盖或扩大时,窗体都会使图形丢失。只有当AutoRedraw属性设置为True时,图形才具有持久性,不会因窗体被覆盖或扩大而使图形丢失。,图形设计,运行时在程序中设置AutoRedraw属性,可以在画持久图形(如背景色或网格)和临时图形之间切换。当AutoRedraw设置为False,用Cls方法清除绘图区时不会删除背景图形。把AutoRedraw的属性改为True后,再用Cls方法将清除背景图形。,小结,通常一个MDI应用程序可以包含有三类窗体,即标准窗体、MDI父窗体、MDI子窗体。工具栏常包含一组图像按钮,工具栏是用户访问应用程序的最常用功能和命令的图像集合。状态栏(Sta
29、tusBar)通常位于窗口的底部,主要用于显示应用程序的各种状态的信息。 Visual Basic为用户提供了强大的绘图处理能力。不仅可以把图片装入窗体、图片框或图像控件中,还可以直接在窗体、图片框等对象上使用绘图方法。如用来画点的Pset方法、画直线和矩形的Line方法、画圆和椭圆的Circle方法等绘制图形,还可以用直线Line控件、形状Shape控件创建灵活变化的图形。,作业,1、试说明普通窗体、MDI窗体、MDI子窗体之间有何区别? 2、怎样创建MDI窗体及其子窗体? 3、简述Visual Basic中使用ToolBar控件制作工具栏的步骤。如果要在ToolBar中添加一个按钮,该如何去实现? 4、如何在ToolBar控件中增加和删除按钮? 5、如何在ImageList控件中增加和删除图像? 6、状态栏最多有多少个窗格?如何控制状态栏的显示与否? 7、在Visual Basic中如何设置坐标系统?它有哪3种刻度? 8、在Visual Basic中常用的绘图方法有哪些?,