《VB.NET程序设计中课件》由会员分享,可在线阅读,更多相关《VB.NET程序设计中课件(178页珍藏版)》请在金锄头文库上搜索。
1、VB.NET 程序设计程序设计(中中) VB.NET 程序设计(中) l l第第第第1 1章章章章 程序设计基础与集成开发环境程序设计基础与集成开发环境程序设计基础与集成开发环境程序设计基础与集成开发环境l l第第第第2 2章章章章 数据类型数据类型数据类型数据类型l l第第第第3 3章章章章 程序基本控制结构程序基本控制结构程序基本控制结构程序基本控制结构l l第第第第4 4章章章章 过程与模块过程与模块过程与模块过程与模块l l第第第第5 5章章章章 面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念l l第第第第6 6章章章章 图形用户界面设计基础图形用户界面设计基
2、础图形用户界面设计基础图形用户界面设计基础l l第第第第7 7章章章章 文件操作与打印技术文件操作与打印技术文件操作与打印技术文件操作与打印技术l l第第第第8 8章章章章 Windows Windows桌面程序开发实例桌面程序开发实例桌面程序开发实例桌面程序开发实例l l第第第第9 9章章章章 图形图像处理图形图像处理图形图像处理图形图像处理l l第第第第1010章章章章 多媒体程序开发多媒体程序开发多媒体程序开发多媒体程序开发l l第第第第1111章章章章 程序调试和异常处理技术程序调试和异常处理技术程序调试和异常处理技术程序调试和异常处理技术l l第第第第1212章章章章 数据库访问数据
3、库访问数据库访问数据库访问l l第第第第1313章章章章 综合实例综合实例综合实例综合实例VB.NET 程序设计(中) 第6章 图形用户界面设计基础VB.NET 程序设计(中) 本章学习目标本章学习目标l掌握VB.NET中窗体的分类、创建方法、常用属性、事件和方法l掌握各种控件的添加方法,常用属性、事件和方法l了解图形用户界面程序的开发流程l能够为控件添加代码,完成简单的程序设计。VB.NET 程序设计(中) 6.1 概述概述l用户界面是用户和计算机之间进行交互的界面 l图形用户界面或图形用户接口(Graphical User Interface,GUI)是指采用图形方式显示的计算机操作环境用
4、户接口 VB.NET 程序设计(中) 6.1.1 图形用户界面设计的原则图形用户界面设计的原则1.用户至上用户至上充分考虑到用户使用程序的方便性充分考虑到用户使用程序的方便性 2.控件的位置拖放安排控件的位置拖放安排用户习惯的阅读顺序一般是从左到右,从上到下。按照此原用户习惯的阅读顺序一般是从左到右,从上到下。按照此原则,用户第一眼看到的应是计算机屏幕的左上部分,因此最则,用户第一眼看到的应是计算机屏幕的左上部分,因此最重要的元素应当定位在这里。重要的元素应当定位在这里。3.控件的大小与一致性编排控件的大小与一致性编排当有多种控件被同时利用时要尽可能的使得它们采用同一风当有多种控件被同时利用时
5、要尽可能的使得它们采用同一风格。格。 VB.NET 程序设计(中) 6.1.1 图形用户界面设计的原则图形用户界面设计的原则4.合理利用空间,保持界面的简洁合理利用空间,保持界面的简洁5.合理利用颜色、图像和显示效果来达成内容与形式的统一合理利用颜色、图像和显示效果来达成内容与形式的统一最好采用一些柔和的、更中性化的颜色。应当尽量限制应用最好采用一些柔和的、更中性化的颜色。应当尽量限制应用程序所用颜色的种类,而且色调也应该保持一致。程序所用颜色的种类,而且色调也应该保持一致。 VB.NET 程序设计(中) 6.1.2 图形用户界面程序设计的一图形用户界面程序设计的一般过程般过程在VB.NET环
6、境下开发基于Windows应用程序的过程一般为:1.新建项目新建项目用户每次开发一个程序的实质就是新建一个项目,可以通过“文件”菜单中选择“新建项目”选项新建一个项目。2.设计界面设计界面界面设计就是在窗体上添加控件并且设置控件对象的布局。3.添加代码添加代码用户需要通过与控件交互而执行相应的功能,这种交互就是要触发控件对象的事件。4.保存、运行和调试保存、运行和调试代码设计完毕,保存整个项目,然后进行程序的调试,并完善设计。VB.NET 程序设计(中) 6.2 窗体窗体l窗体是VB.NET开发应用程序的基础。而Windows 窗体用于在.NET Framework上创建 Microsoft
7、Windows应用程序。此框架提供了一个有条理的、面向对象的、可扩展的类集,从而简化了Windows程序的开发。窗体也是类,使用窗体设计器创建的窗体实际上就是类。l基于Windows应用程序的用户界面主要有两大类:单文档界面(Single Document Interface,SDI)和多文档界面(Multiple Document Interface,MDI)。VB.NET 程序设计(中) 6.2.1 创建窗体创建窗体1创建创建SDI窗体窗体 lSDI窗体是指一次只能打开一个文档窗口,一个应用程序中可以包含多个SDI窗体,但是这些窗体之间的关系是平等的,例如Windows下的记事本程序就是一
8、个SDI窗体的程序。l用户每次新建项目时,在选择“Windows应用程序”选项时系统会自动生成一个窗体系统默认名称为Form1,这个窗体就是一个SDI窗体。l一个项目不仅仅只有一个窗体,为已经创建的项目添加窗体的方法为:选择“项目”菜单下的“添加Windows窗体”命令,打开“添加新项”对话框, “模板”列表框中选择“Windows窗体”选项即可。VB.NET 程序设计(中) 6.2.1 创建窗体创建窗体l2.创建创建MDI窗体窗体lMDI窗体是指一个窗体可以同时打开多个文档窗体,这些窗体之间的关系是不平等的,分为主窗体和子窗体。每个文档显示在各自的子窗体中,子窗体的操作与SDI窗体一样,但只
9、局限于主窗体内部。目前大多数的应用程序都是MDI窗体,例如Microsoft Office Word程序就可以同时打开多个文档。VB.NET 程序设计(中) 6.2.1 创建窗体创建窗体l2.创建创建MDI窗体窗体(1)创建MDI主窗体创建MDI主窗体的方法很简单,新建一个项目,并将默认窗体的IsMdiContainer属性设置为True即可。此时MDI主窗体的颜色为黑色,且不能更改背景色,也不能显示图片。一个MDI窗体的应用程序可以有多个MDI主窗体,但通常情况下只有一个。一般情况下,MDI窗体只拥有菜单、工具栏和状态栏。(2)创建MDI子窗体在已将创建了主窗体的项目中,可以为项目添加窗体,
10、并将窗体的IsMdiContainer的属性值设置为True即可创建MDI子窗体。 VB.NET 程序设计(中) 6.2.2 窗体的常用属性窗体的常用属性属性名属性名说明说明取值及说明取值及说明BackColor背景色ControlBackgroundImage背景图像图片的路径,图片格式为bmp,gif,jpg和jpegControlBox是否有“控制”菜单 True:有(默认) False:没有Cursor鼠标在窗体上移动显示的样式默认值为DefaultVB.NET 程序设计(中) Enabled是否可用True:可用(默认) False:不可用Font显示文字的格式字体、大小、颜色、风格
11、IsMdiContainer是否为MDI窗体True:是False:不是(默认)Name名称默认值为Form+数值MaxmizeBox是否有最大化按钮True:有(默认) False:没有MinimizeBox是否有最小化按钮True:有(默认) False:没有Opacity透明度取值为百分比,值越小,透明度越高Size大小Width和Height属性两个值Text标题默认值为Form+数值VB.NET 程序设计(中) 6.2.3 窗体的常用事件和方法窗体的常用事件和方法l窗体事件即响应窗体行为的动作 事件事件说明说明事件事件说明说明Click鼠标单击窗体时触发该事件,调用相应的事件过程Do
12、ubClick鼠标双击窗体时触发该事件Closed窗体关闭后触发该事件Move移动窗体时触发该事件Load窗体第一次显示时,触发该事件VB.NET 程序设计(中) 6.2.3 窗体的常用事件和方法窗体的常用事件和方法l窗体常用的方法 方法方法说明说明方法方法说明说明Activated激活窗体并赋予它焦点ResetBackColor将BackColor属性重设为默认值Close关闭窗体ResetText将Text的属性值重设为默认值Refresh 清除程序运行时生成的文字或图形ShowDialog将窗体显示为模态对话框VB.NET 程序设计(中) 6.2.4 模态窗体与非模态窗体模态窗体与非模态
13、窗体lWindows环境下,窗体的输出有两种形式:模态和非模态。l对于模态窗体,用户如果打开了一个模态窗体,只能在这个模态窗体基础之上进行操作,而不能在同一应用程序的其他地方进行工作,只有关闭了这个模态窗体,才能在其他地方进行操作;例如,VB.NET中的“保存”对话框就是一个模态窗体,用户在未点击“确定”或者“取消”按钮之前,是不能在其他窗体上进行操作的。l非模态窗体不需要关闭就可以使焦点在该对话框和其它窗体之间移动。窗体显示时,可以在当前应用程序的其它地方继续工作。非模态窗体很少;通常因为应用程序继续前需要响应才显示窗体。VB.NET 中“编辑”菜单的“查找”对话框就是一个非模态对话框。VB
14、.NET 程序设计(中) 6.3 常用控件常用控件lVB.NET的控件可以分成三大类,一类是工具箱中包含的各种控件常用控件;第二类是用户到有关公司购买或从互联网上下载控件。第三类就是VB.NET还提供的自定义的ActiveX控件的功能,在应用程序中用户可以根据需要建立自己的ActiveX控件。由于篇幅有限,这里我们只介绍Windows窗体中的一些常用控件。l用鼠标双击工具箱中的控件图标,即可将控件添加到窗体上;将光标移至控件上方,按住鼠标左键不放可调整控件在窗体上的位置;通过鼠标拖拽控件周边的控点可调整控件大小。 VB.NET 程序设计(中) l所有控件都有一些的相同属性,经常涉及到的如表 属
15、性名属性名说明说明取值取值BackColor 背景色ControlEnabled是否可用True:可用(默认) False:不可用Font显示文字的格式字体、大小、颜色、风格Name名称默认值为控件的英文描述名称+数值Text标题默认值与具体控件有关VB.NET 程序设计(中) 6.3.1 输入输出控件输入输出控件l常见属性属性名属性名说明说明取值取值AutoSize 是否根据标签的内容自动调整标签大小Flase:不能 True:能Location相对于容器左上角的坐标X,YText显示的文本内容输出数据Visible是否隐藏False:隐藏 True:不隐藏标签控件的常用方法是Hide()和
16、Show(),分别用于隐藏标签和显示标签。 VB.NET 程序设计(中) 2 文本框(文本框(TextBox)控件)控件l文本框控件用来接受键盘的输入数据 l文本框接受的数值数据将传递给Text属性,作为String型数据处理 l如果要对文本框的Text属性值进行算数运算,必须使用类型转换函数将String型数据转换为数值型数据。 VB.NET 程序设计(中) 属性名属性名说明说明取值取值Maxlength允许最多输入字符个数整数Muitiline是否支持多行显示False:不支持 True:支持(系统默认值)PasswordChar输入的文本以字符形式显示用于表示密码,如用*来表示输入的文本
17、内容,系统默认值为空Readonly是否只读False:只读 TRUE:可写(系统默认值)ScrollBars若多行显示,指定滚动条Both:水平、垂直滚动条 None:没有滚动条Horizontal:水平滚动条 Vertical:垂直滚动条TabStop是否允许用Tab键进入该文本框False:不允许 True:允许(系统默认值)VB.NET 程序设计(中) 事件名事件名说明说明事件名事件名说明说明DoubleClick鼠标双击,触发事件代码KeyDown按下某键,触发事件代码GotFocus得到焦点,触发事件代码TextChanged文本值改变,触发事件代码方法名方法名说明说明方法名方法名
18、说明说明Clear()清空文本信息Paste()从剪贴板粘贴文本Copy()复制文本到剪贴板Select()选择指定文本Cut()剪贴文本到剪贴板SelectAll() 选择所有文本Focus()获得焦点VB.NET 程序设计(中) 3. 多行文本框(多行文本框(RichTextBox)控件控件事件名事件名说明说明事件名事件名说明说明LinkClicked单击文本上的链接,触发代码SelectedChanged选定文本更改时触发代码方法名方法名说明说明方法名方法名说明说明SaveFile将多行文本框中的内容保存到文件LoadFile 将文件中的内容导入到多行文本框中VB.NET 程序设计(中)
19、 4按钮(按钮(Button)控件)控件事件名事件名说明说明事件名事件名说明说明Click鼠标单击,触发事件代码DoubleClick鼠标双击,触发事件代码KeyPress按下某键,触发事件代码VB.NET 程序设计(中) 4按钮(按钮(Button)控件)控件l在任何 Windows 窗体上都可以指定某个按钮控件为“接受”按钮(即默认按钮)。每当用户按 Enter 键时,系统会直接响应默认按钮的单击事件。将某个按钮设置为默认“接受”按钮的方法为:首先,选择按钮在留的窗体然后,在窗体的“属性”窗口中,将AcceptButton 属性设置为 Button 控件的名称,参见图6.1(a)。但是,如
20、果窗体上其他控件具有焦点了,此设置则不能生效,具体情况为: 具有焦点的控件为另一个按钮;具有焦点的控件为多行文本框;具有焦点的控件为自定义设计了捕获 回车键的控件VB.NET 程序设计(中) 4按钮(按钮(Button)控件)控件l同样,在任何 Windows 窗体上都可以指定某个 按钮“控件”为取消按钮。每当用户按 Esc 键时,即单击取消按钮,而不管窗体上的其他哪个控件具有焦点。设定默认“取消”按钮的方法为:首先选择按钮所在的窗体,然后在窗体的“属性”窗口中,将CancelButton 属性设置为 Button 控件的名称,参见图6.1(b)。VB.NET 程序设计(中) (a)设置“接受
21、”按钮 (b)设置“取消”按钮 图 6.1 设置“接受”按钮和“取消”按钮 VB.NET 程序设计(中) 6.3.2 图片框(图片框(PictureBox)控件)控件l图片框(Picture)控件用来显示图片来美化应用程序界面。可以显示包括位图、图元文件、图标、JPEG、GIF或PNG格式的图形文件,也可以作为其他控件的容器。属性见下表 VB.NET 程序设计(中) 6.3.2 图片框(图片框(PictureBox)控件)控件属性名属性名说明说明取值取值BorderStyle设定图片边框的样式None:不设置边框样式 FixedSingle:设置边框为平坦模式Fixed3D:设置边框为3D模式
22、Image设定欲显示的图形文件图片的存储路径SizeMode设定图片的显示格式Normal:图片初始化时给定大小StrechImage:图片放大或缩小以适应图片框的尺寸AutoSize:图片框控件根据图片的尺寸总重调整CenterImage:图片在图片框中居中显示,尺寸不变Zoom:图片大小按其原有的大小按比例增加或减少VB.NET 程序设计(中) 6.3.3错误提示(错误提示(ErrorProvider)组件组件l错误提示(ErrorProvider)组件来专门验证数据的有效性。该组件可以在不打扰用户的情况下,以友好的方式提醒用户出现的错误,并通过与用户的交互来解决问题。l使用一个错误提示组
23、件就可以处理窗体上所有对象的验证信息。当用户输入数据有错时,会用图标提示出错。将鼠标指针移到某个控件对象上时,就可以显示出错信息。错误提示组件的常用属性是“Icon”,其值是一个图标文件,用来提示错误信息。常用的方法是“SetError()”,用来指定图标文件出现的位置和出错的提示信息。VB.NET 程序设计(中) 6.3.4 选择控件选择控件1.单选框(单选框(RadioButton)控件和复选框()控件和复选框(CheckBox)控)控件件l单选框控件的常用属性是Checked,表示是否选中。复选框控件常用属性如表 l复选框控件的常用事件为CheckedChanged(),当选项改变时,触
24、发该事件代码。l单选框控件和复选框控件的方法和事件与文本框控件类似,只是复选框控件一般只使用属性,单选框控件可以调用事件 VB.NET 程序设计(中) 6.3.4 选择控件选择控件属性名属性名说明说明取值取值Checked是否选中False:没有选中(系统默认) True:选中CheckState复选状态Unchecked:没有选中(系统默认) Checked:选中 Inderterminate:以实心填充VB.NET 程序设计(中) 2.日历日历 (DataTimerPicker) 控件和月控件和月历(历(MonthCalendar)控件)控件VB.NET 程序设计(中) 属性名属性名说明说
25、明取值取值Format确定日期时间显示格式Custom:xxxx-xx-xx(年-月-日) Time:xx:xx:xxShort:xxxx-xx-xx(年-月-日) Long:xxxx年-xx月-xx日MaxDate 可选择的最大日期默认值为:9999-12-31MinDate 可选择的最小日期默认值为:1753-1-1ShowCheckBox是否显示复选框False:不显示复选框 True:显示复选框Value控件当前日期时间VB.NET 程序设计(中) 属性名属性名说明说明取值取值CalenderDimensions月历中行列显示月份的个数默认值为:1,1 (行个数,列个数)Selecti
26、onRange月历中选择日期的范围默认值为:当前日期ShowToday是否在月历的底部显示当前日期False:不在月历底部显示当前日期True:在月历底部显示当前日期ShowTodayCircle是否在当前日期上标注红色标记False:不在当前日期上标注红色标记 True:在当前日期上标注红色标记ShowWeekNumbers是否在月历的左侧显示星期数False:不在月历的左侧显示星期数True:在月历的左侧显示星期数VB.NET 程序设计(中) 3.列表框(列表框(ListBox)控件和组合)控件和组合框(框(ComboBox)控件)控件l(1)列表框控件可以显示一组项目的列表,用户可以根据
27、需要从中选择一个或多个选项。 属性名属性名说明说明取值取值FormatString指定输出格式无格式、数字格式、日期格式等Items列表中的选项预设将在列表中显示的列表项MultiColumn指定列表框是否包含多列False:以单列显示(默认值) True:以多列显示SelectedIndex当前所选项的索引值整数,从0开始计数ScrollAlwaysVisibe指定列表框是否有滚动条False:没有滚动条 True:有滚动条VB.NET 程序设计(中) 3.列表框(列表框(ListBox)控件和组合)控件和组合框(框(ComboBox)控件)控件方法名方法名说明说明方法名方法名说明说明Cle
28、arSelected取消选择项Refresh刷新InsertItem添加列表项SelectionItem选择项信息GetSelected返回是否选定某项SetSelected选择列表框中的列表项VB.NET 程序设计(中) 3.列表框(列表框(ListBox)控件和组合)控件和组合框(框(ComboBox)控件)控件l列表框控件也经常用来触发事件,常用的事件是SelectedIndexChange,当用户改变在列表框中的选择时,将触发该事件。l这里值得说明的是,列表框的Items属性是最重要的属性,它还有自己的子属性:Count和Item。Count子属性表示列表框中数据项的个数,Item子属
29、性表示选择项。Items属性也有自己的方法,程序员可以通过调用Items属性的方法来给列表框添加、删除数据项, 属性见下表方法名方法名说明说明方法名方法名说明说明Add添加数据项Copyto复制整个集合Clear清空Remove删除数据项VB.NET 程序设计(中) 3.列表框(列表框(ListBox)控件和组合框)控件和组合框(ComboBox)控件)控件l(2)组合框控件相当于将文本框和列表框的功能组合在一起。这个控件可以采用输入文本或从列表中选定项目这两种方法选择项目。如果项目数超过了组合框能够显示的项目数,控件上自动出现滚动条,用户可以上下或左右滚动列表。 l组合框控件的常用方法和事件
30、及其Items属性的子属性同列表框控件一致, 属性名属性名说明说明取值取值Items组合框中的数据项预设将在组合框中显示的数据项Text当前文本信息当前的取值VB.NET 程序设计(中) 6.3.5 容器类控件容器类控件l控件组(控件组(GroupBox)控件)控件在使用单选框控件或复选框控件时,一般都要使用多个控件。VB.NET提供了控件组(GroupBox)控件,可以将窗体上杂乱的控件对象分组。控件组一般只使用属性,其主要属性是AutoSize,用来决定是否根据字号自动调整大小,取值为False则不能自动调整;取值True则可以自动调整(系统默认值)。VB.NET 程序设计(中) 6.3.
31、5 容器类控件容器类控件l面板(面板(Panel)控件)控件VB.NET提供了面板控件,可以生成上下和左右滚动条。面板控件和控件组的使用类方法似,一般也只使用属性。 属性名属性名说明说明取值取值AutoScroll是否显示滚动条False:不显示 True:显示BorderStyle设置面板的边框None:没有边框 FixedSingle:单线边框 Fixed3D:3D边框VB.NET 程序设计(中) 6.3.5 容器类控件容器类控件l【例6.1】编写程序,让用户输入基本信息。运行界面分为两部分,初始状态下用户在“请输入信息”部分输入信息,参见图6.3(a);用户单击“确定”按钮后,将用户填写
32、的信息提交到了程序的“基本信息显示表”中,显示出了用户提交的信息,并出现表示感谢的图片和文字,参见图6.3(b)。VB.NET 程序设计(中) VB.NET 程序设计(中) l设计步骤如下:1. 添加控件,控件布局如图6.3所示。由于该程序控件较多,用分组控件管理更为方便。添加3个分组控件、6个文本框控件、2个单选按钮控件、1个日历控件、1个组合框控件、4个复选框控件、1个按钮控件、1个图片框控件和9个标签控件。2. 设置控件属性,Label控件只是用于描述信息,因此,9个标签控件的TextBox值即为界面上所显示的值,这里就不一一介绍,其他控件属性设置如表所示。VB.NET 程序设计(中)
33、控件类控件类型型属性属性属性值属性值控件类型控件类型属性属性属性值属性值GroupBox1text请输入基本信息Button1Name BtnOKGroupBox2text兴趣爱好Text确定GroupBox3text基本信息显示表DataTimerPicker1nameDTPBirthdayTextBox1nameTxtNameComboBox1Name CobEduTextBox2nameTxtShowNameItem小学初中高中大专本科硕士博士VB.NET 程序设计(中) TextBox3nameTxtShowSexTextBox4nameTxtShowBirthCheckBox1Nam
34、eChktravelTextBox5nameTxtShowEduText旅游TextBox6nameTxtShowInterestCheckBox2NameChkmusicRadioButton1nameRadMaleText音乐text男CheckBox3NameChksportRadioButton2nameRadFemaleText运动text女CheckBox4NameChkreadPictureBox1NamePicthanksTextVB.NET 程序设计(中) l为程序添加代码。用户单击“确定”按钮时,会将“请输入信息”组中控件的信息显示在“基本信息表”的文本框中,且显示图片。此
35、时这组文本框内的信息用户不能手动更改。具体代码为:Private Sub BtnOK_Click() Handles BtnOK.Click Dim insterest As String = 定义字符型变量用于记录checkbox的值 TxtShowName.Text = TxtName.Text TxtShowName.Enabled = False TxtShowName文本框不能使用 If RadMale.Checked = True Then 判断哪个单选按钮被选中 TxtShowSex.Text = RadMale.TextElse TxtShowSex.Text = RadFem
36、ale.Text End If TxtShowSex.Enabled = False 格式化日期的显示形式TxtShowBirth.Text = Format(DTPBirthday.Value, yyyy年MM月dd日) TxtShowBirth.Enabled = False TxtShowEdu.Text = CobEdu.Text TxtShowEdu.Enabled = FalseVB.NET 程序设计(中) If Chktravel.Checked = True Then 判断复选框是否被选中 insterest = insterest & Chktravel.Text & 如果选
37、中,则连接兴趣 End If If Chkmusic.Checked = True Then insterest = insterest & Chkmusic.Text & 如果选中,则连接兴趣 End If If Chksport.Checked = True Then insterest = insterest & Chksport.Text & 如果选中,则连接兴趣 End If If Chkread.Checked = True Then insterest = insterest & Chkread.Text & 如果选中,则连接兴趣 End If TxtShowInterest.T
38、ext = insterest TxtShowInterest.Enabled = False Picthanks.Image = New Bitmap(F:thanks.bmp) 在图片框显示图片 End SubVB.NET 程序设计(中) 6.3.6 定时器(定时器(Timer)控件)控件l定时器(Timer)控件是用来产生一定的时间间隔,在每个时间间隔中都可以根据应用程序要求有相同或不同的事件或过程发生,在动画制作或定期执行某种操作等方面比较使用。定时器控件在设计时显示为一个小时钟图标,而在运行时则看不到。定时器不能添加到窗体中,只能出现在窗体下面的面板中。 l计时器常用方法是Start
39、()和Stop(),分别用于打开计时器和关闭计时器。l计时器组件的事件只有Tick。使用该事件之前要首先用Interval属性设置Tick事件之间的时间间隔,每个时间间隔都会触发Tick事件。VB.NET 程序设计(中) 6.3.6 定时器(定时器(Timer)控件)控件属性名属性名说明说明取值取值Enable确定计时器是否可用False:不可用 True:可用Interval设置计时器触发的周期以毫秒计算,取值范围064767【例6.2】编写一个程序模拟秒表计时器,程序开始运行界面参见图6.4。程序具有以下功能:l“开始”按钮,是一个计时、暂停键,初始状态下按钮为“开始”键,单击则计时器开始
40、计时,“开始”按钮变为“暂停”按钮;再单击“暂停”按钮,系统停止计时,“暂停”按钮变为“继续”按钮,再单击“继续”按钮,计时器继续计时。l单击“停止”按钮,系统停止计时,恢复到初始状态,用户可点击“开始”按钮重新计时。VB.NET 程序设计(中) l设计步骤如下:l在窗体上添加一个标签控件、一个按钮控件和一个计时器控件。l设置窗体和控件的属性。控件控件属性属性属性值属性值控件控件属性属性属性值属性值LabelnameLabel1ButtonnameBtnstarttext00:00:00text开始Timer Interval1000ButtonnameBtnstopFormtext秒表计时器
41、text停止VB.NET 程序设计(中) l添加程序代码:(1)双击“开始”按钮,添加代码,按照题目的要求,按钮显示为“开始”或“继续”时,用户单击按钮,计时器开始计时,此时Timer1控件可以使用,按钮显示为“暂停”时;用户单击按钮,系统停止计时,此时Timer1控件不可使用。具体代码为:Private Sub Btnstart_Click() Handles Btnstart.Click If Btnstart.Text = 开始 Then Btnstart.Text = 暂停 Timer1.Enabled = True ElseIf Btnstart.Text = 暂停 Then Btn
42、start.Text = 继续 Timer1.Enabled = False Else Btnstart.Text = 暂停 Timer1.Enabled = True End IfEnd SubVB.NET 程序设计(中) (2)双击“停止”按钮,添加代码。用户单击“停止”按钮,系统停止计时。具体代码为:Private Sub btnstop_Click_1() Handles Btnstop.Click Timer1.Enabled = False Label1.Text = 00:00:00 Btnstart.Text = 开始End SubVB.NET 程序设计(中) (3)添加计时器
43、的触发事件代码:Private Sub Timer1_Tick() Handles Timer1.Tick Dim a, b, c As String 变量a,b,c用来记录小时,分钟和秒钟,以a:b:c的形式在label1中显示 c = Microsoft.VisualBasic.Right(Label1.Text, 2) c取值为:自label1的tex属性t值右面取2位 b = Mid(Label1.Text, 4, 2) b取值为:自label1的tex属性t值左面第4位开始取2位 a = Microsoft.VisualBasic.Left(Label1.Text, 2) b取值为:
44、自label1的tex属性t值左面取2位 c转换为数值型后自动增1表示秒钟自动增1c = Trim(Str(Val(c) + 1) : If Val(c) 10 Then c = 0 & Val(c) c转换为数值型后,值为60则重置为“00”,变量b转换为数值型后增1,表示1分钟If Val(c) = 60 Then c = 00 : b = Trim(Str(Val(b) + 1) : If Val(b) 10 Then b = 0 & Val(b)b转换为数值型后,值为60则重置为“00”,变量a转换为数值型后增1,表示1小时 If Val(b) = 60 Then b = 00 : a
45、 = Trim(Str(Val(a) + 1) : If Val(a) 10 Then a = 0 & Val(a) Label1.Text = a & : & b & : & c End SubVB.NET 程序设计(中) 6.3.7 公共对话框公共对话框lVB.NET提供了一些公共对话框控件来帮助用户进行文件操作,这些控件包括:打开文件对话框(Open)控件,保存文件对话框(Save)控件,字体对话框(FontDialog)控件,颜色对话框(ColorDialog)控件,文件夹对话框(FolderBrowserDialog)控件。这些对话框分别有各自的属性,但它们常用的方法都是ShowDi
46、alog(),用来运行时打开对话框。VB.NET 程序设计(中) 1.打开文件对话框(打开文件对话框(Open)控件)控件属性名属性名 取值取值DefaultExt获取或设置文件扩展名Filter获取或设置当前文件名筛选器字符串获取文件名VB.NET 程序设计(中) 保存文件对话框(保存文件对话框(Save)属性名属性名取值取值DefaultExt获取或设置文件扩展名获取文件名Filter获取或设置当前文件名筛选器字符串VB.NET 程序设计(中) 字体对话框(字体对话框(FontDialog)属性名属性名取值取值属性名属性名取值取值Color获取或设置选定字体的颜色MaxSize获取或设置可
47、选择的最大磅值Font获取或设置选定的字体MinSize获取或设置可选择的最小磅值VB.NET 程序设计(中) 颜色对话框控件(颜色对话框控件(ColorDialog)l该控件是标准的Windows颜色对话框,如图6.5所示,对话框分为两部分:一部分显示基本颜色,一部分显示自定义颜色。其常用属性是Color,用于获取或设置选定的颜色。 VB.NET 程序设计(中) 文件夹对话框控件文件夹对话框控件(FolderBrowserDialog)l该控件是标准的Windows浏览文件夹对话框,可以浏览,选择和创建文件夹。常用的属性是SelectePath,用于获取或设置选定的路径。VB.NET 程序设
48、计(中) 6.3.8 打印控件打印控件l在VB.NET中,提供了一组专门用于打印的控件,用来将文本信息输送到打印机打印。打印控件既可以打印文档,也可以打印图形。 VB.NET 程序设计(中) 打印文档(打印文档(PrintDocument)控)控件件l打印文档控件用于设置一些属性,这些属性说明在基于 Windows 的应用程序中要打印什么内容以及打印文档的能力。它的常用属性它的常用属性有:DefaultPageSetting:PrintDocument用于获取或设置页面设置的值;DocumentName:用于获取或设置打印文档时要显示的文档名;l打印文档控件常用的方法是Print(),用于开始
49、打印进程。VB.NET 程序设计(中) 打印对话框(打印对话框(PrintDialog)控件)控件l打印对话框控件是一个预先设置的对话框,即显示Windows标准“打印”对话框,可用于在基于Windows的应用程序中进行与打印相关的一些设置,如选择打印机,选择要打印的页面等。PrintDialog控件具有与单个打印作业(PrintDocumen类)或个别打印机的设置(PrinterSettings类)相关的属性,其常用的属性有:Document:用于获取或设置一个值,指示用于获取PrinterSettings的PrintDocumentPrinterSettings:获取或设置对话框修改的打印
50、机设置。l打印对话框控件常用的方法是ShowDialog(),用来运行对话框。VB.NET 程序设计(中) 打印预览对话框打印预览对话框(PrintPerviewDialog)控件)控件l打印预览对话框控件是预先配置的对话框,即“打印预览”对话框,用来显示打印后的文档外观。可以在基于Windows的应用程序中使用它作为简单的解决方案,而不用配置用户自己的对话框。该控件包含打印、放大、显示一页或多页和关闭对话框的按钮。l打印预览对话框控件常用的方法是ShowDialog(),用来运行对话框。lPrintPerviewDialog控件常用的属性有:VB.NET 程序设计(中) 打印预览对话框打印预
51、览对话框(PrintPerviewDialog)控件)控件lPrintPerviewDialog控件常用的属性有:AutoSize:获取或设置一个值,该值只是PrintPerviewDialog是否自动调整大小以完整显示其内容;BackColor:获取或设置窗体的背景色Document:获取或设置要预览的文档Location:获取或设置该控件的左上角相对于其容器的左上角的坐标UseAntiAlias:消除锯齿可以使文显示的更整齐平滑VB.NET 程序设计(中) 页面设置对话框页面设置对话框(PageSetupDialog)控件)控件l页面设计对话框控件是一个预先配置的对话框,即“页面设置”对话
52、框。用于在基于Windows的应用程序中设置页的更详细的信息以便打印。可以设置边框、页边距、页眉页脚以及纵向和横向打印。PageSetupDialog控件常用的属性有:Document:获取或设置一个值,指示从中获取页面设置的PrintDocumentPageSettings:获取或设置一个值,该值指示要修改的页设置PrintSettings:获取或设置单击对话框中打印机按钮时修改打印机设置。 页面设置对话框控件常用的方法是ShowDialog(),用来运行对话框。VB.NET 程序设计(中) 6.4 菜单设计菜单设计l菜单可以分为两种基本类型:下拉式菜单和快捷菜单。VB.NET 程序设计(中
53、) 6.4.1 下拉菜单下拉菜单l下拉菜单是Windows应用程序最常用的一种菜单形式,基本结构包括:菜单栏、菜单标题、一级菜单、子菜单。VB.NET 程序设计(中) 1. 创建下拉菜单创建下拉菜单l(1) 在工具箱中把一个MenuStrip控件拖到窗体上,此时窗体下方出现一个名为MenuStrip1的对象,而在窗体标题栏的下面出现一个可视化菜单设计器。可视化菜单设计器是一个文本框,框内显示“请在此输入”,参见图6.6(a)。l(2) 输入菜单标题。单击可视化菜单设计器所显示的文本框,输入一个菜单标题,如“文件”。输入的名称显示在菜单项的Text属性栏中。此时该菜单标题额度右侧和下侧就会显示出
54、带阴影的文本框。右侧带阴影的文本框用来设置第二个菜单标题,下面带阴影的文本框用来设置该菜单标题下的菜单项。l(3) 添加新的菜单项和子菜单。当输入一个菜单项后,该菜单项的右侧和下面也显示带阴影的文本框,其下面的文本框用于设置同级的菜单项,而其右侧的文本框用于设置子菜单项,参见图6.6(b)。VB.NET 程序设计(中) (a)添加主菜单控件 b)添加菜单项和子菜单 图6.6 可视化菜单控件VB.NET 程序设计(中) 1. 创建下拉菜单创建下拉菜单l如果需要在某一位置插入分隔线,右键单击该位置的菜单项,然后从弹出的快捷菜单中选择“Separator”命令即可。l如果需要给某个菜单标题或菜单项设
55、置一个访问键,在该菜单标题或菜单项文本中输入一个“&”连字符和一个字母即可。l如在“文件”菜单标题的文本中输入“&F”即可将“文件”命令的访问设置为Alt+F键。VB.NET 程序设计(中) 2.菜单属性设置菜单属性设置l菜单控件MenuStrip可以理解为一个容器,它是一个包含了描述各个菜单项的对象集,可以为每个菜单项对象分别设置属性。要改变菜单项的属性,可单击该菜单项,这样就可以在属性窗口中改变它的属性值。 属性名属性名说明说明取值取值Enabled菜单项是否可用False:不可用,菜单项呈灰色 True:菜单项可用Visable菜单项是否可见False:不可见 True:可见Image在
56、子菜单前面添加一个图像图像的存储路径Checked是否选中该菜单False:消除选择标记 True:菜单项前出现选择标记“”ShortcutKeys为菜单项设置快捷键 设定组合键VB.NET 程序设计(中) 3. 菜单的常用事件菜单的常用事件l菜单项唯一响应的事件就是Click事件,在应用程序运行时,当用户单击一个菜单项时,就会触发一个Click事件,对应的菜单命令就会得到响应,去执行响应的Click事件。VB.NET 程序设计(中) 6.4.2 弹出式菜单(弹出式菜单(ContextMenuSrtip) 1.创建快捷菜单创建快捷菜单(1) 在工具箱中选取ContextMenuSrtip控件添
57、加到窗体上,在窗体下方出现一个ContextMenuSrtip1的对象,(2) 快捷菜单上的菜单项的添加菜单项及子菜单的方法与下拉菜单的设计完全相同。创建完菜单后,为每个菜单项添加功能。双击需要添加功能的菜单项,进入其Click事件代码窗口编写代码。(3) 将快捷菜单与相应控件或相关联。快捷菜单设计完成后还需要与相应的控件或窗体关联起来,才能使其在程序运行过程中右键单击时自动弹出来。关联的方法是:选取需要添加快捷菜单的控件或窗体,在其ContextMenu属性中设置所关联的快捷菜单的控件名即可。2.快捷菜单的属性设置快捷菜单的属性设置快捷菜单具有很多重要的属性,这些属性与下拉菜单属性功能相同,
58、这里不再赘述。VB.NET 程序设计(中) 第7章 文件操作与打印技术VB.NET 程序设计(中) 学习目标l理解与文件相关的概念和结构;l掌握文本文件的处理技术;l掌握XML文件的处理技术,能够完成简单的程序编写;l掌握打印技术VB.NET 程序设计(中) 7.1 概述l文件是指存储在外部物理介质上的数据的集合。 l计算机操作系统是以文件为单位对数据进行管理的。VB.NET 程序设计(中) 7.1.1 文件的结构l为了有效地存取数据,数据必须以某种特定的方式存放,这种特定的方式称为文件结构。VB文件是由记录组成的,记录是由字段组成的,字段是由字符组成的。VB.NET 程序设计(中) 1. 字
59、符(Character)l字符是构成文件的最基本单位。字符可以是数字、字母、特殊符号或单一字节。这里所说的“字符”一般为西文字符,一个西文字符用一个字节存放。如果是汉字字符,包括汉字和“全角”字符,则通常用两个字节存放。也就是说,一个汉字字符相当于两个西文字符。一般把用一个字节存放的西文字符称为“半角”字符,而把汉字和用两个字节存放的字符称为“全角”字符。lVB.NET支持双字节字符,当计算字符串长度时,一个西文字符和一个汉字都作为一个字符计算,但它们所占的内存空间是不一样的。例如,字符串“VB程序设计”的长度为6,而所占的字节数为10。VB.NET 程序设计(中) 2. 字段(field)l
60、字段也称域。字段由若干个字符组成,用来表示一项数据。例如某个学生的学号“06509100”就是一个字段,它由6个字符组成。而姓名“刘大平”也是一个字段,它由3个汉字组成。VB.NET 程序设计(中) 3. 记录(Record)l记录由一组相关的字段组成。例如在学生学籍管理文件中,学生的学号、姓名、性别、籍贯、院系等构成一个记录,如表7.1所示。在VB中,以记录为单位处理数据。学号学号姓名姓名性别性别籍贯籍贯所属院系所属院系李玉女北京计算机学院VB.NET 程序设计(中) 4. 文件(File)l文件由记录构成,一个文件含有一个以上的记录。例如在学籍管理文件中有100个学生的信息,每个学生的信息
61、是一个记录,100个记录构成一个文件。VB.NET 程序设计(中) 7.1.2 文件的访问访问模式:顺序访问模式、随机访问模式和二进制访问模式。l顺序存取用于普通文本文件,是结构最简单的格式。文件中的每一个字符被设为表示一个文本字符或一个格式化的文本,比如换行符等。数据按照顺序排列的方式存储。这种结构适用于不经常修改数据的存储,占用磁盘空间小。l随即存取用于具有相同长度记录的文件。记录类型可以是系统的标准类型,也可以是用户自定义类型。数据以二进制格式存放。这种结构可以同时进行读写操作,读写速度快,但是占用空间大。l二进制存取适用于存储适合用户需要的任意格式的文件。数据都是以二进制的方式存取在硬
62、盘,并且不设定固定的数据类型长度。必须准确的知道数据写到文件的位置,以便正确的重新读取数据。VB.NET 程序设计(中) 7.1.2 文件的访问访问步骤:l首先打开文件 如果文件不存在应先创建文件l当打开文件后,就可以对文件进行读或写操作了l当文件操作完毕后,应该关闭文件。lVB.NET为用户提供了三种访问文件系统的方法:第一种是使用传统方式直接进行文件访问;第二种是通过VB.NET中的System.IO命名空间访问;第三种是通过文件系统对象模型FSO访问。VB.NET 程序设计(中) 7.2 直接访问文本文件l传统的文件直接访问方法就是通过调用VB系统提供的文件访问函数来访问文件,VB.NE
63、T支持传统文件的直接访问方式。采用传统文件访问方法进行顺序访问模式的规则最简单,读取文件时从第一条记录“顺序”读到最后一条记录,写入文件时也一样,不可以在数据间随意跳转。VB.NET 程序设计(中) 7.2.1 打开文件l在进行文件操作之前,必须先打开文件,同时通知操作系统对文件是读取操作还是写入操作。打开文件既指打开已经存在的文件,又指创建一个新文件,调用函数为,其语法格式为:(,)l函数参数说明如表7.2所示。VB.NET 程序设计(中) 参数名参数名取值取值说明说明文件编号文件号,整数打开文件时为文件指定编号,输入输出语句或函数通过文件编号与文件发生联系,直至文件关闭后释放该文件号。Fr
64、eeFile函数可获取下一个可用的文件号文件名Srting表达式用“盘符+路径+文件名”描述VB.NET 程序设计(中) 模式Append:,打开文本文件,进行追加,默认值文件的操作模式,文件打开后只能进行读操作,读操作结束后并关闭文件才能使用Append或Output方式重新打开文件进行写操作Binary:打开文件,进行二进制访问Input:打开文本文件,从文件中读数据Output:打开文本文件, 输出数据到文件中Random:打开的文件, 进行随机访问参数名参数名取值取值说明说明VB.NET 程序设计(中) 存取方式Read:允许读取访问表示文件的存取方式,在多用户或多进程环境中,用来限制
65、其他用户或进程在打开文件时执行的操作Write:允许写入访问ReadWrite:允许读取和写入访问,默认值Default:默认值共享方式LockRead:其他进程无法读取该文件表示文件的共享方式LockReadWrite:其他进程无法读取或写入该文件LockWrite:其他进程无法写入该文件Shared:任何进程都可以读取或写入该文件Default:默认值记录长度小于等于32767字节文件记录的长度,即存入缓冲区的字符数VB.NET 程序设计(中) 7.2.2 关闭文件l在进行文件写操作的过程中,写入的数据都是先送到内存缓冲去内,关闭文件后,才将缓冲区中的数据全部写入磁盘文件。因此结束访问操作
66、之后,必须将文件关闭,以免造成数据丢失。 l (,,) l其中表示要关闭的文件号。该操作可以一次关闭一个文件,也可以关闭多个文件。该参数是可选的,如果没有指定文件号则关闭所有文件。l函数只能在打开文件函数之后调用。关闭文件具有两方面的作用,一方面是将缓冲区中的数据写到文件中,另一方面是释放与该文件相联系的文件号,以供其它函数使用。VB.NET 程序设计(中) 7.2.3 写操作l写操作是将数据写入磁盘文件,调用的函数包括:Print、PrintLine、Write和WriteLine共4个函数。这4个函数的格式相同 VB.NET 程序设计(中) 函数函数说明说明Print( ,Output)在
67、一行的结尾不包括换行符PrintLine( ,Output)在一行的结尾包括换行符,即回车/换行,也就是Chr(13)+Chr(10)Write( ,Output)函数会在各项和字符串两边的引号之间插入逗号,其中可以使用Spc(n)和Tab(n)函数隔开,n是整型数字。不必在列表中置入显示分隔符。使用Write将数据写入文件时,仅支持数字、Boolean、日期、Null和Error数据格式。WriteLine( ,Output)在Output中的最后一个字符写入文件后会插入一个换行符说明:参数中的Output是可选项。如果有多个表达式,每个表达式用逗号分隔开。VB.NET 程序设计(中) 7.
68、2.4 读操作l读取文本文件的操作经常用到的函数是:Input、LineInput和InputString, l说明:使用Input函数最好读取由Write或WriteLine函数写入数据的文件,因为Write或WriteLine函数可以确保将各个数据项正确分开。VB.NET 程序设计(中) 函数函数说明说明Input(,)从打开的文本文件中读取数据并将数据分配给变量。表示变量。从文件中读取的值将被赋给此变量,但此变量不能为数组或对象变量。LineInput()从打开的文本文件中读取一行数据并将它赋给字符串变量,读出的数据不包括回车/换行符InputString(, )直接返回字符串值,该值包
69、括以Input或Binary模式打开的文件中的字符,可以读取所有字符,包括逗号、引号、回车/换行符等,表示任何指定要读取的字符个数的有效值表达式。VB.NET 程序设计(中) 7.2.5 其他函数函数格式函数格式参数说明参数说明返回值返回值Loc()函数中所用的文件号返回一个Long数据类型的值,该值指定打开文件中当前位置的读/写位置,函数从零开始,使用此函数获取文件中的第一个字节将返回0。LOF ()函数中所用的文件号返回一个Long数据类型的值,表示用函数打开的文件的大小(单位为字节)VB.NET 程序设计(中) 函数格式函数格式参数说明参数说明返回值返回值()指定文件的String数据类
70、型表达式,可以包含目录(或文件夹)和驱动器返回没有打开的文件的一个以字节表示的指定文件长度的Long数据类型值(,)表示要复制的文件名称的String数据类型表达式,可以包含源文件的目录(或文件夹)和驱动器;表示指定文件的String数据类型表达式,可以包含目录(或文件夹)和驱动器将指定的文件复制到指定路径VB.NET 程序设计(中) 7.3 XML文件的访问lXML文件(eXtensible Markup Language,可扩展的标记语言)是用文本来表示信息的一种方式。元数据(metadata)是关于数据的数据,描述了怎样、何时以及由何人来收集一特定系列的数据,并告知该数据是何种格式。元数
71、据给出了信息的框架和目的。lVB.NET提供的两种使用XML的技术是:文档对象模型(DOM)和利用XmlTextReader类和XmlTextWriter类读取、写入的方法。这两种技术都涉及到与IO相关的类,因此在程序代码开头要引用语句:Imports System、Imports System.IO和Imports System.XmlVB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)l文档对象模型是读写XML的标准方法。DOM是万维网协会推荐的针对使用XML的标准程序接口,在多数流行的操作系统上都有,对于多数编程语言都可用。DOM是读写XML文件的标准方法,用节点树来描述任何
72、XML文件。XML文件中常用的节点如表 节点节点说明说明XmlElementXML文件中的一个元素XmlAttributeXML文件中的一个属性XmlDocument整个文件,常用属性为,DocumentElementXmlCommentXML文件中的注释。XML文件中的注释以“”结束VB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)lXmlDocument类代表了一个XML文档,常用的方法如表 方法名方法名说明说明CreateNode创建新节点到文件中去。这类方法可以创建任意类型的XmlNode节点CreateElement创建新元素Load将XML文件的内容加载到文件中去Lo
73、adXml将一个包含XML代码的字符串里的内容加载到文件中去Save将XML文件的内容保存到一个文件中去VB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)l【7.1】用LoadXml方法浏览一个已经存在的XML文档,在文本框中XML文件显示出来,程序界面参照图7.1,该XML文件存放在D盘根目录下。VB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)l设计步骤如下为:1.在窗体上添加1个多行文本框控件和1个按钮控件,设置控件属性,如表7.8所示。控件控件属性属性属性值属性值控件控件属性属性属性值属性值Form TextXML文件的访问ButtonNameBtnOpen
74、RichTextBoxNameTextDocumentText打开XML文档VB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)2.添加程序代码,主要时为按钮控件的单击事件添加代码Imports SystemImports System.XmlImports System.IOPublic Class Form1Private doc As XmlDocumentPrivate Sub BtnOpen_Click() Handles Button1.Click Dim As String = d:example.xml Dim reader As StreamReader = Ne
75、w StreamReader() TextDocument.Text = reader.ReadToEnd doc = New XmlDocument() doc.PreserveWhitespace = False doc.LoadXml(TextDocument.Text) End SubEnd ClassVB.NET 程序设计(中) 7.3.1 文档对象模型(DOM)lDOM受到的限制:当用户装载XML文件到DOM中的时候,整个文件都必须装载到内存里。DOM生成完整的树状结构来描述文件,包括所有的节点、节点列表等。如果XML文件很大,这个过程会占用很多内存和时间。l其他XML工作的方法:
76、读取类XmlTextReader和写入类XmlTextWriter。XmlTextReader提供了快速、只读的XML的访问,而XmlTextWriter提供了小而快的编写XML的方法。虽然不如DOM直观,但却具有以下两个 优 越 性 : 处 理 文 件 前 无 需 装 载 整 个 文 件 ;XmlTextReader和XmlTextWriter处理速度快。 VB.NET 程序设计(中) 7.3.2 XmlTextReader类和XmlTextWriter类1.使用使用XmlTextReader类的对象读取类的对象读取XML文件文件lSystem.Xml命名空间中的命名空间中的XmlReade
77、r类可以使用流模式类可以使用流模式处理处理XML文档。文档。XmlReader类是一个虚基类,它包含了读类是一个虚基类,它包含了读XML文档的方法和属性文档的方法和属性lXmlTextReader的常见属性包括:的常见属性包括:Name:当前节点的名字:当前节点的名字NodeType:当前节点的类型:元素、属性等:当前节点的类型:元素、属性等lXmlReader类中的类中的Read方法是一个基本的读方法是一个基本的读XML文档的文档的方法,它以流模式读取方法,它以流模式读取XML文档中的节点每次调用此方法,文档中的节点每次调用此方法,都会移到下一个节点上去。都会移到下一个节点上去。VB.NET
78、 程序设计(中) 【例7.2】打开存在D盘根目录下的XML文件example.xml。设计步骤如下:(1)新建一个名ReadXmlDemo的控制台应用程序(2)添加代码:Imports System.XmlModule Module1Sub Main()定义一个XmlTextReader类的对象并调用read方法来读取文件Dim textReader AS New XmlTextReader(“D:example.xml”)While(textReader.Read() textReader.MoveToElement() 读取元素 Console.WriteLine(textReader.N
79、ame)当前节点名称VB.NET 程序设计(中) Console.WriteLine(textReader.BaseURI) 当前节点的基URIConsole.WriteLine(textReader.LocalName) 当前节点的本地名称Console.WriteLine(textReader.AttrbuteCount.ToString()当前节点的属性个数Console.WriteLine(textReader.Depth.ToString()当前节点的深度Console.WriteLine(textReader.LineNumber.ToString()当前行号Console.Wri
80、teLine(textReader.NodeType.ToString()当前节点的节点类型Console.WriteLine(textReader.Value.ToString()当前节点的文本值End WhileEnd SubEnd ModuleVB.NET 程序设计(中) 2.使用XmlTextWriter创建XML文件l通过添加单个的开始和结束元素标识符来建立XML文件 lXmlTextWriter的常见属性是Formatting,用来确定得到的XML被格式化了 方法名方法名说明说明Close关闭写入的文件。文件用完以后应该及时关闭。WriteElementString在新文件中创建新
81、元素。新元素包括了开始和结束标识符以及元素中的文本。创建没有任何子节点的单个元素时应该使用的方法。WriteStartElement在文件中创建新元素。该方法只创建元素的开始标识符。创建含有子节点的元素时应该使用的方法WriteEndElement为当前元素写结束标识符VB.NET 程序设计(中) 【例7.3】创建一个存储在D盘根目录下的XML文件1.xml(1)新建一个名WriteXmlDemo的控制台应用程序(2)具体代码为:Imports System.XmlModule Module1Sub Main() Dim Writer AS New XmlTextWriter(“C:myexa
82、mple.xml”,Nothing) Writer.Formatting=Formatting.Indented使用自动缩进便于阅读 Writer.WriteStartElemnt(“Team”) 书写根元素 Writer.WriteStartElemnt(“player”) 开始一个元素 Writer.WriteAttributeString(“Name”, “George”) 向先前创建的元素中添加一个属性VB.NET 程序设计(中) Writer.WriteElemntString(Nickname, Zippy) 添加子元素 Writer.WriteElemntString(Posit
83、ion, QB) Writer.WriteEndElement()关闭item元素 Write.WriteFullEndElement()关闭根元素 Write.close()将XML写入文件并关闭WriterEnd SubEnd ModuleVB.NET 程序设计(中) 7.4 打印技术l打印文档涉及到2个方面的操作:一方面利用PrintDialog控件、PrintPerviewDialog控件和PageSetupDialog控件为用户提供图形界面打印文档,另一方面,利用PrintDocument控件来打印文档,此时首先要创建一个PrintDocument类。打印文档类似于将文本信息显示在指
84、定的图形中,因此通过调用方法Grapgics.DrawString将文本信息发送到打印机上。VB.NET 程序设计(中) 7.4.1 PrintDocument 类lPrintDocument类提供了若干用于打印文档和图形的实用对象,包括PrinterSettings对象(包含打印机的默认设置)、PageSettings对象(包含特定页的打印设置)和PrintPageEventArgs对象(包含将要打印页的事件信息)。在使用PrintDocument类的时候需要在窗体代码的顶部添加Imports 语句:Imports System.Drawing.Printing 将PrintDocument
85、类添加到页面中l在打印文档时,通常可以创建 PrintDocument 类的一个新实例,使用PageSettings和PrinterSettinsg设置描述打印内容和方式的属性,然后调用 Print 方法开始打印进程。通过使用 PrintPageEventArgs 中包含的 Graphics 来处理用于指定打印输出的 PrintPage 事件。VB.NET 程序设计(中) 7.4.1 PrintDocument 类在使用PrintDocument控件时,有两种情况需要处理:1.简单的打印作业简单的打印作业对于一些简单的文档(如单个文本文件 )进行打印时,应将 PrintDocument 组件添
86、加到 Windows 窗体,然后在 PrintPage 事件处理程序中添加打印文件的编程逻辑。该编程逻辑应以使用 Print 方法打印文档结束。此方法向打印机发送一个 Graphics 对象,该对象包含在 PrintPageEventArgs 类的 Graphics 属性中。2.更为复杂的打印作业更为复杂的打印作业用户如想要重新使用已编写的打印逻辑的情况。在这种情况下,应从 PrintDocument 组件派生一个新组件,并重写PrintPage 事件。VB.NET 程序设计(中) 7.4.2 范例【例7.4】用顺序访问方式将文本文件读取到多行文本框中,并利用打印控件将其打印出来。运行界面参见
87、图7.2。程序设计步骤如下:1. 在窗体上添加1个多行文本框控件、3个按钮控件、1个PrintDocument控件、1个PrintDialog控件和一个PageSetUpDialog控件。控件属性设置如表7.10所示。VB.NET 程序设计(中) 控件类型控件类型属性属性属性值属性值控件控件属性属性属性值属性值Form Text打印文档ButtonNameBtnOpenPrintDocumentNamePrintDocument1Text打开文件PrintDialogNamePrintDialog1ButtonNameBtnPrintPageSetupDialogNamePageSetupDi
88、alog1Text打印文件ButtonNameBtnSetupRichTextBoxScrollBarsForcedBothText页面设置NameRBoxShowVB.NET 程序设计(中) 2. 为程序添加代码:(1)定义变量Imports System.IOImports System.Drawing.PrintingPublic Class form1 Dim , str, mystr, showstr As String Dim PageSettings As New PageSettings Dim result As DialogResultDim PrintFont As Ne
89、w Font(Arial, 10)(2)为“打开”按钮添加事件代码Private Sub BtnOpen_Click() Handles BtnOpen.Click (1, d:example.txt, OpenMode.Input) 打开文本文件 Input(1, str) 读取文本文件 RBoxShow.Text = str 在文本框显示文件End SubVB.NET 程序设计(中) (3)为“页面设置”按钮添加事件代码 Private Sub BtnSetup_Click() Handles BtnSetup.Click PageSetupDialog1.PageSettings = P
90、ageSettings 指定页面设置对话框 PageSetupDialog1.ShowDialog() 调用页面设置对话框End Sub(4)为“打印”按钮添加事件代码 Private Sub BtnPrint_Click() Handles BtnPrint.Clickshowstr = RBoxShow.TextPrintDocument1.Print() 调用打印方法 End Sub(5)为“PrintPage”添加事件代码 Private Sub PrintDocument1_PrintPage() Handles PrintDocument1.PrintPageDim chars,
91、lines As Integer Dim page As String Dim PageFormat As New StringFormat Dim draw As New RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height) 声明图形对象VB.NET 程序设计(中) Dim size As New SizeF(e.MarginBounds.Width, e.MarginBounds.Height) 定义打印区域 PageFormat.Trimming =
92、 StringTrimming.Word 处理字符串 e.Graphics.MeasureString(mystr, PrintFont, size, PageFormat, chars, lines) page = str.Substring(0, chars) 计算出使用于页面的字符串 e.Graphics.DrawString(page, PrintFont, Brushes.Black, draw, PageFormat) 在当前页打印文档 If chars str.Length Then mystr = str.Substring(chars) 删除已经打完的字符串 e.HasMor
93、ePages = True Else e.HasMorePages = False str = RBoxShow.Text End If End SubEnd ClassVB.NET 程序设计(中) 第第8章章 Windows桌面程序桌面程序开发实例开发实例VB.NET 程序设计(中) 学习目标学习目标l通过实例掌握Windows桌面程序的开发流程;l掌握各种控件在处理实际问题中的应用;l通过实例掌握面向对象程序编写思想与方法。VB.NET 程序设计(中) 8.1 通讯录程序通讯录程序8.1.1 题目要求题目要求设计一个通讯录,运行界面参照图设计一个通讯录,运行界面参照图8.1。该通讯录应该。
94、该通讯录应该具有以下功能:具有以下功能:l通讯录中条记录包括的字段有:姓名、性别、出生日通讯录中条记录包括的字段有:姓名、性别、出生日期、工作单位联系电话、手机、电子邮箱、通讯地址期、工作单位联系电话、手机、电子邮箱、通讯地址和邮政编码和邮政编码l用户可以添加、修改、删除、浏览记录,并可以按照用户可以添加、修改、删除、浏览记录,并可以按照姓名进行查找。姓名进行查找。l每次对通讯录的修改以文本文件的形式保存,以保证每次对通讯录的修改以文本文件的形式保存,以保证数据的长期存储。数据的长期存储。VB.NET 程序设计(中) VB.NET 程序设计(中) 控件类型控件类型属性属性属性值属性值控件类控件
95、类型型属性属性属性值属性值ListBoxNameListBox1ButtonText“修改(&M)”TextBoxNameTxtNameNamebtnModifyTextBoxNameTxtCompanyButtonText“确定修改”TextBoxNameTxtTelNamebtnModOkTextBoxNameTxtMobileButtonText“上一个(&P)”TextBoxNameTxtCodeNamebtnNextRadioButtonNameRadMaleButtonText“删除(&D)”Text“男”NamebtnDelVB.NET 程序设计(中) RadioButton2N
96、ameRadFemaleButtonText“查找(&F)”Text“女”NamebtnFindButtonText添加(&A)ButtonText“保存(&S)”NamebtnAddNamebtSaveButtonText“确定添加”DataTimerPickerNameCbirthdayNamebtnAddOkFormNameForm1Text“通讯录”VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码1.定义全局变量定义全局变量在程序的开始处变量值,采用结构体数组存储每条记录信息,具体代码为:Public _customers(1000) As Custom 定义集合
97、保存记录 Public intcount As Integer 查询变量保存索引 Public i As Integer Public Structure Custom 构建结构 Public name,sex, birthday,company, tel, movebal, email, address, code As String End StructureVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码2.锁定锁定/解锁控件解锁控件Private Sub LockText() 锁定 TxtName.ReadOnly = TxtCompany.ReadOnly =
98、TxtTel.ReadOnly = TxtMobile.ReadOnly = True RadMale.Enabled = RadFemale.Enabled = Cbirthday.Enabled =False TxtEmail.ReadOnly = TxtAddress.ReadOnly = txtCompany.ReadOnly = TxtCode.ReadOnly =True End SubPrivate Sub UnLockText() 解锁 TxtName.ReadOnly = TxtCompany.ReadOnly = TxtTel.ReadOnly = TxtMobile.Re
99、adOnly =False RadMale.Enabled = RadFemale.Enabled = Cbirthday.Enabled = True TxtEmail.ReadOnly = TxtAddress.ReadOnly = TxtCompany.ReadOnly = TxtCode.ReadOnly =FalseEnd SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码3.实现在控件中显示选中记录的功能实现在控件中显示选中记录的功能Public Function ShowCustom(ByVal index As Integer) /显示操作 TxtNa
100、me.Text = _customers(index + 1).name If _customers(index + 1).sex = 男 Then RadMale.Checked = True Else RadFemale.Checked = True End If Cbirthday.Value = _customers(index + 1).birthday TxtCompany.Text = _customers(index + 1).company TxtTel.Text = _customers(index + 1).tel TxtMobile.Text = _customers(
101、index + 1).movebal TxtEmail.Text = _customers(index + 1).email TxtAddress.Text = _customers(index + 1).address TxtCode.Text = _customers(index + 1).code ListBox1.SelectedIndex = index End FunctionVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码4. 实现添加记录的功能实现添加记录的功能 首先定义一个函数CreatCustom(),为数组_customers(i)的各个成员赋值,成
102、员的值来源于定义的变量值,已添加的记录的“姓名”会显示在列表中Public Function CreatCustom(ByVal name As String, ByVal sex As String, ByVal birthday As String, _ ByVal company As String, ByVal tel As String, ByVal movebal As String, ByVal email As String, _ByVal address As String, ByVal code As String) 添加操作 _customers(i).name = na
103、me _customers(i).tel = tel _customers(i).movebal = movebal _customers(i).email = email _customers(i).address = address _customers(i).birthday = birthday _customers(i).sex = sex _customers(i).company = company _customers(i).code = codeVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码4. 实现添加记录的功能实现添加记录的功能 ListBox1.
104、Items.Add(_customers(i).name) 将记录中的“姓名“一项显示在列表中 i = i + 1End Function然后为“添加”按钮的单击事件添加代码。具体代码为:Private Sub btnAdd_Click() Handles btnAdd.Click UnLockText() TxtName.Focus() End Sub最后为“确定添加”按钮的单击事件添加代码。用户单击“确定添加”按钮,完成真正的添加记录操作,具体代码为:Private Sub btnAddOk_Click() Handles btnAddOk.Click Dim sex As String
105、If RadMale.Checked = True Then sex = 男 ElseVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码4. 实现添加记录的功能实现添加记录的功能 sex = 女 End If CreatCustom(TxtName.Text, sex, Cbirthday.Value, TxtCompany.Text, TxtTel.Text, TxtMobile.Text, TxtEmail.Text, TxtAddress.Text, TxtCode.Text) intcount = ListBox1.Items.Count - 1 ListBox1.
106、SelectedIndex = 0 ShowCustom(0) LockText() End FunctionVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码5. 实实现现修修改改记记录录的的功功能能:该该功功能能的的实实现现思思想想与与添添加加记记录录的的思思想想一一致致,首先定义函数首先定义函数ModifyCustom(),用于修改一条记录,用于修改一条记录, Public Function ModifyCustom(ByVal index As Integer, ByVal name As String, ByVal sex As String, _ByVal bi
107、rthday As String, ByVal company As String, ByVal tel As String, ByVal movebal As String, _ByVal email As String, ByVal address As String, ByVal code As String) /修改操作 _customers(index + 1).name = name _customers(i)其他属性修改方法与该语句类似,以下代码省略 _customers(index + 1).tel = tel _customers(index + 1).movebal = m
108、ovebal _customers(index + 1).email = email _customers(index + 1).address = address _customers(index + 1).birthday = birthday _customers(index + 1).sex = sex _customers(index + 1).company = company _customers(index + 1).code = code ListBox1.Items(index) = name End FunctionVB.NET 程序设计(中) 8.1.2 程序分析与代码
109、程序分析与代码5. 实现修改记录的功能:实现修改记录的功能:然后为“修改”按钮的单击事件添加代码,这里只要解锁各个控件即可,具体代码为:Private Sub btnModify_Click() Handles btnModify.Click UnLockText() TxtName.Focus()End SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码5. 实现修改记录的功能:实现修改记录的功能:最后为“确定修改”按钮的单击事件添加代码。用户单击“确定修改”完成真正的修改,该操作主要调用修改函数CreatCustom(),具体代码为:Private Sub btn
110、ModOk_Click() Handles btnModOk.Click Dim sex As String If RadMale.Checked = True Then sex = 男 Else sex = 女 End If ModifyCustom(ListBox1.SelectedIndex, TxtName.Text, sex, Cbirthday.Value, TxtCompany.Text, TxtTel.Text, TxtMobile.Text, TxtEmail.Text, TxtAddress.Text, TxtCode.Text) intcount = ListBox1.I
111、tems.Count - 1 ListBox1.SelectedIndex = 0 ShowCustom(0) LockText()End SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码6.实现删除记录的功能实现删除记录的功能删删除除功功能能在在“删删除除”按按钮钮的的单单击击事事件件中中实实现现。在在有有n条条记记录录的的集集合合中中,删删除除第第i条条记记录录就就是是将将第第i+1条条记记录录至至第第n条条记记录录依依次次向向前移动一个位置。前移动一个位置。 Private Sub btnDel_Click() Handles btnDel.Click Dim
112、 index As Integer index = ListBox1.SelectedIndex ListBox1.Items.RemoveAt(index) ListBox1.SelectedIndex = 0 ShowCustom(0) Dim j As Integer For j = (index + 1) To i - 1VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码 _customers(j).name = _customers(j + 1).name _customers(j).sex = _customers(j + 1).sex _customers(j
113、).birthday = _customers(j + 1).birthday _customers(j).company = _customers(j + 1).company _customers(j).tel = _customers(j + 1).tel _customers(j).movebal = _customers(j + 1).movebal _customers(j).email = _customers(j + 1).email _customers(j).address = _customers(j + 1).address _customers(j).code = _
114、customers(j + 1).code Next i = i - 1 End Sub VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码7. 实现查找记录的功能实现查找记录的功能用户单击“查找”按钮,系统弹出对话框,提示用户输入待查人名,程序将人名记录在变量findname中,由于在列表框ListBox1显示的是记录中的姓名一项,因此在ListBox1中找到findname在列表中的位置即可找到该条记录。Private Sub btnFind_Click() Handles btnFind.Click Dim findname As String findname =
115、InputBox(该搜索是以姓名为索引的 & Chr(10) + Chr(13) & 请输入要搜索的姓名, 搜索) Dim i As Integer Dim intfind As Integer Dim strfind As Boolean = False For i = 0 To ListBox1.Items.Count - 1 ListBox1.SetSelected(i, True) If ListBox1.Items.Item(i) = findname Then VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码strfind = True intfind = i
116、 Exit For End If Next If strfind = True Then If MessageBox.Show(姓名为 & findname & 用户已找到,是否显示结果, 已查找到, MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1) = DialogResult.Yes Then ShowCustom(intfind) /显示记录 LockText() End If Else MessageBox.Show(姓名为 & findname & 的用户不存在.
117、, 未查找到, MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) End IfEnd Sub VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码8.实现保存文件的功能用户每次编辑通讯录后,都应该将记录以外部文件的形式进行保存。“保存”按钮的单击事件将数据存储在“通讯录.txt”文件中。首先用()的方法打开“通讯录.txt”文件,然后通过语句WriteLine()将数组中的每个元素的每个成员写入文件,代码为:VB.NET 程序设计(中) 8.1.2 程序分析与代
118、码程序分析与代码Private Sub btSave_Click() Handles btSave.Click (1, Application.StartupPath & 通讯录.txt, OpenMode.Output) Dim j As Integer For j = 1 To ListBox1.Items.Count WriteLine(1, _customers(j).name) WriteLine(1, _customers(j).sex) WriteLine(1, _customers(j).birthday) WriteLine(1, _customers(j).company)
119、 WriteLine(1, _customers(j).tel) WriteLine(1, _customers(j).movebal) WriteLine(1, _customers(j).email) WriteLine(1, _customers(j).address) WriteLine(1, _customers(j).code) Next j (1)End SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码9. 实现载入数据的功能实现载入数据的功能由于用户的数据最终存储在文本文件“通讯录.txt”中,程序每次运行时要将文本文件中的数据读入程序,将记录中所有
120、的“姓名”字段都显示在列表框ListBox1中,第一条记录的详细信息显示在控件中, Form1_load事件中的代码载入数据,具体代码为:Private Sub Form1_Load() Handles MyBase.Load i = 1 Me.Show() (2, Application.StartupPath & 通讯录.txt, OpenMode.Input) 打开通讯录文件 Do While Not EOF(2) Dim sLine As String sLine = LineInput(2) : _customers(i).name = Mid(sLine, 2, Len(sLine
121、) - 2) sLine = LineInput(2) : _customers(i).sex = Mid(sLine, 2, Len(sLine) - 2)VB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码sLine = LineInput(2) : _customers(i).birthday = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _customers(i).company = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _custome
122、rs(i).tel = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _customers(i).movebal = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _customers(i).email = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _customers(i).address = Mid(sLine, 2, Len(sLine) - 2) sLine = LineInput(2) : _custo
123、mers(i).code = Mid(sLine, 2, Len(sLine) - 2) i = i + 1 Loop (2) Dim j As Integer 将文件内容添加到列表中将文件内容添加到列表中 For j = 1 To i - 1 ListBox1.Items.Add(_customers(j).name) Next ShowCustom(0) 在文本框等中显示第一条记录在文本框等中显示第一条记录 LockText() 锁定文本框等锁定文本框等End SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码10. 为为“上一个上一个”和下一个按钮的和下一个按钮
124、的Click事件添加代码事件添加代码Private Sub btnPre_Click() Handles btnPre.Click “上一个”命令按钮 ListBox1.SelectedIndex = ListBox1.SelectedIndex - 1 ShowCustom(ListBox1.SelectedIndex) LockText() If ListBox1.SelectedIndex = 0 Then btnPre.Enabled = False Else btnPre.Enabled = True End If If ListBox1.SelectedIndex = i Then
125、 btnNext.Enabled = False Else btnNext.Enabled = True End IfEnd SubVB.NET 程序设计(中) 8.1.2 程序分析与代码程序分析与代码Private Sub btnNext_Click() Handles btnNext.Click “下一个”命令按钮 ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1 ShowCustom(ListBox1.SelectedIndex) LockText() If ListBox1.SelectedIndex = 0 Then 判断命令按钮
126、是否可用 btnPre.Enabled = False Else btnPre.Enabled = True End If If ListBox1.SelectedIndex = i - 2 Then btnNext.Enabled = False Else btnNext.Enabled = True End IfEnd SubVB.NET 程序设计(中) 8.2 计算器计算器l8.2.1 题目要求题目要求l设计一个计算器,该计算器可以完成正负实数的算数运算。程序运行界面参见图8.2。程序中涉及到的控件及其属性设置如表8.2所示。VB.NET 程序设计(中) 控件控件属性属性属性值属性值 控
127、件控件属性属性属性值属性值ButtonnamebtNum1ButtonnamebtNegtext“1”text“+-”ButtonnametextbtNum2ButtonnamebtDottext“2”text“.”ButtonnamebtNumButtonnamebtDivtext“3”text“/”ButtonnamebtNum4ButtonnamebtMultext“4”text“*”VB.NET 程序设计(中) ButtonnamebtNum5ButtonnamebtAddtext“5”text“+”ButtonnamebtNum6ButtonnamebtSubtext“6”text“
128、-”ButtonnamebtNum7ButtonnamebtEqutext“7”text“=”ButtonnamebtNum8ButtonnamebtCtext“8”text“C”ButtonnamebtNum9TextboxnametResulttext“9”FormnameForm1ButtonnamebtNum0Text“通讯录”text“0”VB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码1. 定义全局变量定义全局变量全局变量用于记录操作过程中的各种变量值,具体代码为:Public soper As String 记录所要执行的运算 Public bdot, be
129、qu As Boolean 记录用户是否已经输入小数点, 是否已经单击等号 Public dblacc, dbldes,dblresult As Double 被操作数、操作数、运算结果VB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码2. 定义一个程序初始化过程定义一个程序初始化过程subreset()Private Sub subreset() soper = tResult.Text = dblacc = dbldes =0 bdot = bequ =False End SubVB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码l3. 编写窗体编写窗
130、体Load事件事件定义一个按钮数组定义一个按钮数组bt(18),数组元素值为按钮控件,数组元素值为按钮控件Name属性,记录用户对按钮的选择,代码为:属性,记录用户对按钮的选择,代码为:Private Sub formmain_Load() Handles MyBase.Load Dim bt(20) As Button Dim i As Integer bt(1) = btNum1 bt(1)bt(10)的赋值分别为btNum1btNum0,bt(2)bt(10)的赋值代码省略 VB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码bt(11) = btNeg bt(12)
131、= btDot bt(13) = btDiv bt(14) = btMul bt(15) = btAdd bt(16) = btSub bt(17) = btEqu bt(18) = btC For i = 1 To 23 AddHandler bt(i).Click, New System.EventHandler(AddressOf Me.bt_Click) Next subreset()End SubVB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码4. 实现计算功能实现计算功能在按钮数组的Click事件中,实现了计算器的计算功能,字符型变量stext用于记录按钮变量
132、bclick的Text属性值,程序根据stext的值进行分情况讨论。代码为:Private Sub bt_Click() Dim stext As String Dim bclick As Button bclick = sender stext = bclick.Text Select Case stext Case 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 If bequ ThenVB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码 tResult.Text = 如果已经执行一次计算,那么再次输入数字时,应清空tresult End If bequ = F
133、alse tResult.Text = tResult.Text + stext 将输入字符累加 Case . 如果此前有小数点输入,那么这次的小数点输入将被忽略 If Not bdot Then tResult.Text = tResult.Text + stext bdot = True End If Case +, -, *, / dblacc = Val(tResult.Text) tResult.Text = soper = stextVB.NET 程序设计(中) 8.2.2 程序分析与代码程序分析与代码 Case = 如果本次对=的单击是连续的第二次单击,那么操作数不变 bdot
134、= False If Not bequ Then dbldes = Val(tResult.Text) End If bequ = True Select Case soper 根据操作符的不同执行相应的计算 Case + 执行加法操作 dblresult = dblacc + dbldes Case - dblresult = dblacc dbldes 执行减法操作 Case * dblresult = dblacc * dbldes 执行乘法操作 case / dblresult = dblacc / dbldes 执行除法操作VB.NET 程序设计(中) 8.2.2 程序分析与代码程序
135、分析与代码 End Select tResult.Text = dblresult dblacc = dblresult 将计算结果赋给被操作数,以便执行连续的第二次操Case +- 通过对tresult.text字符串的首位的判断来确定当前数值的正负 If tResult.Text.Substring(0, 1) = - Then tResult.Text = tResult.Text.Substring(1, tResult.Text.Length - 1) 如果当前数值为负,则去掉数字最前面的-将其变为正数 Else 如果当前数值为正,则在数字最前面加上-将其变为负数 tResult.T
136、ext = - + tResult.Text End If Case C subreset() 清除所有操作数,被操作数及运算结果,即将计算器重置 End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器8.3.1题目要求题目要求该文本编辑器可以完成以下功能:l建立、打开、保存一个文本文件l具有全选、复制、剪切、粘贴等文字编辑功能l能够运行字体和颜色对话框l具有段落对齐和文档打印功能VB.NET 程序设计(中) 8.3 文本编辑器文本编辑器程序中控件的属性如表 控件类型控件类型属性属性属性值属性值 控件类型控件类型属性属性属性值属性值FormText无标题-记事本SaveNam
137、eSaveRichTextBoxNameRichTextBox1FontDialogNameFontDialog1MenuStripNameMenuStrip1PrintDialogNamePrintDialog1OpenName OpenColorDialogNameColorDialog1VB.NET 程序设计(中) 8.3 文本编辑器文本编辑器窗体上的菜单使用MenuStrip1进行菜单设计, 主菜主菜单单1级子菜单级子菜单2级子菜单级子菜单主菜单主菜单1级子菜单级子菜单2级子菜单级子菜单文件(F)新建(N) Ctrl+N无编辑(E)粘贴(V) Ctrl+V无打开(O) Ctrl+O无全
138、选(A) Ctrl+A无保存(S) Ctrl+S无格式对齐方式左对齐打印(P) Ctrl+P居中退出(X)无右对齐编辑(E)剪切(X) Ctrl+X无字体字体对话框复制(C) Ctrl+C无颜色颜色对话框VB.NET 程序设计(中) 8.3 文本编辑器文本编辑器8.3.2 程序分析与代码程序分析与代码1. 实现实现“新建新建”功能功能“新建”功能的实质是要求记事本清空RichTextBox1中原有的内容也就是执行语句RichTextBox1.Text = ,新建的文件文件名默认为“未命名”,代码为:Private Sub 新建NToolStripMenuItem_Click() Handles
139、 新建NToolStripMenuItem.Click Dim As String RichTextBox1.Text = 清空文本框 = 未命名 Me.Text = End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器2. 实现实现“打开打开“功能功能要求使用Open控件打开一个输入框,选择文件,打开的文件类型为文本文件,具体代码为: Private Sub 打开ToolStripMenuItem_Click() Handles 打开ToolStripMenuItem.Click Dim str As String Open = TXT 打开对话框默认文本类型 Open
140、= 文本文件(*.TXT)|*.TXT 设定合法的文件类型 Open() str = Open RichTextBox1.Load, RichTextBoxStreamType.PlainText) Me.Text = str 标题栏显示文件名 End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器3. 实现实现“保存保存“功能功能要求使用Save控件打开一个保存对话框,Private Sub 保存SToolStripMenuItem_Click() Handles 保存SToolStripMenuItem.Click Save = TXT 设定默认的保存文件类型 Save
141、= 文本文件(*.TXT)|*.TXT 设定合法的保存文件类型 Save() Dim str1 As String str1 = Save RichTextBox1.Save, RichTextBoxStreamType.PlainText) Me.Text = str1 标题栏显示文件名 End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器4. 实现实现“打印打印“功能功能要求使用PrintDialog控件实现打印功能,具体代码为: Private Sub 打印PToolStripMenuItem_Click() Handles 打印PToolStripMenuItem.
142、Click Dim pd As System.Drawing.Printing.PrintDocument pd = New System.Drawing.Printing.PrintDocument() PrintDialog1.Document = pd If (PrintDialog1.ShowDialog() = DialogResult.OK) Then pd.Print() End IfEnd SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器5. 实现实现“退出退出“功能功能要求退出之前询问用户是否存盘,如果用户选择存盘,则要求使用Save控件打开一个保存对话框,保
143、存编辑后的文本文件,否则不保存。Private Sub 退出ToolStripMenuItem_Click() Handles 退出ToolStripMenuItem.Click Dim result As DialogResult result = MessageBox.Show(是否存盘?, 提示, MessageBoxButtons.YesNo) If result = Windows.Forms.DialogResult.Yes Then Save() VB.NET 程序设计(中) 8.3 文本编辑器文本编辑器5. 实现实现“退出退出“功能功能 Dim str1 As String s
144、tr1 = Save RichTextBox1.Save, RichTextBoxStreamType.PlainText) Else Close() End IfEnd SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器6. 实现实现“编辑编辑”菜单功能菜单功能“编辑”菜单包括“剪切”、“复制”、“粘贴”和“全选”功能,具体代码为:Private Sub 剪切XToolStripMenuItem_Click() Handles 剪切XToolStripMenuItem.Click RichTextBox1.Cut()End SubPrivate Sub 复制CToolStrip
145、MenuItem_Click() Handles 复制CToolStripMenuItem.Click RichTextBox1.Copy()End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器6. 实现实现“编辑编辑”菜单功能菜单功能Private Sub 粘贴VToolStripMenuItem_Click() Handles 粘贴VToolStripMenuItem.Click RichTextBox1.Paste()End SubPrivate Sub 全选AToolStripMenuItem_Click() Handles 全选AToolStripMenuItem
146、.Click RichTextBox1.SelectAll()End SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器7. 实现实现“格式格式”菜单中的菜单中的“对齐对齐”子菜单功能子菜单功能Private Sub 左对齐ToolStripMenuItem_Click() Handles 左对齐ToolStripMenuItem.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.LeftEnd SubPrivate Sub 居中ToolStripMenuItem_Click() Handles 居中ToolS
147、tripMenuItem.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.CenterEnd SubPrivate Sub 右对齐ToolStripMenuItem_Click() Handles 右对齐ToolStripMenuItem.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.RightEnd SubVB.NET 程序设计(中) 8.3 文本编辑器文本编辑器8. 实现实现“格式格式”菜单中的菜单中的“字体字体”和和“颜色颜色”子菜单子菜单选择
148、“格式”菜单的“字体”选项,应该弹出字体对话框,用户可以进行字体设置,选择“颜色”选项,弹出“颜色”对话框,用户进行颜色设置,具体代码为:Private Sub 字体ToolStripMenuItem_Click_1() Handles 字体ToolStripMenuItem.Click FontDialog1.ShowDialog() RichTextBox1.SelectionFont = FontDialog1.FontEnd SubPrivate Sub 颜色ToolStripMenuItem_Click_1() Handles 颜色ToolStripMenuItem.Click Co
149、lorDialog1.ShowDialog() RichTextBox1.SelectionColor = ColorDialog1.ColorEnd SubVB.NET 程序设计(中) 8.4 扫雷程序扫雷程序8.4.1 题目要求题目要求编写一个类似Windows系统的扫雷程序,该程序可以完成以下功能l程序运行初始状态只具有“开始”和“布雷”两个按钮,参见图8.4(a);l单击“开始”按钮后由程序生成由9*9个复选框构成的雷区,参见8.4(b);l单击“布雷”按钮后由程序随机布雷,用户单击左键开始扫雷,右键进行标雷l用户点击连续无雷区的任意一个复选框,其周边的复选框自动打开;l用户触雷,弹出
150、提示对话框,程序结束。VB.NET 程序设计(中) VB.NET 程序设计(中) 控件类型控件类型属性属性属性值属性值FormNameFormText“扫雷”ButtonNameBtnStartText“开始”ButtonNameBtnBombText“布雷”VB.NET 程序设计(中) 8.3.2 程序分析与代码程序分析与代码1定义变量定义变量定义一个复选框类型的二维数组,作为雷区,语句为:Private chks(8, 8) As CheckBox2实现生成雷区的功能实现生成雷区的功能雷区是在用户单击“开始”按钮的情况下自动生成的一个9*9个复选框构成的方阵,具体代码为Private Su
151、b BtnStart_Click() Handles BtnStart.Click Dim i, j As Integer For i = 0 To 8 For j = 0 To 8 If chks(i, j) Is Nothing Then 数组chk(i,j)中还没有数据,即不存在9*9的复选框 chks(i, j) = New CheckBox() 循环生成复选框赋值给数组 VB.NET 程序设计(中) 8.3.2 程序分析与代码程序分析与代码 Else chks(i, j).Enabled = True 数组chk(i,j)中已有数据,即存在9*9的复选框,则设置这9*9个复选框为可用
152、 End If AddHandler chks(i, j).MouseUp, AddressOf ChksMouseUp 动态将chk中每一个复选框的MouseUp与ChksMouseUp过程关联设置每一个复选框的属性chks(i, j).Checked = False chks(i, j).BackColor = Color.LightGray chks(i, j).Width = 20 chks(i, j).Height = 20 chks(i, j).Top = i * 20 chks(i, j).Left = j * 20 chks(i, j).Text = VB.NET 程序设计(中
153、) 8.3.2 程序分析与代码程序分析与代码3实现布雷的功能实现布雷的功能用户单击“布雷”按钮,程序进行布雷。经过分析得知,一个复选框周围最多有6个雷,通过随机数进行布雷,具体代码为:Private Sub Btnbomb_Click() Handles Btnbomb.Click Dim i, j As Integer Dim col, row As Integer Randomize() j = 0 While j 8 Or i 8 Or j 8 Or i 8 Or j 0) Then Dim chk As CheckBox = chks(i, j) If chk.Enabled Then
154、 chk.Enabled = False chk.Checked = True chk.Text = AutoOpen(i, j) End If End If Next Next End If Return sumEnd FunctionVB.NET 程序设计(中) 8.3.2 程序分析与代码程序分析与代码 Dim f As New Font(黑体, 12, FontStyle.Bold) chks(i, j).Font = f chks(i, j).Appearance = Appearance.Button 复选框外观设置为按钮形式 Me.Controls.Add(chks(i, j) chks(i, j).Show() chks(i, j).Tag = 0 0表示没有雷 Next NextEnd SubVB.NET 程序设计(中)