新一代BASIC语言--VB入门 杜国梁 1995-01-06 Visual Basic编程系统,引用部分面向对象的机制,提供了一种所见即所得的可视界面设计方法,同时保留了Basic语言的简单易用性,设计出的应用程序完全符合Windows规范。 Visual Basic提供了一个易学易用的应用程序集成开发环境,在这个环境中,用户可设计界面,编写代码,调试程序,最后可把应用程序编译成可执行文件,脱离Visual Basic环境而能在Windows中独立运行,同时还提供将应用程序制成可分发的形式(1.2M或1.44M的安装软盘),这一功能在一般的开发环境中是不多见的。 Microsoft Visual Basic目前有for Windows和for DOS两种版本,但for DOS的版本不多见,最为流行的是Visual Basic 3.0 for Windows的专业版,是该软件的最新版本。 一、Visual Basic for Windows所要求的软硬件条件 1.硬件要求: 386SX 以上处理器,至少2兆内存,30兆自由硬盘空间,鼠标虽可任选,但没有鼠标会大大降低效率并显得十分笨拙。 2.软件要求: Microsoft Windows 3.1,运行在386增强模式下,若要编写中文应用程序,应使用中文windows,或西文windows加中文之星或其它中文平台。 二、Visual Basic应用程序的集成开发环境简介 VB被启动后,可以看到如下(图1)屏幕图景: 屏幕中包括以下几个独立的窗口: 1.主窗口 主窗口是图1中的屏幕图的最上部,由标题栏、菜单条和工具条组成。标题栏中的标题为Microsoft Visual Basic[design],说明此时集成环境处于设计(design)模式。菜单条中包括8个下拉式菜单。菜单条下面是工具条,其中有很多工具按钮。具体的菜单命令和工具条按钮,用到时再详叙。标题栏的左端带有一个小矩形的方框是Windows系统中的每个窗口都有的控制菜单框,可打开系统控制菜单,标题栏的右边是最大化按钮和最小化按钮。在工具条的右边有两个数字的乘积,靠左边的是位置指示,它指出激活对象(具有输入焦点)的位置,单位是“特维”(Twip,1/1440英寸),右边是大小指示,即长乘宽。主窗口虽然在启动时显示在屏幕的顶端,但它的位置是可以改变的,可放在屏幕的任何地方。 2.工具箱窗口(Toolbox) 如图2所示。这些工具是应用程序的集成开发环境中用于设计应用程序的人机界面的。其中大部分是VB中的内建工具。还有的是外加的工具(扩展工具)。每种工具的使用方法,留待下面讨论控件及其属性时再做详细介绍。 工具箱窗口可根据需要显示或隐藏。请注意,这里的工具和工具条中的工具按钮的区别,工具按钮执行一种命令,而工具箱是设计应用程序界面的工具。 3.窗体窗口(Form) 窗体窗口如图1中间部分所示。在VB中,窗体(有的文章中译为“表图”,似有不妥)是应用程序表演的“舞台”,在其上可放置“道具”__在VB中被称为“控制部件”(Control),简称为“控件”,Windows中的窗口上的标准部件,几乎都有对应的控件,这些控件是用工具箱中的对应工具“画”出来的。窗体和可放置其上的控件在VB中都被视为“对象”(Object)。 4.项目窗口(Project) 项目窗口中包括了正在编写的VB应用程序所需文件的清单(图1)。其中具有后缀.VBX的文件,是VB的扩展工具所需的文件,在项目窗口中每增加一个.VBX文件,工具箱中会增加一个或多个工具(一个扩展文件可能包括多个工具)。当VB启动时,虽然还没有任何应用程序调入,但VB已经打开了一个缺省的新项目,名为Project1,这就是项目窗口的缺省标题。项目窗口中列出了缺省项目的所需文件。项目窗口是用户维护应用程序的文件的区域,用户根据程序需要,增加或删除项目中的文件,其结果都要反映到项目窗口中来。每个正在设计的VB应用程序,都有一个后缀为.MAK的文件,这就是项目源文件,其内容就是项目窗口中显示的文件。而.MAK文件的文件名就是项目窗口上的标题。 VB中同时只能打开一个项目,打开新项目就要关闭原来的项目。利用“File”(文件)菜单或工具条上的按钮,可向项目增加新文件或删除已有的文件。 项目窗口标题下有两个按钮,一个是“ViewForm”(查看窗口),另一个是“ViewCode”(查看代码)。当窗体不可见时可选择窗体文件名,再按“ViewForm”按钮,从而显示对应窗体,按“ViewCode”可打开窗体的代码窗口,在其中可查看和编辑程序代码。 5.属性窗口(Properties) 图1中右下部是属性窗口,其中包括所选窗体或控件的所有在设计时可更改属性(Properties)的列表。系统赋予的只读属性和运行时才有的属性都未在属性窗口中列出。所谓属性是标志对象的外观和功能,改变对象的属性,就是改变对象的外观或改变对象的功能。 以上五个窗口,除主窗口外,都可随时关闭。集成开发环境中用到的不只这五个窗口,另外还有代码窗口(前面已提到)、调试窗口(运行正在设计的程序时才出现)、调色板窗口(用于改变前景色和背景色)和菜单设计窗口(用于设计窗体上的菜单,在程序界面设计部分中详述)。 三、应用程序的界面设计 应用程序的界面设计是开发VB应用程序的第一步。这也是用VB设计应用程序和用其它非可视程序语言设计应用程序不同的地方。为了以下介绍的方便,有必要介绍一下VB中特有的术语和语句的书写约定,然后介绍几种常用的工具箱中的工具在界面设计中的应用。 1.VB中的对象简介 在VB中,有以下几种对象: (1)所谓全局对象是应用程序在程序的任何层次都可访问的对象,共有以下五种: App__正设计的应用程序,它的属性决定或指定应用程序的标题、路径、可执行文件名以及帮助文件名等。 Cipboard__它就是Windows中的剪切板,在VB应用程序中可用关键字Clipboard来访问它,从而操作其上的数据或图形。即将数据放到剪切板上或从剪切板上取回数据。 Screen__计算机屏幕,它是应用程序窗口的“容器”,通过它可设置应用程序的窗口在屏幕上的位置以及鼠标指针的形状; Debug__调试窗口,当应用程序在VB集成环境中运行时才显示出来,供调试程序用; Printer__打印机,联机的打印机也是一个对象,应用程序可操作它在纸上输出结果; (2)程序界面对象 Form__窗体,它可作为程序界面或对话框。是应用程序界面中的部件或对话框中的部件的“容器”; Control__控制部件(简称为控件),这是和用户交互的标准部件,命令按钮、文本框、列表框、滚动条、菜单等都属此类。除菜单控件外,所有控件都可用工具箱中的工具“画”出来。菜单控件是用菜单设计窗口作为工具设计出来的。界面设计就是在窗体上放置控件并指定其属性。 (3)数据访问对象 VB的专业版可以操作数据库,数据访问对象是为访问数据库而设的,超出本文讨论的范围,在本文中不作介绍。 2.术语与约定 (1)属性(Properties) 它决定对象的外观和功能。对象有的属性在设计时可更改,可通过属性窗口加以设置,还有的属性是系统赋予对象的,只能在运行时访问这种属性,但不可更改。还有的属性仅在运行时才可访问和更改。后两种属性都不会出现在属性窗口的列表中。在程序代码中,可利用如下的语句访问对象的属性:  [对象名.]属性 其中,对象名和属性间用“.”连接,若省略对象名,则指当前具有焦点的对象。上述组合可看作为一个变量。既可对其赋值(对非只读属性),也可将其值赋于别的变量。 (2)事件(Event) 所谓事件就是系统可以感知的用户操作信息。在VB中称为事件,但在Windows中称为“消息”。事件可分为鼠标事件、键盘事件和其它事件。在VB中,将消息化为事件,就更易于理解和使用。每个对象可引发的事件,在VB中都已经准备好对应的事件过程,程序员只需编写响应事件的代码。 (3)过程(Procedure)与方法(Method) 与对象相联系的是过程和方法。在VB中,每个对象可引发的事件过程的模板都已经准备好,在设计时,双击控件,可打开与此控件有关的代码窗口,在过程列表框中,列出了这个控件可能引发的事件对应过程。选择某一过程可打开该过程的代码模板。另一种过程就是函数,和对象联系的函数用于改变或设置对象的某种属性。比如LoadPicture函数可设置窗体的Picture属性。 方法是一种特殊的过程,它和过程的差别是它从属于特定的对象。因此调用时必须指明对象,方法的调用语法为:[对象名.]方法[参数],对象名和方法之间用“.”连接。例如,调用Debug对象的Print方法,可用语句Debug.Print。若省略对象名,则对象指当前的活动对象。 3.窗体与控件在界面设计中的应用 (1)窗体 如前所述,窗体就是应用程序表演的舞台,其上放置的控件就是布景,舞台加布景组成了程序运行的界面。 ①属性 在界面设计阶段,当窗体处于激活状态时,打开属性窗口可看到窗体的一系列属性。以下只介绍常用属性。 ●Name:应用程序中第一个窗体的缺省名为Form1,以下类推。这是对应窗体在程序中的标识符。可设置为与功能有关的名字,不能使用汉字。VB中的所有控件都有此属性,使用原则相同,对于其它控件不再一一介绍。 ●Caption:显示在窗体标题栏中的字符。缺省名与Name属性同。也可以没有标题。可使用汉字。这也是一个共同的属性。 ●AutoRedraw:逻辑值,控制窗体是否自动刷新。当窗口被覆盖或缩为图标后重新显示时,若此属性为False(假)时,不能重画窗口内原来的图象,这时要调用一个事件过程来执行重画窗口的任务。 ●BackColor、ForeColor:前者设置窗体的背景色,后者设置窗体上显示的字符或图形的前景色。从属性窗口中查看这一属性的缺省设置会发现,其值如&H80000005&,这是一个十六进制的常数,代表了一种颜色。在该属性设置框右边有一个省略号(…),单击它会弹出一个调色板来,可从调色板中选择所需颜色。和颜色有关的属性都有调色板可用于设置颜色值。 ●BorderStyle:设置窗体的边界风格。可取值如下表: 设 置 作 用 0--None 窗口无外框。 1--Fixed Single 在设计阶段指定大小,运行时不可变,具有单线外框。 2--Sizable 具有双线外框,运行时可改变大小。 3--Fixed Double 在设计阶段指定大小,运行时不可变,具有双线外框。 ●ControlBox:逻辑值,为True(真,在VB中以-1代表真,其余值为假)时,在窗体的左上角显示控制菜单框。从而可打开窗口的控制菜单,当设计一个软件封面时,可能不需要这一功能,此时可设为False。 ●Enabled:逻辑值,每个VB的对象都有此属性。可使对象的功能有效或失效。对窗体来说,一般应设为True,但若要禁止键盘和鼠标动作对窗体的影响,可设为False。 ●FontName:设置窗体上显示的正文的字体。可以属性设置框中拉出可用字体的列表,从而可从中选择。运行时如改变这一设置,只影响设置以后显示的字体。 ●FontSize:设置字号。设置方法同上。字号的单位为“点”(1/72英寸)。 ●FontBold、Fontltalic、FontStrikethru、FontUnderline:均为逻辑值,设置正文的风格。 ●Top、Left、Height、Width:决定窗体的位置和大小。Top和Left是窗体左上角的坐标(以屏幕左上角为原点),Height和Width是窗体的高和宽,单位均为“特维”(Twip),它的大小为1/1440英寸。一般这几个属性可通过鼠标的拖放加以设置(就象操纵标准窗口一样) ●Picture:指定在窗体上显示的点位图。在属性窗口的设置框右边有省略号,单击它拉出一个对话框,从中可指定点位图的文件名。在运行时要用LoadPicture函数来设置它。 ②事件 窗体可接收的事件很多。最常用的事件为Click(单击鼠标左键)、DblClick(双击鼠标左键)和Load(向内存中装载窗体)事件。 ●Click:当用户单击窗体上的不包括任何对象的区域时,引发这一事件,VB调用和此事件相联系的FormClick事件过程(如果其中有代码的话)。 ●DblClick:在窗体上的同一地点(不包括任何其它对象)双击鼠标左键引发这一事件,从而执行FormDblClick过程。 ●Load:一旦向内存中装载窗体,如启动应用程序时,自动产生此事件,相应的FormLoad过程被执行。此事件过程很适合在启动应用程序时对属性和变量进行初始化。 ③过程和方法 ●Cls:方法。清除窗体上的在运行时写入的文本和图形。在设计阶段放入的图形和控件不受此方法的影响。用法如下:  [窗体名.]Cls 此方法不带任何参数。 ●LoadPicture:函数。用于设置窗体的Picture属性。用法如下: LoadPicture([图形文件名]) 图形文件可为点位图(后缀为.BMP)、图元文件(后缀为.WMF)或图标(后缀为.ICO),如不指定文件名则指定一个空图形。 ●Print:方法。向窗体书写文本。其用法和Basic中的Print语句相似:  [对象名.]Print[[表达式][;l,]]… 每个表达式后有一个分号或逗号。如使用分号,则下一个表达式紧随在上一个表达式的最后一个字符之后;如果用逗号,窗体上的输出位置前进到下一个制表位(每个制表位定义为14个字符)。如果最后的表达式后有分号或逗号,则在窗体上不换行,否则输出位置将设置到下一行。此方法除用于窗体之外,还可用于打印机对象(Printer)和调试窗口对象(Debug)。除以上方法之外,窗体上还支持一些图形方法,如画直线、画圆等,在绘图一节中再加以介绍。 (2)窗体上的控件(Control) 窗体上的所有控件都是用工具箱中的工具通过鼠标的拖拉“画”出来的。当一个控件被选择时,属性窗口中显示该控件的属性列表,以备修改(改变设置)。下面介绍常用的几种控件。所用工具参见图2。 ①图片框(Picture Box)和图像控件(lmage) 这两个控件用于在窗体上的特定位置上放置图形信息。 (Ⅰ)属性 图片框和图像控件共有的属性有Enabled、Height、Left、Name、Picture、Top、Width。这些属性与窗体中的对应属性意义一致,但Height、Width、Left、Top这四个属性值指的是窗体中的坐标,而不是屏幕的绝对坐标,这一点对窗体中的所有对象都如此。图片框很象主窗体中的小窗口,它具有图像控件没有的属性:AutoRedraw、FontBold、Fontltalic、FontName、FontSize、FontUnderline。这些属性与窗体中的对应属性的意义相同。 (Ⅱ)事件 可接收的事件和窗体基本相同。 (Ⅲ)过程和方法 可调用LoadPicture函数设置图片框或图象控件的Picture属性。图片框还支持Cls和Print方法,以及图形方法。 ②标签(Label) 标签提供了显示正文信息的区域,它可用作窗口的状态条,文本区或列表框的标签。这是设计应用程序界面的重要元件。 (Ⅰ)属性 标签的标准属性有与正文字形有关的FontBold、FontItalic、FontName、FontSize、FontUnderline以及与位置和大小有关的Height、Width、Left、Top等,其它重要属性如下: ●Name:在代码中的该控件的标识符。 ●Caption:标签中显示的文本。这是标签控件最重要的属性。在设计阶段可用属性窗口设置,在运行阶段可用以下标识加以访问(改变设置或读出设置):  [窗体名(Name属性)].标签名(Name属性).Caption ●Alignment:决定如何放置标签中的文本(Caption属性)。 设 置 作 用 0(缺省设置) 左对齐 1 右对齐 2 居中 ●AutoSize:{True|False},若为True,自动改变标签的大小以适应正文,若为False时,标签大小不变,若正文太长,将被截短,以适应标签的大小。 ●BorderStyle:为0时无边框,为1时为单线边框。 (Ⅱ)事件、过程与方法 标签只接收Click、DblClick事件,但事件对标签并不重要。 ③文本框(Text Box) 文本框创建一个窗口内的区域,用户可以在该区域中输入和编辑文本。在界面设计中,文本框常用来输入用户信息,与应用程序进行交互。 (Ⅰ)属性 文本框的标准属性包括:BorderStyle、Enabled、FontBold、Fontltalic、FontName、FontSize、FontUnderline、Height、Left、Name、Top、Width等,这些属性与前面介绍过的意义相同;另外还有以下属性: ●MaxLength:缺省值为0,它表示文本框可以接受任意多的输入字符。 ●MultiLine:若为True,则可输入多行文本,按回车键换行;若为False,只能输入一行正文。 ●PasswordChar:缺省的属性为一个空字符,意为用户可以看到输入的字符。若为一个字符(比如*),则表示该文本框是一个口令域,当给应用程序加入口令时,应使此属性为一个非空字符。 ●Text:程序读入该属性,以便查看用户输入的内容,也可由程序修改,以改变文本框中显示的正文。 (Ⅱ)事件 文本框没有鼠标器事件,但可以监视用户的击键动作。 ●KeyPress:用户击键动作引发这一事件。在此事件过程中,可过滤用户的输入。 ●Change:当文本框的Text属性发生变化时引发这一事件。但要注意,如果用户输入12345时,每输入一个字符发生一次Change事件。 ●LostFocus:当输入光标离开文本框时发生这一事件。常用此事件过程检查Text属性的内容。 (Ⅲ)过程和方法 文本框中最有用的方法就是SetFocus,它把光标放在特定的文本框中。在创建有多个文本框的窗体时,通过该方法可把用户的输入焦点放在最重要的文本框上,其句法如下:  [对象名.]SetFocus 其中对象名为文本框的Name属性。 ④命令按钮(Command Button) 命令按钮在用户按下时可视为执行了一个命令。当然引发何种动作是由事件过程中的程序决定的。 (Ⅰ)属性 除以前介绍的共有属性外,以下属性对命令按钮非常重要: ●Caption:它是显示在命令按钮上的字符串。对命令按钮来说应该给出一个对其功能有明确说明的标题。可以使用汉字。 ●Cancel:当为True时,按Esc键时,和按该按钮的效果相同。 ●Default:当为True时,按回车键和按该按钮效果相同。 (Ⅱ)事件、过程和方法 最常用的事件是Click事件。按命令按钮所执行的动作就是由该事件过程中的程序代码决定的。 ⑤单选钮(Option Button)、复选钮(Check Box) 这两个控件都是用来表示状态或者某种选择的。经常用在对话框中,以便用户作出选择。 (Ⅰ)属性 对单选钮和复选钮来说,除共有的属性外,最有用的是Value属性。它表示按钮的状态。对于单选钮,Value的值可取为True和False,对于复选钮,Value的值可取为0、1和2。其中0表示没有选中,1表示选中,而2表示禁止(以灰色显示)。 (Ⅱ)事件、过程和方法 这两个按钮虽然可接受Click事件,但意义不大。 ⑥成组框(Frame) 成组框用于将屏幕上的对象分组。当将几个单选钮放在成组框中时,这几个按钮成为一组,从中只能选择一个。对于其它对象,它提供了视觉上的区分和总体激活及屏蔽特性。 (Ⅰ)属性 最重要的当属Caption属性,它是显示在成组框上的文本(标题)。Enabled属性对成组框也很重要,当将其设置为False时,成组框上的标题正文变灰,其上的所有的对象都被屏蔽(不可操作状态)。 (Ⅱ)事件、过程和方法 成组框不响应任何事件,其上不能显示正文(除标题外)和图形。 ⑦列表框(List Box) 列表框列出可供选择的选项,让用户选择(用鼠标单击它)。如果列表项目太多,框中显示不完,此时列表框会带有垂直滚动条。 (Ⅰ)属性 除了一些标准属性外,与列表框的特性有关的属性有: ●List:该属性是一个数组,其中保存了所在列表项。在设计时不能修改,用以下句法可访问列表框中的列表项:  [对象名.]List(列表项的编号) 其中对象名为列表框的Name属性,列表项从上到下编号,第一个的编号为0。 ●ListCount:列表框中列表项的数目。不能直接修改。 ●Listindex:最后选中的列表项编号。如果未选中任何项目,则其值为-1。 ●Text:最后一次选中的列表项中的正文。不能直接修改。它的内容与List(Listlndex)相同。 (Ⅱ)事件、过程和方法 列表框接收Click和DblClick事件。一般来说,用户选择了一项之后还可能改变选择、所以不用编写Click事件过程的代码。 列表框使用的方法包括AddItem、Clear和RemoveItem,用于在运行时修改列表框中的内容。 ●AddItem:用于在列表框中插入一个列表项(正文)。可以指定插入的位置,如未指定,则插入到所有列表项之后。用法如下:  [对象名.]AddItem列表项正文[,插入位置编号] ●Clear:删除列表中的所有项。 ●RemoveItem:用于从列表框中删除一项。用法如下:  [对象名.]RemoveItem删除项编号 ⑧组合列表框(Combo Box) 组合列表框是文本框和列表框的组合。它的功能由Style属性决定。 (Ⅰ)属性 ●Style:确定组合列表框的类型和功能,各设置值的作用如下表: 设置值 作 用 0 创建一个下拉式表框,框右有一个向下的箭头,单击它可拉出列表来。框中是一个文本域,可输入文本。 1 创建一个简单组合框。由文本域和一个列表组成,列表不是下拉的,所有列表项均显示出来。 2 创建一个下拉式列表框,没有文本输入域。框中只显示一个列表项,单击右边向下的箭头时,才拉出一个列表来。 ●Text:包括用户选中项中的字符串或者文者输入域中的内容。 (Ⅱ)事件、过程和方法 组合框响应的事件依赖于Style属性。仅当Style属性为1时,可响应DblClick事件。另两种风格响应Click事件。而编辑文本时会产生Change事件。 AddItem、Clear和RemoveItem方法也适用于组合框,用法与列表框相同。 ⑨计时器(Timer) 计时器用于按一定的时间间隔触发事件,从而执行一系列的动作。计时器在运行时是不可见的。设计时在窗体上显示一个图标。 (Ⅰ)属性 ●Name:计时器的标识符。 ●Enable:为True时起作用。 ●Interval:确定触发计时器事件的时间间隔,以毫秒计。若为0,相当于Enabled属性设为False。最大值为65536。 (Ⅱ)事件、过程和方法 按设定的时间间隔产生计时器事件。可在其事件过程中编写代码,让应用程序执行一定的动作。此控件没有方法与之相联系。 10通用对话框(Common Dialog Control) 通用对话框不是VB中内建的控件,使用它必须有扩展工具文件CMDIALOG.VBX的支持,即在项目窗口内应列出该文件,可用VB的File(文件)菜单中的AddFile(添加文件)命令将其加到项目中来。此控件提供了一套标准的对话框,用于打开文件、保存文件、打印文件、改变颜色或字体等。 此控件在设计时只在窗体内显示一个图标,不可改变它的大小。运行时才显示出对话框来。到底显示什么对话框由其属性决定。图3是一个显示出来的打开文件对话框。以下只介绍文件对话框(包括打开文件和保存文件对话框)。 图3 打开文件对话框 (Ⅰ)属性 Action:指明显示的对话框类型,Action属性值如下: 设置值 显示的对话框 0 无动作 1 打开文件对话框 2 将文件保存为对话框 3 颜色对话框 4 字体对话框 5 打印机对话框 6 启动帮助WINHELP.EXE 在代码中,应当在本控件的其它属性设置完之后,再设置Action属性为某一个有效值,运行时能显示和Action属性对应的对话框。 ●Filter:指定显示在对话框上的类型列表框中的文件过滤字符串。 用法如下: [窗体名.]通用对话框名.Filter[=描述1|过滤字符串1|描述2|过滤字符串2...]一个文件过滤字符串指定显示在对话框上的文件列表框中的文件类型。 ●Filterlndex:指定一个缺省的文件过滤字符串的编号。如果用Filter属性指定了多个过滤字符串,可利用这一属性为打开文件和保存文件对话框指定一个缺省的过滤字符串。所定义的第一个过滤字符串的编号为1。 ●InitDir:指明初始的文件目录。如果未指定此属性,则使用当前目录。 ●DialogTitle:设置在对话框的标题栏中显示的字符串。若不设置,则在打开文件对话框中显示的标题是Open,而在保存文件对话框中的标题是Save As。 ●FileName:确定选定的文件的文件名和路径。 (Ⅱ)事件、过程和方法 通用对话框中已经内建了对事件的处理,比如双击目录列表项会改变显示的文件列表,双击驱动器列表项会改变目录和文件的列表。操纵通用对话框的方法和Windows中的标准方法一致。这一切都不需再编写事件过程的代码,进一步简化了程序。 11菜单(Menu) 在VB中菜单的设计是很简单的,设计工具是菜单设计窗口。从Windows(窗口)菜单中选择Menu Design(菜单设计)命令,或者选择工具条上的按钮 。 图4 菜单设计窗口 菜单设计窗口中的部件及用途如下: Caption:|__菜单标题文本框,用来输入菜单名或命令名,它将来出现在应用程序的菜单条中。要在一系列菜单命令中用横线将命令分组,可在此文本框中键入一个连字符(-)。要使用户能用键盘操纵菜单命令,可在菜单名内的某字母前放一个字符“&”。程序运行时,这个字母下面有下划线,用户可用ALT+此字母键来激活这一命令。 Name:__菜单控件名文本框。在这里为菜单项指定一个标识符(Name属性)。在程序代码中可以通过这一标识符来引用此菜单命令。这个标识符并不出现在菜单中。此属性象其它控件的Name属性一样 Index:__索引号文本框。指定菜单的Index属性(输入一个整数),用来决定此菜单项在控制数组中的位置,这一位置和其在屏幕上的位置无关。 Shortcut: __下拉式列表框。从中可为此菜单命令选择一个简捷键。 □ Windos List__复选钮。如果想要此菜单控件包括一个所有打开的MDI(多文档界面)子窗口的列表的话,要选择此复选钮(方框中有一个选择记号×)。 HelpContextID:0__上下文帮助标识号文本框。在框中可输入一个唯一的一个整数,作为此菜单命令的上下文帮助标识号。 □ Checked__选择复选框。如要在菜单初次出现时,在其左侧有一个被选标记(),可选定此复选框。 [×]Enabled__生效复选框。如选定此复选框(方框中有叉号),则此菜单命令出现时即可使用(在菜单中以实文字出现),若是未选(方框中是空的),则此菜单命令出现时是虚化的。 [×]Visible__可见性复选框。如选定此复选框(方框中有叉号),则此菜单命令出现时有菜单条中是可见的,否则是不可见的。 下面是一些用于改变菜单命令级别的按钮: ← → ─这两个按钮用于改变菜单命令的级别。每个菜单命令还可以带有子菜单,可最多创建四层菜单。 |← → __这两个按钮可在同一层菜单中改变某菜单项的位置。 菜单设计窗口的最下面为一列表框,显示出各级菜单项的列表。子菜单以缩进表示。 此外菜单设计窗口还包括下列按钮(表中列出按钮的名称和对其的说明): 按钮名称 说 明 Next(下一个) 将选定内容移到下一行。 Insert(插入) 在当前选定行前加一行。 Delete(删除) 删除选定的行。 OK 关闭菜单设计窗口,并将菜单项目的改变加到所选的窗体上。 Cancel(取消) 关闭菜单设计窗口,取消所有对菜单所作的改变。 菜单对象接收Click事件,在Click事件过程中编写执行对应命令的代码。 (3)程序界面设计实例 现在设计一个简单的应用程序,用来试验一些控件的功能。它由一个主窗口和两个辅窗口组成。两个程序例,每个程序例有一个辅窗口(图6、图7)。主窗口作为总的界面。如图5所示。启动VB,从“File”(文件)菜单中选择“New Project”(新项目)命令,从项目窗口中移去除Form1之外的所有文件。用属性设置窗口将Form1的Caption属性设置为图5中的标题,将其Name属性设为frmMain,从“Window”菜单中选择“Menu Design”命令,打开菜单设计窗口(参见图4),按图5设计菜单。从工具箱中选择命令按钮工具。在窗口中“画”出命令按钮。菜单和命令按钮的属性如下表: 项 目 Caption Name 一级菜单 选项[&O] MnuControls 二级菜单项 Visual Basic程序举例(1)[&C] MnuCheck 二级菜单项 Visual Basic程序举例(2)[&L] MnuListBox 一级菜单 帮助[&H] MnuHlp 命令按钮 退出[&X] CmdExit 图5 界面设计实例(主窗口) 图6 例一窗口 在所有的窗口中,命令按钮使用的字体有关的属性都相同,如下表: 字体属性 FontName Fontsize FontBold Fontltalic 设 置 宋体 12 -1 ‘True 0 ‘Faise 例一和例二中窗体上的控件的属性如下两表所示: 图7 例二窗口 程序例一窗口中的控件: 对 象 Caption Name 窗体2 Visual Basic程序举例(1) frmListBox 命令按钮1 添加[&A] cmdAdd 命令按钮2 删除[&R] cmdRemove 命令按钮3 全清除[&I] cmdClear 命令按钮4 关闭[&C] cmdClose 标签1(无外框) 加入的列表项[&N]: lblName 标签2(无外框) 列表项数目: lblClient 标签3(有框) 无 lblDisplay 列表框 无 lstClient 文本框 无 txtName 程序例二窗口中的控件: 对 象 Caption Name 窗体3 Visual Basic程序举例(2) frmCheck 标签 请在下面的正文框中输入正文: lblEnter 文本框 无 txtDisplay 成组框 字体风格 frame1 复选钮1 粗体[&B] chkBold 复选钮2 斜体[&I] chkltalic 命令按钮 关闭[&C] cmdClose 利用工具箱中的工具和属性设置窗口按以上属性设计各控件,位置和大小可参考图5、图6和图7。\[1842812]\[1842851] 四、编写程序代码 1.使用代码窗口 图8 代码窗口 利用代码窗口(参见图8)来输入、显示和编辑程序代码。你可以打开任意多个代码窗口,从而可以轻易地察看不同窗体、模块中的代码,并可在各个窗口间复制粘贴代码。 要打开一个代码窗口,请从项目窗口中选择一个窗体或模块,并选择View Code(察看代码)按钮。而选择View Form(察看窗体)按钮可察看窗体。 要从窗体窗口中打开代码窗口,可用鼠标双击一个控件或窗体本身,或者从View(察看菜单)中选择Code(简捷键F7)命令。 代码窗口中包括: ●对象列表框(Object Box):对于窗体,对象框中列出了当前窗体和其中的所有的控制。 ●过程列表框(Procedure Box):如果正在编辑窗体代码,过程列表框列出所有的能为Visual Basic识别的属于窗体和其中的控制的事件过程。如果选择一个事件,则与此事件名相联系的事件过程或者事件过程模板显示在代码窗口的下部。 如果(general)显示在对象列表框中,过程列表框中就列出所有的为此窗体创建的过程(可为此窗体中的任何过程所调用)。如果正在编辑一个代码模块中的代码,则过程列表框中列出所有的在此模块中的全程过程。 ●分隔条:(如图8所示)可用鼠标拖曳此条,将代码窗口水平分成两部分(两个分窗口),每个部分可分别用滚动条滚动。因而可同时看到代码的不同部分。在对象列表框和过程列表中的信息适用于具有焦点的分窗口。若把分隔条再拖回窗口的顶部,就关闭了分隔出来的窗口。 代码窗口是一个功能强大的程序编辑器,它可使用的编辑命令列在“编辑”菜单中。 2.程序设计中的一些问题 (1)Visual Basic中与用户交互的语句和函数 Visual Basic中包括了一些QuickBasic中没有的与用户交互的语句和函数。常用的是InputBox,InputBox$函数和MsgBox函数和语句。下面分别加以介绍。 ①InputBox,InputBox$函数: 在一个对话框中显示提示,等待用户输入文本或选择一个按钮。当用户单击“OK”钮或按回车键,该函数返回文本框中的文本串(用户输入的或是缺省的)。若用户选择“Cancel”钮,则返回一个空字符串("")。用法如下: IputBox[$](提示字符串[,[标题字符串][,[缺省文本串][,xpos,ypos]]]) 其中:提示字符串作为提示信息显示在对话框中。标题字符串显示在对话框的标题栏中,如忽略,则标题空着;缺省文本串作为缺省文本显示在输入文本框中;如忽略,则输入文本框显示了出来时是空的;xpos是对话框左上角的X坐标(以屏幕的左上角为原点),单位是“特维”(Twip);而ypos是对应的Y坐标。 ②MsgBox函数和MsgBox语句: 显示信息对话框,等待用户选择一个按钮。MsgBox函数返回一个反映用户所选择的按钮的数值,但MsgBox语句不返回数值。函数的用法如下: 变量名[%]=MsgBox(信息字符串[,[类型][,标题字符串]]) 语句的用法如下: MsgBox信息字符串[,[类型][,标题字符串]] MsgBox语句和函数都有以下参数: ●信息字符串:显示在对话框中的信息。 ●类型:可选的数值表达式。数值表达式的值是下面几个数字之和,表示按钮数量和类型的数、表示显示图标样式的数、表示缺省按钮的数以及表示信息框模式的数。 ●标题字符串:显示在对话框标题栏中的标题。 反映按钮的数量和类型的常数以及返回值,在文件CONSTANT.TXT中都事先定义好了,使用时可从此文件中复制常数的定义。 (2)变量与过程的作用域 一个VB应用程序一般都有不只一个文件。每个文件称为一个模块(Module),窗体的定义及其相关的所有代码都放在一个文件中,文件的后缀.FRM,这个文件称为窗体模块。此外还可创建只包括代码的应用程序文件,它不从属于任何窗体。代码模块的文件名后缀为.BAS。一个变量或过程(子程序和自定义函数)随所处的位置不同,可被访问的范围也不相同,变量或过程可被访问的范围,称为该变量或过程的作用域。在VB中作用域有三级,它们是全程级、模块级和过程级。下面分别加以说明: ●全程级:当一个过程的定义放在代码模块中时,这个过程可在应用程序中的任何地方调用,这称为全程过程。对于变量和常数要使其可在应用程序的任何部分都可被访问,除必须放在代码模块中外,还需用Global关键字加以声明,声明方法如下: Global变量名[As 类型] 其中变量名既可以是简单也可以是下标变量(数组)。全程常量定义如下: Globla Const常数名=值 若为字符串常数,后面的值应用双引号("")括起来。 ●模块级:当一个变量(常量)在一个模块(包括代码模块)内但又在此模块的任何过程之外声明的,则此变量(常量)可被模块内的所有过程所共享,这是模块级变量。而模块内的过程,可被此模块内的任何过程所调用,这属于模块级过程。 ●过程级:这只对变量或常量而言。当一个变量或常量只在一个过程内声明时,此变量或常量只能被本过程所使用,在别的过程中是不可访问的。这就是过程级的变量(常量)。 3.示例程序代码 现在可以回到前面提过的示例程序,下面输入代码。示例程序有三个窗体,在每个窗体中分别输入代码。首先是主窗体。在主窗体中只要编写响应菜单命令和退出按钮的过程即可。从项目窗口(参见图1)中选择frmMain窗体并单击“ViewCode”按钮,打开Form1的代码窗口。在左面的对象列表框中的下拉式的列表中找出菜单项名,mnuCheck,在右面的过程列表框的下拉列表中找出它的Click过程,单击之后,在代码窗口中就有了一个mnuCheckClick()的过程模板,在Sub和End Sub之间输入代码,得到下面程序(代码的作用已在注释中加以说明): Sub mnuCheckclick() End Sub 用同样的方法,输入以下过程: Sub mnuListBoxClick()  frmLostBox.Show ‘显示第二个程序例的窗体 End Sub Sub cmdEixtClick()  End ‘当用户单击“退出”命令按钮时,结束程序的运行。 End Sub 打开frmCheck窗体的代码窗口,输入如下代码: Sub chkBoldClick() ‘当复选框改变状态时,出现Click事件。 ‘Value属性的值代表了复选框的状态。  if ChkBold.Value=1 Then ‘如果复选框被选择  txtDisplay.FontBold=True ‘文本框中显示的字符变粗体  Else ‘如果复选框未被选择  txtDisplay.FontBold=False ‘文本框中显示的字体为正常体  End if End Sub Sub chkltalicClick() ‘当复选框改变状态时,出现Click事件。 ‘Value属性的值代表了复选框的状态。  if Chkltalic.Value=1 Then ‘如果复选框被选择  txtDisplay.Fontltalic=True ‘文本框中显示的字符变为斜体  Else ‘如果复选框未被选择  txtDispaly.Fontltalic=False ‘文本框中显示的字体为正常体  End if End Sub Sub cmdCloseClick()  Unload frmCheck ‘用户按“关闭”按钮关闭示例一的窗体 End Sub 打开frmListBox窗体的代码窗口,在Declaration中输入模块级的变量声明: Dim index As Integer ‘整型变量index指出添加项的序号 然后在各个对象的对应事件过程中输入如下的代码: Sub cmdAddClick() ‘用户按“添加”按钮  IstClient.Addltem txtName.Text.index ‘在列表框中加入第一项  txtName.Text="" ‘清除文本框中的内容  txtName.SetFocus ‘将输入焦点重放在文本框上  lblDisplay.Caption=lstClient.ListCount ‘用标签显示在列表中加入项的序号  index=index+1 ‘设置下一个列表项的序号 End Sub Sub cmdClearClick() ‘用户按“全清除”按钮  IstClient.Clear ‘将列表清空  cmdRemove.Enabled=False ‘使“删除”按钮变灰(失效)  lblDisply.Caption=lstClient.ListCount ‘用标签显示列表项数  index=0 ‘将列表项号置零 End Sub Sub cmdCloseClick() ‘用户按“关闭”按钮  Unload frmListBox ‘关闭列例程序二窗体 End Sub Sub cmdRemoveClick() ‘用户按“删除”按钮 Dim ind As Iiteger ‘引变量为所选择的列表项的序号  Ind=IstClient.Listlndex ‘得到所选列表项的序号  If Ind>=0 Then ‘确认有项目被选择  IstClient.Removeltem Ind ‘将所有选项从列表中删除  IblDisplay.Caption=lstClient.ListCount ‘显示列表框中的项目的数量  Else  Beep ‘这条语句不应被执行,因为如果无被选项,“删除”按钮是失效的。请看下面的代码。  End if ‘下面的代码保证若列表中的最后一项被删除,“删除”按钮应失效。 ‘当lstClient.Listindex不等于(-1)时,说明有项目被选择, ‘下式右边括号表达式的值为“真”,“删除”按钮有效cmdRemove.Enabled=(lstClient.Listindex<>-1)  index=index-1 ‘每按一次“删除”按钮,项目数减1 End Sub Sub FormLoad()  index=0 ‘初始时置列表序号为0 End Sub Sub lstClientClick() ‘用户单击某一列表项,从而选择它  cmdRemove.Enabled=(lstClient.Listlndex<>-1 ‘使“删除”按钮生效 End Sub Sub lstClientDblClick() ‘用户双击某项,相当于按了“删除”按钮  cmdRemove.Value=True ‘命令按钮的Value属性为True(-1)时,按钮被按下 End Sub Sub txtNameChange() ‘当文本框中至少有一个字母时,“添加”按钮生效  cmdAdd.Enabled=(Len(txtName.Text)>0) Eud Sub  五、程序的调试 VB集成开发环境内包括了很多的程序调试工具,它包括调试工具条按钮、菜单命令和调试窗口。下面分别加以介绍。 1.调试工具 (1)Run(运行)菜单中的命令 调试工具在“Run”和“Debug”菜单中,其中有些命令可从工具条按钮或简捷键加以调用,下面分条加以说明。 ●Start(开始)命令: 工具条上的按钮: 简捷键:F5 从头开始运行应用程序所有正在设计的窗体关闭,变量初始化,装启动窗体(如果有的话),这一命令只在设计阶段有效。 ●Continue(继续)命令: 简捷键:F5 在某种中断之后继续应用程序的运行。程序运行中断运行中的错误、遇Stop(停止)语句、遇到代码中的断点、选择了Break(中断)命令或者在运行时按了Ctrl+Break组合键等引起的。 ●Break(中断)命令: 工具条按钮: 简捷键:Ctrl+Break 在程序运行过程中中止运行并将程序从运行模式变为中断模式。在中断模式下的编辑结果,要在重新启动程序之后才能生效。此命令只在运行时才能使用。 ●End(结束)命令 工具条按钮: 停止程序的运行并返回设计阶段。此命令在运行时以及在断模式下能用。 ●Restart(重启动)命令 简捷键:Shift+F5 将程序中的变量重置为初始值并从头启动程序运行。使用此命令可使已经中断和停止运行的程序在继续运行前重新初始化程序中的变量。如果在程序运行或是处于中断模式时选择此命令,则运行中止并重新启动。此命令只在运行时间或处于中断模式时才可使用。 (2)Debug(调试)菜单中的命令 ●Add Watch...(增加观察点)命令 显示一个对话框,你可以往其中加入观察表达式,表达式可为任何有效的Basic表达式。 ●lnstant Watch...(即时观察)命令 工具按钮: 简捷键:Shift+F9 当程序处于暂停状态时,可双击变量(属性)或选择表达式,再选择这一命令或工具条上的按钮或按简捷键时,弹出一个对话框并显示欲观察的变量或表达式的值。只当在中断模式下有效。 ●Edit Watch...(编辑观察表达式)命令 弹出一个对话框,在其中可编辑或者删除一条观察表达式、删除所有表达式或者增加观察表达式。 ●Calls...(调用)命令 工具按钮: 简捷:Ctrl+L 显示一个对话框,其中有当前活动的过程调用列表。此命令只在中断模式下有效。 ●Singe Step(单步执行)命令 工具条按钮: 简捷键:F8 执行一条语句后暂停。使用这一命令可一行一行地运行程序,从而可以看到每条语句的作用。此命令只在中断模式下有效。 ●Procedure Step(过程单步)命令 工具条按钮: 简捷键:Shift+F8 这一命令将子程序(Sub)和函数(Function)过程当作一条单独的可执行语句来执行,执行完之后,移到下一条语句,然后暂停。此命令只在中断模式下生效。 ●Toggle Breakpoint(转换断点)命令 工具条按钮: 简捷键:F9 在当前行设置断点或者取消断点。设置了断点的代码行,以不同的颜色显示,此颜色是由Options(选项)菜单中的Environment(环境)命令来设置的。此命令在运行阶段无效。 ●Clear All Breakpoints(清除所有的断点)命令 从代码中清除所有的断点。当清除了所有的断点之后,应用程序全速运行而不中断。此命令在运行阶段无效。 ●Set Next Statement(设置下一语句) 用于改变代码的执行顺序,以便使下一条可执行的语句为当前所选择的语句。跳过的代码不再执行。此命令只在中断模式下有效。可设置的下一条语句只能是同一过程中的语句。 ●Show Next Statement(显示下一条语句)命令 在继续执行程序时显示下一条要执行的语句。此命令只在中断模式下有效。 2.调试窗口 在VB集成开发环境中,每当程序运行时,都会弹出调试窗口,但这时的调试窗口只是显示模式,不能输入VB的语句。程序中Debug.Print语句的输出都会显示在调试窗口中。当按中断按钮或Ctrl+Break组合键或处于单步运行时,程序处于暂停状态并激活调试窗口,调试窗口的上部显示观察表达式(如果有的话),在其下部可输入任何合法的VB语句,按回车键后立刻执行。可以修改变量或执行一个过程,还可以修改运行时可以修改的对象的属性值。但修改只是暂时的,代码窗口中的源程序不会变化。在调试窗口中可用Print方法观察当时变量或表达式的值。要注意的是,只能修改当前过程的过程级变量、当前过程的参数、模块级变量和全程变量。 调试窗口对于程序调试非常有用而又十分方便。  六、图形编程 图形是Windows的关键部件,没有图形就没有Windows。前面提到的各种对象的图形还不能说是程序员设计出来的。VB提供了丰富的图形功能,窗体和图片框都可以成为程序员的“图板”,在其上可“写字”、“作画”。图形除与窗体、图片框对象有关外,VB的图形方法还可以作用于打印机对象。这里只介绍窗体和图片框,且以窗体为主,关于窗体的讨论同样适用于图片框。  1.屏幕坐标 VB提供了用于确定窗体内对象位置的缺省坐标系。窗体的左上角标为(0,0),横向(X)向右坐标增加,纵向(Y)向下坐标增加。X和Y坐标的最大值由窗体的Width和Height属性决定。单位由窗体的ScaleMode属性决定。缺省时为“特维”(Twip)。ScaleMode属性与所使用的单位的关系如下: ScaleMode属性设置值 度量单位 0 用户定义 1 Twip(缺省值) 2 点(每英寸72点) 3 象素(与显示器有关) 4 字符(垂直:6/英寸,水平:12/英寸) 5 英寸 6 毫米 7 厘米 以下属性描述窗体的坐标系统。 ●ScaleLeft、ScaleTop:定义窗体左上角在窗体坐标系中的坐标,缺省值为0。通过设置这两个属性,可定义用户自己的坐标原点。 ●ScaleWidth、ScaleHeight:定义窗坐标系中的X方向和Y方向的最大坐标值(单位由ScaleMode决定)和方向。缺省方向为,X向右为增加,Y向下为增加,此时这两个属性均大于0。小于0表示与缺省方向相反。 VB还是提供了Scale方法来设置用户的坐标系。Scale方法的句法如下: [对象.]Scale[(左X,顶Y)-(右X,底Y)] 其中对象可以是窗体、图片框或打印机。左X和顶Y,右X和底Y分别是左上角与右下角的X和Y的用户规定的坐标值。VB从这两个点计算ScaleWidth和ScaleHeight的值。公式为:ScaleWidth=右X-左X,ScaleHeight=底Y-顶Y。若不带参数调用Scale方法,则取消用户坐标系而使用系统的缺省坐标系。(即单位为Twip,左上角为原点)  2.与图形有关的方法 (1)Line方法 本方法可用来在图形对象上画直线或矩形,句法如下: [对象.]line[[Step ](X1,Y1)]-[Step](X2,Y2)[,[颜色][,B[F]]] 其中:X1,Y1指定线段的起点坐标,若前面有关键字Step,则表明起点坐标是相对当前的作图位置(由CurrentX和CurrentY属性决定)的,若省略起点坐标,则从当前作图位置开始。X2,Y2指定线段的终点坐标,前面若有关键字Step,坐标是相对于起点的,终点坐标不能省略。颜色指定画线所用的颜色,可由RGB函数或QBColor函数指定。若有关键字B,画的不是直线而是矩形,两组坐标值分别为矩形的两个对角点的坐标。F关键字表明用画矩形的颜色来填充矩形,若省略F关键字,则矩形的填充由FillColor和FillStyle属性决定。只有包括了B时,才能包括F。当直线或矩形画完之后,对象的CurrentX和CurrentY属性被置为作图结束位置。 (2)Circle方法 用于窗体、图片框或打印机对象上画圆、椭圆、圆弧和扇形。用法如下: [对象.]Circle[Step](X,Y),半径[,[颜色][,[起始角][,[终止角][,纵横比]]]] 其中,对象为窗体(非多文档界面窗体,即窗体内没有子窗体)、图片框或打印机;X,Y指定圆心的坐标,若前面有关键字Step,则圆心坐标是相对于CurrentX和CurrentY属性值的。坐标的单位和刻度是由对象的有关坐标属性决定的。颜色参数同Line方法,缺省时使用对象的ForeColor属性指定的颜色画圆;要画圆弧需指定起始角和终止角,角度以弧度计量,且大于或等于0小于或等于2π;若要画扇形,要将起始角和终止角设为负数。此时负号并不代表负的角度,角度仍然被看作是正的,负号代表要从圆心到圆弧画径向线,要画椭圆必须指定纵横比,缺省时为1,即画真正的圆,不管使用什么坐标系;若要填充图形,请设置对象的FillColor和FillStyle属性,78但只能对封闭的图形才能填充。 图9中列出了Circle方法的几个例子。上面是Circle方法的代码,下面是它执行后的结果。Circle方法画圆或弧时,总是按逆时针方向,从图中可以看出起始角和终止角及其正负的效果。当省略中间的某些参数时。分隔参数的逗号不能省,否则出错。但Circle方法不能以逗号结尾(图9见下页)。 (3)Pset方法 将指定的点设置为指定的颜色。用法如下: [对象.]Pset[Step](X,Y)[,颜色] 其中,X,Y指定要指定颜色的点的坐标,若它前面有关键字Step,则点是相对于CurrentX和CurrentY的,即点的坐标应为(CurrentX+x,CurrentY+y)。如不指定颜色,则使用对象的ForeColor属性指定的颜色。使用这种方法可以很方便地清除一个象素,即将指定的点设置为背景色。点的大小和外貌受到对象的DrawWidth和DrawMode两个属性的影响。利用此方法可画任意曲线。 除以上方法之外,Print也可算是一种图形方法,它的作用是在对象上输出字符。Print方法的用法和Basic中Print语句类似,这里不再赘述。 使用图形方法时应将对象的AutoRedraw属性设为True,否则可能画不出图来。如窗体的AutoRedraw属性为False,若在Formload()过程中调用图形方法,窗体中不会画出图形来,应将图形方法放在Paint事件过程中或放在由用户动作触发的事件过程中调用,如Click过程。 学习Visual Basic是一件引人入胜的事,学习编写Windows应用程序,从Visual Basic入手可以说是一个捷径。随着对Windows了解的深入就会产生学习更深入的内容的要求。比如,可以从Visual Basic中学习Windows API函数的调用方法,为进一步学习利用C(C++)语言编写Windows应用程序打下良好的基础。