visual.basic.net程序设计教程


21 世纪高职高专规划教材·计算机系列 Visual Basic .NET 程序设计教程 李兰友 王春娴 郑志荣 编著 清华大学出版社 北京交通大学出版社 ·北京· 21 世纪高职高专规划教材·计算机系列 编审委员会成员名单 主任委员 李兰友 边奠英 副主任委员 周学毛 崔世钢 王学彬 丁桂芝 赵 伟 韩瑞功 汪志达 委 员 (按姓名笔画排序) 马 辉 万志平 万振凯 王永平 王建明 尤晓 丰继林 尹绍宏 左文忠 叶 华 叶 伟 叶建波 付晓光 付慧生 冯平安 江 中 佟立本 刘 炜 刘建民 刘 晶 曲建民 孙培民 邢素萍 华铨平 吕新平 陈国震 陈小东 陈月波 李长明 李 可 李志奎 李 琳 李源生 李群明 李静东 邱希春 沈才梁 宋维堂 汪 繁 吴学毅 张文明 张权范 张宝忠 张家超 张 琦 金忠伟 林长春 林文信 罗春红 苗长云 竺士蒙 周智仁 孟德欣 柏万里 宫国顺 柳 炜 钮 静 胡敬佩 姚 策 赵英杰 高福成 贾建军 徐建俊 殷兆麟 唐 健 黄 斌 章春军 曹豫莪 程 琪 韩广峰 韩其睿 韩 劼 裘旭光 童爱红 谢 婷 曾瑶辉 管致锦 熊锡义 潘玫玫 薛永三 操静涛 鞠洪尧 内 容 简 介 本书主要介绍 Visual Basic .NET 应用程序设计技术。内容包括:Visual Basic .NET 集成环境,常用 Windows 窗体控件,工程界面设计,Visual Basic .NET 程序设计基础,图形、图像处理,数据库应用及应用程序设计 实践等。完成本书的学习和实践后,学生可以在 Visual Basic .NET 的应用程序开发技能方面得到较大提高。 本书可以作为高职、高专院校计算机程序设计语言课程教科书,亦适合于工程技术人员参考。 版权所有,翻印必究。举报电话:010-62782989 13501256678 13801310933 本书封面贴有清华大学出版社防伪标签,无标签者不得销售。 本书防伪标签采用特殊防伪技术,用户可通过在图案表面涂抹清水,图案消失,水干后图案复现;或将 表面膜揭下,放在白纸上用彩笔涂抹,图案在白纸上再现的方法识别真伪。 图书在版编目(CIP)数据 Visual Basic .NET 程序设计教程 / 李兰友 , 王春娴 , 郑志荣编著 . — 北京 : 清华大 学出版社 ; 北京交通大学出版社, 2005.5 (21 世纪高职高专规划教材·计算机系列) ISBN 7-81082-515-1 Ⅰ.V… Ⅱ.① 李… ② 王… ③ 郑… Ⅲ.BASIC 语言-程序设计-高等学校;技 术学校-教材 Ⅳ.TP312 中国版本图书馆 CIP 数据核字(2005)第 031130 号 责任编辑:韩 乐 特邀编辑:朱 宇 出 版 者:清华大学出版社 邮编:100084 电话:010-62776969 北京交通大学出版社 邮编:100044 电话:010-51686414 印 刷 者:北京东光印刷厂 发 行 者:新华书店总店北京发行所 开 本:185×260 印张:15.25 字数:381 千字 版 次:2005 年 5 月第 1 版 2005 年 5 月第 1 次印刷 书 号:ISBN 7-81082-515-1 / TP·192 印 数:1~5000 册 定价:21.00 元 本书如有质量问题,请向北京交通大学出版社质监组反映。对您的意见和批评,我们表示欢迎和感谢。 投诉电话:010-51686043,51686008;传真:010-62225406;E-mail:press@center.bjtu.edu.cn。 出 版 说 明 高职高专教育是我国高等教育的重要组成部分,它的根本任务是培养生产、建设、管理 和服务第一线需要的德、智、体、美全面发展的高等技术应用型专门人才,所培养的学生在 掌握必要的基础理论和专业知识的基础上,应重点掌握从事本专业领域实际工作的基本知识 和职业技能,因而与其对应的教材也必须有自己的体系和特色。 为了适应我国高职高专教育发展及其对教学改革和教材建设的需要,在教育部的指导下, 我们在全国范围内组织并成立了“21 世纪高职高专教育教材研究与编审委员会”(以下简称 “教材研究与编审委员会”)。“教材研究与编审委员会”的成员单位皆为教学改革成效较 大、办学特色鲜明、办学实力强的高等专科学校、高等职业学校、成人高等学校及高等院校 主办的二级职业技术学院,其中一些学校是国家重点建设的示范性职业技术学院。 为了保证规划教材的出版质量,“教材研究与编审委员会”在全国范围内选聘“21 世纪 高职高专规划教材编审委员会”(以下简称“教材编审委员会”)成员和征集教材,并要求 “教材编审委员会”成员和规划教材的编著者必须是从事高职高专教学第一线的优秀教师或 生产第一线的专家。“教材编审委员会”组织各专业的专家、教授对所征集的教材进行评选, 对列选教材进行审定。 目前,“教材研究与编审委员会”计划用 2~3 年的时间出版各类高职高专教材 200 种, 范围覆盖计算机应用、电子电气、财会与管理、商务英语等专业的主要课程。此次规划教材 全部按教育部制定的“高职高专教育基础课程教学基本要求”编写,其中部分教材是教育部 《新世纪高职高专教育人才培养模式和教学内容体系改革与建设项目计划》的研究成果。此 次规划教材编写按照突出应用性、实践性和针对性的原则编写并重组系列课程教材结构,力 求反映高职高专课程和教学内容体系改革方向;反映当前教学的新内容,突出基础理论知识 的应用和实践技能的培养;适应“实践的要求和岗位的需要”,不依照“学科”体系,即贴 近岗位,淡化学科;在兼顾理论和实践内容的同时,避免“全”而“深”的面面俱到,基础 理论以应用为目的,以必要、够用为度;尽量体现新知识、新技术、新工艺、新方法,以利 于学生综合素质的形成和科学思维方式与创新能力的培养。 此外,为了使规划教材更具广泛性、科学性、先进性和代表性,我们希望全国从事高职 高专教育的院校能够积极加入到“教材研究与编审委员会”中来,推荐“教材编审委员会” 成员和有特色、有创新的教材。同时,希望将教学实践中的意见与建议及时反馈给我们,以 便对已出版的教材不断修订、完善,不断提高教材质量,完善教材体系,为社会奉献更多更 新的与高职高专教育配套的高质量教材。 此次所有规划教材由全国重点大学出版社——清华大学出版社与北京交通大学出版社联 合出版,适合于各类高等专科学校、高等职业学校、成人高等学校及高等院校主办的二级职 业技术学院使用。 21 世纪高职高专教育教材研究与编审委员会 2005 年 3 月 前 言 Visual Basic .NET 是 Microsoft 公司近年推出的一种核心编程语言,它能快捷、方便地开 发图形设计、图像处理、多媒体技术、数据库技术及网络技术的 Windows应用程序。本书以 Visual Studio .NET 为开发平台,以实例为中心,重点介绍使用 Visual Basic .NET 开发 Windows 应用程序的方法和技术。 全书共分 11 章。第 1 ~ 2 章介绍 Visual Basic .NET 集成开发环境、常用 Windows 窗体控 件及应用控件;第 3 章介绍 Windows 应用程序界面设计方法及实例;第 4~5 章介绍 Visual Basic .NET 语言程序设计基础及程序流控制;第 6~7 章介绍数组、结构和过程;第 8 章介绍 如何使用 Visual Basic .NET 进行图形设计;第 9 章介绍 Visual Basic .NET 在图像处理方面的 技术及应用实例;第 10 章介绍数据库应用;第 11 章是应用程序设计实践,介绍包括文本编 辑器、管理统计图、动画设计及小型图案自动生成系统设计等 4 个应用程序实例,可作为学 生综合设计练习或实训参考。本书所提供的程序实例简明易读,所有程序均在 Visual Basic .NET 环境下上机通过。 本书可作为高职、高专院校计算机程序设计语言课程教科书,亦适合于工程技术人员参 考。 参加编写工作的还有刘东鹏、庞冠琪、刘培、高魁钧、齐猛、成玲等,宋伟、李体新、 马文辉等进行了程序调试。由于作者水平有限,不当之处敬请读者指正。 作 者 2005.4 I 目 录 第1章 Visual Basic .NET 基础·······················································································1 1.1 Visual Basic .NET 的新发展 ·················································································1 1.1.1 新特性·········································································································1 1.1.2 集成开发环境的新改进 ····················································································2 1.2 Visual Studio 集成环境 ························································································3 1.2.1 标题栏、菜单栏和工具栏·················································································3 1.2.2 主要窗口······································································································6 1.3 创建应用程序···································································································10 1.3.1 创建一个应用程序的步骤···············································································10 1.3.2 项目文件····································································································17 1.4 帮助菜单··········································································································18 1.5 面向对象的程序设计·························································································21 1.5.1 .NET 框架结构·····························································································21 1.5.2 对象的概念·································································································22 练习题·····················································································································23 第 2 章 窗体和常用控件································································································25 2.1 窗体·················································································································25 2.1.1 创建窗体····································································································26 2.1.2 属性··········································································································27 2.1.3 常用事件····································································································30 2.1.4 常用方法····································································································30 2.1.5 将控件加入窗体···························································································32 2.2 Button 控件·······································································································33 2.3 文本控件··········································································································35 2.3.1 Label 控件 ··································································································35 2.3.2 TextBox 控件·······························································································35 2.4 选择控件··········································································································38 2.4.1 RadioButton 控件和 GroupBox 控件···································································38 2.4.2 CheckBox 控件 ····························································································40 2.5 列表选择控件···································································································42 2.5.1 ListBox 控件·······························································································42 2.5.2 ComboBox 控件 ···························································································44 2.6 图形显示控件和定时器·····················································································46 2.6.1 PictureBox 控件····························································································46 2.6.2 定时控件····································································································47 II 2.7 对话框··············································································································48 2.7.1 消息框·······································································································49 2.7.2 文件打开和保存对话框 ··················································································49 2.7.3 【颜色】对话框···························································································51 2.7.4 【字体】对话框···························································································52 2.7.5 【打印】对话框···························································································54 练习题·····················································································································55 第 3 章 项目界面设计····································································································60 3.1 按钮界面··········································································································60 3.2 菜单界面··········································································································65 3.3 单选按钮界面···································································································67 3.4 MDI 界面·········································································································69 3.4.1 建立 MDI 父窗体··························································································70 3.4.2 建立 MDI 子窗体··························································································71 3.5 工具栏界面·······································································································73 3.6 状态栏界面·······································································································76 练习题·····················································································································79 第 4 章 程序设计基础····································································································82 4.1 标识符命名·······································································································82 4.2 数据类型··········································································································82 4.2.1 基本数据类型······························································································82 4.2.2 用户自定义数据类型·····················································································83 4.3 常量·················································································································84 4.3.1 直接常量····································································································84 4.3.2 符号常量····································································································85 4.4 变量·················································································································86 4.5 运算符和表达式································································································88 4.5.1 算术运算符和算术表达式···············································································88 4.5.2 字符串运算符和字符串表达式·········································································89 4.5.3 关系运算符和关系表达式···············································································89 4.5.4 逻辑运算符和逻辑表达式···············································································89 4.5.5 运算符的优先级···························································································90 4.6 函数·················································································································90 4.6.1 数学函数····································································································90 4.6.2 取整函数····································································································91 4.6.3 转换函数····································································································92 4.6.4 数值计算函数······························································································93 4.6.5 字符操作函数······························································································94 4.6.6 日期和时间函数···························································································96 III 练习题·····················································································································97 第 5 章 基本流程控制····································································································98 5.1 语句·················································································································98 5.2 顺序结构··········································································································99 5.2.1 基本语句····································································································99 5.2.2 InputBox 函数···························································································· 101 5.2.3 MsgBox 函数····························································································· 102 5.3 选择结构········································································································ 103 5.3.1 行If 语句 ································································································· 104 5.3.2 块If 语句 ································································································· 104 5.3.3 If…Then…ElseIf 语句·················································································· 106 5.3.4 Select Case 语句 ························································································· 107 5.3.5 GoTo 语句 ································································································ 109 5.4 循环结构········································································································ 110 5.4.1 For…Next 循环语句···················································································· 110 5.4.2 Do…Loop 循环 ·························································································· 112 5.4.3 While…End While 语句 ················································································ 115 5.4.4 循环嵌套·································································································· 115 练习题··················································································································· 117 第 6 章 数组和结构····································································································· 118 6.1 数组··············································································································· 118 6.1.1 定长数组·································································································· 118 6.1.2 动态数组·································································································· 122 6.2 结构··············································································································· 123 6.2.1 结构类型的声明························································································· 123 6.2.2 结构变量的声明························································································· 124 练习题··················································································································· 125 第 7 章 过程················································································································ 127 7.1 过程的定义与调用·························································································· 127 7.1.1 Sub 过程 ·································································································· 127 7.1.2 Function 过程 ···························································································· 129 7.2 过程参数········································································································ 131 7.2.1 参数传递方式···························································································· 131 7.2.2 可选参数和参数数组··················································································· 134 练习题··················································································································· 136 第 8 章 图形设计········································································································· 138 8.1 图形环境设置································································································· 138 8.1.1 图形装置接口···························································································· 138 8.1.2 画笔········································································································ 140 IV 8.1.3 画刷········································································································ 143 8.2 Graphics 对象的图形方法················································································ 147 8.2.1 Point 结构································································································· 147 8.2.2 DrawLine 方法··························································································· 147 8.2.3 画椭圆和圆弧的方法··················································································· 149 8.2.4 Rectangle 方法 ··························································································· 150 8.2.5 DrawBezier 方法························································································· 151 8.2.6 DrawPolygon 方法······················································································· 152 8.2.7 DrawCurve 方法和 DrawClosedCurve 方法 ······················································· 152 8.3 填充图形········································································································ 154 8.3.1 画填充椭圆和填充饼图················································································ 154 8.3.2 FillRectangle 方法 ······················································································· 155 8.3.3 FillClosedCurve 和 FillPolygon 方法································································· 156 8.4 交互绘图········································································································ 157 8.4.1 鼠标事件·································································································· 157 8.4.2 鼠标绘图示例···························································································· 157 练习题··················································································································· 161 第 9 章 图像处理········································································································· 165 9.1 图像处理基础································································································· 165 9.1.1 图像文件类型···························································································· 165 9.1.2 位图图像的装入························································································· 165 9.1.3 位图图像的保存························································································· 168 9.1.4 使用Clipboard 对象的复制和粘贴··································································· 169 9.2 彩色位图图像处理 ·························································································· 171 9.2.1 位图图像处理基础······················································································ 171 9.2.2 彩色图像变换···························································································· 173 9.3 彩色图像的几何变换······················································································· 177 9.3.1 图形的几何变换基础··················································································· 177 9.3.2 图像的几何变换程序设计············································································· 178 练习题··················································································································· 182 第 10 章 数据访问······································································································· 187 10.1 ADO .NET 概述 ···························································································· 187 10.1.1 功能简介 ································································································ 187 10.1.2 主要对象 ································································································ 188 10.2 数据组件 ······································································································ 188 10.2.1 Connection 对象························································································ 189 10.2.2 Command 对象························································································· 190 10.2.3 DataReader 对象························································································ 191 10.3 SQL 语言数据查询语句简介·········································································· 191 V 10.3.1 关系数据库 ····························································································· 192 10.3.2 数据定义功能 ·························································································· 192 10.3.3 数据操纵功能 ·························································································· 193 10.4 数据库操作实例···························································································· 193 练习题··················································································································· 196 第 11 章 应用程序设计实训························································································· 197 11.1 文本编辑器设计···························································································· 197 11.1.1 任务及项目界面设计·················································································· 197 11.1.2 RichTextBox 控件简介················································································ 199 11.1.3 RichTextBox 控件应用················································································ 201 11.1.4 文本编辑器功能程序设计············································································ 202 11.2 统计图的绘制······························································································· 205 11.2.1 功能和界面设计 ······················································································· 205 11.2.2 MSChart 定制控件和 DataGrid 控件 ······························································· 206 11.2.3 设计代码 ································································································ 211 11.3 图像动画设计······························································································· 215 11.3.1 窗体设计 ································································································ 215 11.3.2 程序设计及运行 ······················································································· 216 11.4 美术图案程序设计························································································· 218 11.4.1 美术图案单元的生成·················································································· 218 11.4.2 图案单元的屏幕设置·················································································· 225 练习题··················································································································· 229 参考文献······················································································································· 232 第 1 章 Visual Basic .NET 基础 本章要点: þ Visual Basic .NET 的新发展 þ Visual Basic .NET 的窗口对象 þ Visual Basic .NET 工程的创建 Visual Basic .NET 是 Microsoft(微软)公司系列可视化开发工具 Visual Studio .NET 中的 产品,是创建 Windows 应用程序最简便、最快捷的开发工具之一。本章介绍 Visual Basic .NET 的基础知识和基本操作。 1.1 Visual Basic .NET 的新发展 1.1.1 新特性 Visual Basic .NET(简称 VB .NET)是当今最流行的软件开发工具之一,它强大的功能大 大加速了程序员的开发工作,提高了程序代码的效率。 与 Visual Basic 6.0 相比,Visual Basic .NET 具有以下新特性。 1.完全面向对象 Visual Basic .NET 是一种完整的面向对象语言。Visual Basic .NET 支持许多新型面向对象 语言的特性,例如继承、重载、重载关键字、接口、共享成员和构造函数。 2.结构化异常处理 Visual Basic 支持使用 Try_Catch_Finally 的增强版本进行结构化异常处理,使得程序更加 稳固而不会轻易崩溃。 3.增加了新的数据类型 Visual Basic .NET 中引入了 Char(无符号 16 位整数)、 Short(有符号 16 位整数)等新的 数据类型。 4.引入了新的概念 在 Visual Basic .NET 中使用了引入、名称空间、部件、标志等新概念。 5.自由线程处理 Visual Basic .NET 中可以编写独立执行多个任务的应用程序。自由线程处理使得应用程序 对用户输入的响应更加灵敏。 6.Visual Basic .NET 中的语言更新 在 Visual Basic .NET 中主要修改了与其他主流编程语言间的差别,以提供更完备的语言 Visual Basic .NET 程序设计教程 2 互用性、代码可读性与可靠性,以及与.NET 框架的无缝兼容性。 7.采用了新的 IDE 开发环境 Visual Basic .NET 采用与 VC++ .NET、VC# .NET 相同的集成开发环境。 上述新特性使 Visual Basic .NET 更加适应现代计算机网络化、运行速度快及加强数据传 输的趋势,成为软件开发的首选工具。 1.1.2 集成开发环境的新改进 Visual Basic .NET 与 Visual C# .NET 使用相同的用户界面, 即 Visual Studio .NET 的集成开 发环境(Integrated Development Environment,IDE)。 使 用 同 一 个 IDE,为开发者提供了很大的 方便。Visual Studio 具有包括源码创建、资源编辑、编译、链接和调试等在内的许多功能。 1.通用集成开发环境工具 Visual Studio .NET 中新增加的工具为开发者提供了很大方便。 (1)Web 浏览器 Visual Studio .NET 的 IDE 能够直接显示网页。要使 Web 浏览器在 IDE 中出现,只要选 择【视图】菜单中的【Web 浏览器】选项即可。 (2)Visual Studio 起始页 在默认情况下,每次 Visual Studio 启动时,Visual Studio 起始页都显示在其用户界面的 Web 浏览器窗口中。它提供了设置诸如 IDE 行为、键盘类型、窗口布局等用户参数,以及进行打开、 新建项目等操作的快捷途径。通过起始页,还能查看新增功能、标题新闻、下载和联机搜索等。 (3)命令窗口 命令窗口具有两个模式:命令模式和即时模式。在命令模式下,用户能在右尖括号“>” 后输入 IDE 命令名。 2.窗口管理 Visual Studio .NET 对窗口管理的改进,使得屏幕一次能够打开许多窗口。图 1-1 为 Visual Studio .NET 中的窗口布局,其中包括集成开发环境中的主要窗口。 图 1-1 Visual Studio .NET 窗口布局 第 1 章 Visual Basic .NET 基础 3 (1)标签化文档 标签化文档功能自动在 IDE 中为文档窗口设置标签。例如默认情况下,【类视图】、【资源 视图】和【解决方案资源管理器】使用同一窗口,通过切换底部的标签可以在此窗口中查看 不同视图中的内容,如图 1-1 右下角所示。用户在编辑器或设计器中编辑多个文档时,它们 将全部显示于多文档界面(MDI)区域中。虽然一次只能显示一个文档中的内容,但通过顶 部/底部标签可以方便地浏览其他文档中的内容。 (2)自动隐藏 在窗口标题栏处单击鼠标右键,在弹出的快捷菜单中选择【自动隐藏】命令,可以实现 自动隐藏。自动隐藏允许用户最小化工具窗口,例如解决方案资源管理器和工具箱,并将其 排列在 IDE 边缘,从而节省了宝贵的屏幕空间,提高了编辑器的可视面积。 (3)前进/后退导航 前进/后退导航允许用户在打开的窗口中,或同一文件中的被选文本和光标位置中进行切 换。 3.采用应用程序模板 Visual Studio .NET 通过模板为应用程序提供了结构化控制。通过使用企业模板,可以降 低开发难度和成本。 4.编辑工具 Visual Studio .NET 的所有产品都使用同样的搜索和替换工具检索文本、帮助和对象。 (1)代码编辑器 Visual Studio .NET 中所有的语言都使用统一的代码编辑器。编辑器具有新的增强功能, 例如字回绕、增量搜寻、代码纲要和书签功能等。编辑器的另一个强大的功能是拥有剪贴板 循环(Clipboard Ring),它能够存储系统剪贴板中被复制或剪切的最后 20 个条目。 (2)编辑 HTML HIML设计器有设计和 HTML两个视图,从而保证了网页设计时的灵活性。 (3)编辑层叠样式表 创建样式表时,可以使用样式菜单选择创建风格。风格创建器将给出为不同 HTML 元素 构造不同风格准则的方法。在 CSS 编辑器的主窗口中编辑表单时,可以使用风格创建器或手 动输入 CSS 风格准则。 (4)编辑 XML XML 编辑器允许用户在 IDE 中创建 XML纲要、数据集和文档。在编辑 HTML 和 XML 文档时,用户可以制定将使用的 XML 纲要定义。 1.2 Visual Studio 集成环境 1.2.1 标题栏、菜单栏和工具栏 主窗口的标题栏、菜单栏和工具栏位于集成开发环境用户界面的顶部。 1.标题栏 标题栏就是窗口顶部的水平条,显示出当前激活的项目名称、应用软件名称及工作状态。 Visual Basic .NET 程序设计教程 4 VB .NET 有设计状态、运行状态和中断状态 3 种工作状态。 (1)设计状态 如图 1-2 所示,在此状态下可以进行项目的界面设计和代码设计。进入设计状态常用的 两种方法如下。 图 1-2 “设计”标题栏 ① 新建项目。启动 VB .NET,系 统 进入设计状态,标题栏显示起始页。选择菜单栏的【文 件】的【新建】子菜单的【项目】,显示【新建项目】对话框。在【新建项目】对话框中的【项 目类型】列表框中选择【Visual Basic 项目】,在【模板】栏中选择【Windows 应用程序】,然 后依次填写项目名称和位置,单击【确定】按钮。 ② 打开一个已建立的项目。 (2)运行状态 完成项目的界面设计和代码设计后,选择【调试】菜单的【启动】项,系统进入运行状 态。如图 1-3 所示。在此状态下运行项目,显示运行结果。单击【停止调试】按钮 即可, 返回设计状态。 图 1-3 “运行”标题栏 (3)中断状态 中断程序运行状态如图 1-4 所示。单击【停止调试】按钮 ,即可返回设计状态。 2.菜单栏 菜单栏中包含【文件】、【编辑】、【视图】、【项目】、【生成】、【调试】、【帮助】等菜单项, 如图 1-5 所示。 第 1 章 Visual Basic .NET 基础 5 图 1-4 “中断”标题栏 图1-5 菜单栏 菜单各项的主要功能说明如下。 (1)【文件】菜单 【文件】菜单用于新建、打开、保存、显示最近的项目。例如,选择【新建】子菜单项 可以建立新项目或新文件;例如,选择【打开】子菜单项将分别打开本地或网络中的项目和 文件;选择【全部保存】子菜单将保存当前打开的所有文件等。 (2)【编辑】菜单 用于程序源代码编辑。【编辑】菜单可以剪切、复制、粘贴、选择、查找和替换文字等。 (3)【视图】菜单 【视图】菜单可以打开各种窗格供用户使用。例如,选择【解决方案资源管理器】子菜 单将打开【解决方案资源管理器】窗格;选择【类视图】子菜单打开【类视图】窗格;选择 【属性】子菜单将打开【属性】窗格;选择【工具箱】子菜单将打开【工具箱】窗格等。 (4)【项目】菜单 【项目】菜单用于添加控件、模块和窗体等对象。主要子菜单命令有:【 添 加 Windows 窗体】、【添加继承的窗体】、【添加用户控件】、【添加组件】、【添加模块】、【设为启动项目】 等。 (5)【生成】菜单 【生成】菜单用于编译和链接所有在工程中修改过的文件,并在输出窗口中显示警告信 息和错误信息;重新编译当前项目。 (6)【调试】菜单 【调试】菜单用于编译并运行当前工程,显示当前系统中存在的进程,异常处理,跟踪 程序的运行,逐语句调试,在程序中设置新断点或清除程序中的所有断点等。 (7)【工具】菜单 【工具】菜单用于扩展工具。例如,选择【调试进程】子菜单项,可以显示进程对话框; 选择【自定义工具箱】子菜单,可以显示自定义工具箱窗口等。 Visual Basic .NET 程序设计教程 6 (8)【窗口】菜单 【窗口】菜单用于窗口操作。例如,选择【新建窗口】子菜单,将打开与当前窗口包含 相同文档的另一个窗口,并使其成为当前窗口;选择【拆分】子菜单,将窗口拆分为多个窗 格,以便同时查看同一文档的不同部分。该菜单还可以进行隐藏当前活动窗口、允许/禁止当 前活动窗口的浮动特征等。 (9)【帮助】菜单 【帮助】菜单用于选择各种帮助。 3.工具栏 工具栏位于菜单栏的下方,以图标方式提供常用的工具。工具栏中常用的图标按钮及功 能说明如图 1-6 所示。 图 1-6 工具栏按钮说明 1.2.2 主要窗口 1.开始窗口 如图 1-7 所示,【起始页】窗口中左侧各选项说明如下。 u【开始】——显示最近打开过的项目名,并列出最近的修改日期。单击项目名称,即 可打开该项目。单击【打开项目】按钮,将显示【打开项目】对话框,以打开现存项 目;单击【新建项目】按钮,将显示【新建项目】对话框,可以创建新项目。 u【新增功能】——显示有关 Visual Studio .NET 的最新更新及其相关信息网页。 u【网上社区】——显示为 Visual Studio .NET 开发人员选择的新闻组和 Web 站点。 u【标题新闻】——显示从 Visual Studio .NET 开发人员网络 Web 站点得到的信息。 u【联机搜索】——提供在线搜索 MSDN 数据库的功能。 u【下载】——提供一些链接可下载与开发相关的内容或代码示例。 u XML Web services——搜索当前项目中使用的 XML Web services。 u【Web 宿主】——提供有关 Web 宿主选项信息。 2.设计器窗口 设计器窗口用于进行项目的界面设计。图 1-8 是一个名为“日历”的新建项目的初始界 面,只有一个窗体 Form1。在该界面上,可以放置从打开的工具箱窗口中选择的控件对象。 放置从打开的工具箱窗口中选择的控件对象的过程就是项目界面设计的过程。 通常,打开设计器窗口有下面两种方法。 (1)选择【视图】菜单的【设计器】选项可以打开设计器窗口。 (2)选择选项卡 。 第 1 章 Visual Basic .NET 基础 7 图 1-7 开始窗口 图 1-8 设计器窗口 3.代码编辑器窗口 开发应用程序的源代码的编辑工作都是在代码编辑器窗口中进行的。代码编辑器窗口如 图 1-9 所示。 通常,打开代码编辑器窗口使用的方法如下。 (1)选择【视图】菜单的【代码】选项可以打开代码编辑器窗口。 Visual Basic .NET 程序设计教程 8 (2)选择选项卡 。 (3)双击窗体上的对象,例如窗体、命令按钮等。 图 1-9 代码编辑器窗口 单击代码编辑器窗口左侧的下拉按钮 可以显示项目的“类名”,如图 1-10 所示。 图 1-10 对象选择 单击代码编辑器窗口右侧的下拉按钮 可以显示类的“方法名称”,如图 1-11 所示。 第 1 章 Visual Basic .NET 基础 9 图 1-11 方法和事件选择 4.【属性】窗格 使用【属性】窗格,可以在设计时查看和修改编辑器和设计器中所选对象的属性。窗体 对象的【属性】窗格如图 1-12 所示。在界面设计时,选择不 同的控件对象将显示相应的【属性】窗格。 选择【属性】窗格工具栏的图标 按钮,属性将按分类 列表;选择【属性】窗格工具栏的图标 按钮,属性将按字 母顺序列表。 打开【属性】窗格通常使用下面两种方法。 (1)选择【视图】菜单的【属性窗口】选项。 (2)在项目界面设计时,用鼠标右击对象,在弹出的快 捷菜单中选择【属性】选项。 5.【工具箱】窗格 选择【视图】菜单的【工具箱】选项可以打开【工具箱】 窗格。【工具箱】窗 格中一般包括【 数据】、【组件】、【Windows 窗体】、【剪贴板循环】和【常规】5 个选项卡。其他选项卡 例如【Web 窗体】和 HTML 选项卡则在建立 Web 项目时出 现。例如,当编辑 HTML 文档时,将显示 HTML 选项卡。 不同选项卡下的控件列表不同。图 1-13 所示为设计 Windows 应用程序时选择【 Windows 窗体】 选项卡的情形。 6.【解决方案资源管理器】窗格 Visual Studio .NET 中引入了解决方案资源管理器,以管理和监控方案中的项目。项目就 是 Visual Studio .NET 应用程序的构造块。选择【视图】菜单的【解决方案资源管理器】选项, 图 1-12 【属性】窗格 Visual Basic .NET 程序设计教程 10 可以打开项目的【解决方案资源管理器】窗格,如图 1-14 所示。 图 1-13 【工具箱】窗格 图 1-14 【解决方案资源管理器】窗格 一个解决方案中可以包含多个项目,它使用户能够方便地组织需要开发和设计的项目及文 件,以及配置应用程序或组件。解决方案资源管理器中显示方案及其中项目的层次结构。方案 中包含项目及项目中的条目,此外还包含两种可选文件,即共享方案条目文件和杂项文件。 【双击解决方案资源管理器】窗格内的项目 可以进入设计器。 1.3 创建应用程序 1.3.1 创建一个应用程序的步骤 在 Visual Studio .NET 中创建 Windows 应用程序项目的步骤如下。 (1)打开 Visual Studio .NET。在【起始页】中,单击【新建项目】按钮;或选择【文件】 菜单的【新建】选项,再选择该子菜单中的【项目】选项,打开【新建项目】对话框,如图 1-15 所示。在【新建项目】对话框中的【项目类型】列表框中选择“Visual Basic 项目”,在 第 1 章 Visual Basic .NET 基础 11 【模板】框中选择“Windows 应用程序”,然后依次填写应用程序的名称和位置。 图 1-15 【新建项目】对话框 Visual Basic 项目应用程序模板说明如下。 u Windows 应用程序——用于创建 Windows 窗体应用程序。 u 类库——创建包含 Visual Basic 类的项目。 u Windows 控件库——该模板所创建的项目可以用于开发Windows 应用程序的用户界面 控件,这些控件同样具有可重用性。 u ASP .NET Web 应用程序——用于创建 ASP .NET 项目,创建的新项目将包含一些简单 的 Web 应用程序必需的文件。 u ASP .NET Web 服务——用于创建特殊类型的 Web 应用程序。 u Web 控件库——该模板用于开发 Web 应用程序的用户界面控件。 u Windows 服务——用于创建 Windows 服务。 u 空项目——创建不包含任何源文件的 Windows 项目。 u 空 Web 项目——创建不包含任何源文件的 Web 应用程序项目。 当创建新的 Visual Basic .NET 项目时,首先要做的就是选择应用程序模板。 (2)单击【确定】按钮,显示项目设计界面,系统处于设计状态。如图 1-16 所示。 图1-16 项目设计界面 Visual Basic .NET 程序设计教程 12 (3)双击窗体 Form1,打开代码编辑器窗口,如图 1-17 所示。此时,窗口上部左侧的 为类名选择框。 图 1-17 代码编辑器窗口 (4)如图 1-18 所示,单击窗口上部左侧的 的下拉按钮 ,在其 下拉列表中选择(Base Class Events)选项,然后单击窗口上部右侧的 的 下拉按钮,在其下拉列表中选择 Click(见图 1-19), 则 在 代码编辑器窗口内显示窗体的单击事 件过程,如图1-20 所示。 图 1-18 选择类名 第 1 章 Visual Basic .NET 基础 13 图 1-19 选择事件 图 1-20 事件编辑窗口 (5)编写 Click 事件过程代码。例如,在窗体画一条红色的宽度为 3 个像素的直线,代 码如下。 Visual Basic .NET 程序设计教程 14 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System. _ EventArgs)Handles MyBase.Click Dim pen1 As New System.Drawing.Pen(Color.Red, 3) '设置画笔 Dim g As System.Drawing.Graphics '设置画布 g = Me.CreateGraphics '建立对象 g.DrawLine(pen1, 10, 10, 200, 150) '画直线 End Sub (6)选择【调试】菜单的【启动】命令,系统进入运行状态,屏幕显示如图 1-21。 (7)鼠标单击窗体,结果如图 1-22。 图1-21 运行状态 图1-22 事件运行 【例 1-1】在标签显示“欢迎学习 VB .NET”。 设计步骤如下。 (1)建立项目。建立一个名为 Windows11 的项目,如图 1-23 所示。 图 1-23 建立项目 第 1 章 Visual Basic .NET 基础 15 (2)界面设计。在窗体上加入一个标签 Label1 和一个命令按钮 Button1。在 Button1 的 【属性】窗格将 Button1 的 Text 属性值设定为“显示”,如图 1-24 所示。 图 1-24 界面设计 (3)程序设计。双击【显示】按钮,在代码编辑器窗口内编写 Button1 的 Click 事件过 程,如图 1-25 所示。 图 1-25 代码设计 (4)运行项目。单击【显示】命令按钮,结果如图 1-26 所示。 Visual Basic .NET 程序设计教程 16 图 1-26 运行项目 【例 1-2】在标签显示文本框控件的内容。 设计步骤如下。 (1)界面设计 在项目 Windows11 的界面上再添加一个 TextBox 对象,如图 1-27 所示。 图 1-27 界面设计 (2)程序设计。在代码编辑器窗口内修改 Button1 的 Click 事件过程,如图 1-28 所示。 图 1-28 代码设计 第 1 章 Visual Basic .NET 基础 17 (3)运行项目。单击【显示】按钮,如图 1-29 所示。 图 1-29 运行结果 1.3.2 项目文件 为了说明 VB .NET 应用项目的文件,这里以一个设计上例项目(WindowsApplication1) 的文件为例进行说明。该项目的文件组成如图 1-30 所示。 图 1-30 项目的文件 将鼠标放在文件上,文件的类型和大小均会自动显示。文件类型说明如下。 u .vb 文件——Visual Basic 项目文件。表示项目的窗体文件、用户控件文件、类文件和 模块文件。 u .sln 文件——Visual Studio 解决方案文件。 u .suo文件——解决方案用户选项文件。此类文件用于记录解决方案涉及的所有选项, Visual Basic .NET 程序设计教程 18 这样在每次打开解决方案时,用户对它所做的任何设置都可以得到应用。 u .vbproj 文件——Visual Basic 项目文件。表示属于多项目的窗体文件、用户控件文件、 类文件和模块文件。 1.4 帮助菜单 VB .NET 向用户提供了很好的帮助和自学功能,为读者学习和使用 VB .NET 带来了很大 的方便。使用 VB .NET 的帮助功能,不仅可以引导初学者入门,而且给出了大量的详细信息, 帮助各种层次的用户完成应用程序的设计。 1.动态帮助 在设计状态打开【动态帮助】窗格,即显示当前焦点状态的项目对象的相关知识的列表, 如图 1-31 所示。单击列表项目,可以获得相关项目的详细说明。如图 1-32 所示。 图 1-31 【动态帮助】窗格 2.目录 打开目录帮助系统,即显示树型目录列表,如图 1-33 所示。单击列表项目,可以获得相 关项目的详细说明。 3.索引 打开索引帮助,即显示【索引】窗格,如图 1-34 所示。单击列表项目,可以获得相关项 目的详细说明。 第 1 章 Visual Basic .NET 基础 19 图 1-32 相关项目的详细说明 图 1-33 目录帮助 Visual Basic .NET 程序设计教程 20 图 1-34 【索引】窗格 4.搜索 打开搜索帮助系统,即显示【搜索】窗格,如图 1-35 所示。在【搜索】窗格的【查找】 框内输入关键字(例如 graphic), 在 【 筛 选 依 据 】 框 内选择查找范围(例如 Visual Basic 及相 关内容), 单 击 【搜索】按钮,则【搜索结果】窗格如图 1-36 所示。单击窗格内的列表项目, 可以获得相关项目的详细说明。 图 1-35 【搜索】窗格 第 1 章 Visual Basic .NET 基础 21 图 1-36 搜索列表 1.5 面向对象的程序设计 1.5.1 .NET 框架结构 .NET 框架是微软公司于 2002 年正式推出的一个程序开发和运行平台。它不仅适用于 VB .NET,同样适用于 VC .NET 和 C#等语言。 .NET 框架分为 3 层,结构如图 1-37 所示。底层为公共语言运行环境(Common Language Runtime,CLR),用于解决各种不同编程语言之间相 互调用同一个程序的问题,它 定义了在不同的编程语 言之间通用的数据类型,提 供 了程序运行所需要的内 存管理和生命期管理。中 间 层 是基础类库,提 供 了一 个可以供不同编程语言调用的、分层的、面向对象的 函数库。基础类库将系统的基本功能,例如网络存取、 通信协议、窗口对象等分成几个基本类,程序语言可 以直接调用基本类,也可以在基本类的基础上增加一 些功能,建立新的类(称之为继承)以便调用。最上 层 是应用程序,大致可以分为面向网络应用的 ASP .NET 程序和面向Windows应用的Windows窗体 程序。用 VB .NET,VC .NET 和 C#等语言均可编写 这两类程序。 图 1-37 .NET 框架结构 Visual Basic .NET 程序设计教程 22 1.5.2 对象的概念 1.VB .NET 的对象 对象是数据和代码的集合,类是对象的一种抽象。在 VB .NET 中常用的对象包括窗体、 菜单、数据库和放置在窗体中的各种控件,用户也可以根据需要定义自己的对象。严格地讲, 工具箱中的控件是类,只有放置在窗体上的控件才是对象。例如,按钮控件代表一个类,把 按钮拖动到窗体上就建立了按钮控件的实例,也就是一个按钮对象。因此,在窗体上放置控 件的设计过程就是一种用对象组装应用程序的过程。用 VB .NET 编写的应用程序都是由对象 组成的。对象具有属性(数据)、 方 法 (作用于对象的操作)和事件(对象的响应)3 个特征。 我们可以通过对象的属性、方法和事件对对象进行控制。 2.对象的属性 对象的属性用于描述对象的特征。用于描述对象特征的一组数据称为属性。属性定义了 对象的外观和行为。例如,窗体的属性包括名称、标题、大小、位置、颜色等。在程序设计 中,用户可以通过【属性】窗格设置对象的属性,也可以在应用程序的执行中由代码设定。 设定的格式为 对象名.属性 = 属性值 例如,代码 Form1.Text = "中文编辑器" 执行后,窗体 Form1 的标题将显示为“中文编辑器”。 3.对象的方法 对象的方法是指对象的行为方式,即对象要执行的操作。在 VB .NET 中,对象的方法是 指对象要完成的某个任务或动作。VB .NET 系统中不同对象提供的方法亦不同。例如,Form 对象的方法很多,较常用的方法如下。 ¨ Close——用于关闭窗体。 ¨ Show——用于显示窗体。 ¨ Hide——用于隐藏窗体。 ¨ Refresh——用于重画窗体或控件。 ¨ Focus——用于设置焦点。 ¨ CreatGraphics——用于控件创建 Graphics 对象。 在应用程序设计中,调用对象方法的一般格式为 【对象名.】方法名【参数,...】 4.对象的事件 对象的事件(event)是对象对外部变化的响应。在 VB .NET 中事件是预先定义好的,能 够为对象所识别的动作。VB .NET 系统中不同对象提供的事件亦不同。例如,Button 对象只 有 Click 事件,窗体对象有 Click 事件、DoubleClick 事件、MouseDown 事件、MouseUp 事件、 MouseMove 事件和窗体加载事件等。 在事件过程中编写代码可以指定事件发生后要执行的操作。事件发生时,将执行相应事 第 1 章 Visual Basic .NET 基础 23 件过程的代码。事件过程一般由用户编写,有些则由系统已经定义好了。编写事件过程的一 般格式为 Private Sub 对象名_事件名() 语句序列 End Sub 5.面向对象的程序设计 面向对象的程序设计的概念是 20 世纪 80 年代初提出的。在传统的 C 语言、Pascal 语言 的程序设计中,使用的是结构化程序设计方法,主要的工作是设计算法和编写程序,程序的 各种功能和显示的结果都要用程序语句实现,采用的是“数据结构+算法”的面向过程的程序 设计模式。程序的执行从第一句代码开始,每次执行一行代码,直至执行到最后一行,然后 结束程序。面向对象的程序设计使用面向对象的方法解决问题,它不再将问题分解为过程, 而是将问题分解为对象。 面向对象的程序设计有其自己的特点,它符合人们习惯的思维方法,易于软件的维护和 功能的增减,可重用性好,并与可视化技术相结合使工作界面设计简单化。 面向对象的程序设计并不是抛弃结构化程序设计方法。在 Visual Basic .NET 程序设计中, 从整体上采用面向对象的程序设计,但在具体过程或模块文件编程中,仍需要采用结构化编 程技巧。 在 VB .NET 中,编程步骤如下。 (1)新建项目。新建一个项目。 (2)界面设计。添加控件,调整控件的布局,在【属性】窗格设置控件的属性。 (3)保存。选择菜单命令【文件】→【全部保存】,或者直接按 Shift+Ctrl+S 组合键保存 所做的更改。注意,这时保存的不单是窗体文件,还有项目文件等。 (4)运行。选择菜单命令【调试】→【启动】,或者单击工具栏上的启动按钮 ,或者 按快捷键 F5 均可运行程序。 (5)进一步完善设计。完善界面设计及程序代码,生成可执行文件。 练习题 1.在【例 1-2】的基础上,将程序修改为项目运行后,在文本框输入任意文字,单击【显 示】按钮,则在标签显示文本框输入的文字。 提示 程序设计为 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click Label1.Text = TextBox1.Text End Sub 2.在【例 1-2】的界面设计基础上,选择窗体或窗体上的某一控件对象,然后选择【帮 助】菜单的【动态帮助】命令,从【动态帮助】窗格的项目列表中查看 Form 对象的属性、方 法和事件的列表。 Visual Basic .NET 程序设计教程 24 3.在【例 1-2】的界面设计基础上,添加一个按钮 Button2,其标题设为“结束”,并设 计该按钮的事件过程为 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click MsgBox("结束程序运行吗?") End Sub 试运行程序。 提示 MsgBox()函数是 VB .NET 内置的消息框函数,用 于 显示信息,参数为一个字符串。 第 2 章 窗体和常用控件 本章要点: þ Windows 窗体 þ 文本控件的使用 þ 选择控件的使用 þ 图形显示控件 þ 定时控件的使用 þ 按钮控件的使用 þ 对话框 Visual Basic .NET 提供了许多 Windows 窗体控件,使用它们可以高效而快速地建立 Windows 应用程序。 2.1 窗体 VB .NET 中的标准窗体与 Windows 的窗口非常类似,也包含控制菜单栏、标题栏、最大 化/最小化按钮、关闭按钮及边框。如图 2-1 所示。 图 2-1 窗体结构 Visual Basic .NET 程序设计教程 26 各类控件对象必须建立在窗体上。运行程序时,每个窗体对应于一个窗口;在存储结构 上,一个窗体对应于一个窗体模块。 2.1.1 创建窗体 1.建立第一个窗体 启动 VB .NET,选择【文件】菜单【新建】子菜单中的【项目】选项,打开【新建项目】 对话框。在【项目类型】列表框中选择“Visual Basic 项目”选项,在【模板】框中选择 “Windows 应用程序”,然后依次填写应用程序的名称和位置,最后单击【确定】按钮,显示 项目设计界面,则建立了项目的第一个窗体,系统默认为 Form1。 2.添加新窗体 添加新窗体的步骤如下。 选择【项目】菜单中的【添加 Windows 窗体】选项,打开【添加新项】对话框。在对话 框的【模板】列表框中列出了各种新项的类型,选中【Windows 窗体】选项,单击【打开】 按钮,一个新窗体即被加入当前项目中,默认为 Form2,如图 2-2 所示。依次可以添加多个新 窗体。在图 2-2 中,可以在起始页栏用鼠标切换窗体。 图 2-2 添加窗体 3.改变窗体尺寸 窗体的大小也可以用鼠标拖放来实现。方法是首先将窗体置为当前窗体(用鼠标单击窗 体),将鼠标光标置于窗体边框的控制点上,显示符号“«”后按住鼠标左键进行拖放,如图 2-3 所示。 第 2 章 窗体和常用控件 27 图 2-3 使用拖放方法改变窗体尺寸 2.1.2 属性 窗体属性决定了窗体的外观和操作。设置窗体属性的方法有两种,一种是通过【属性】 窗格设置,另一种是在窗体事件过程中通过程序代码设置。大部分属性既可以通过【属性】 窗格设置,也可以通过程序代码设置,但也有些属性只能用其中一种方法设置。窗体的【属 性】窗格如图 2-3 所示。在【属性】窗格内,通过选择图标按钮 或 ,属性可以“按分类 顺序”排列或“按字母顺序”排列。 图 2-4 窗体的【属性】窗格 Visual Basic .NET 程序设计教程 28 窗体对象的主要属性及其功能如下。 u Text——设置窗体的标题。 u Size——设置窗体的尺寸。 u BackColor——设置对象的背景颜色。 u BackgroundImage——设置对象的背景图片,属性值就是图片的路径。 u Cursor——设置鼠标在该对象上方时的形状,可以单击属性值右侧的下拉框,选择一 个适合该对象的鼠标形状。 u Font——设置对象中文字的字体、大小、颜色、风格等属性。 u ForeColor——设置前景色。 u WindowState——设置窗体的初始可视状态,Normal 表示正常,Minimized 表示最小 化,Maximized 表示最大化。 u GridSize——设置窗体中网格的宽度和高度。 u SnapToGrid——设置窗体中是否使用网格来控制控件的布局。选择 True,则控件不能 放置在窗体的任意位置,而必须与网格对齐。这对于对齐控件是很有帮助的。 u MinimizeBox,MaximizeBox——设置窗体是否具有最小化按钮和最大化按钮。 u Icon——设置窗体的图标,属性值给出图标图片的位置。 u Opacity——设置窗体的透明度。属性值为 100%时,窗体完全不透明;属性值为 0% 时,窗体完全透明。 其中,BackColor,BackgroundImage,Cursor,Font 和 ForeColor 是窗体和其他控件都 具有的属性。 【例 2-1】将窗体的标题名设为“图像动画”。 操作步骤如下。 (1)选择窗体并显示窗体的【属性】窗格。在【属性】窗格中双击 Text 属性,右边方 格内的文字变为反显,如图 2-5 所示。 图 2-5 【属性】窗格 第 2 章 窗体和常用控件 29 (2)由键盘输入“图像动画”,按 Enter 键或用鼠标在任意位置单击,则窗体标题名即设 为图像动画,如图 2-6 所示。 图 2-6 改变 Text 属性 【例 2-2】改变窗体尺寸。 操作步骤如下。 (1)启动 VB .NET 系统,如图 2-7 所示。 图 2-7 开始窗体 (2)在代码窗口选择 Form 对象的 Click 事件并编写代码。 Visual Basic .NET 程序设计教程 30 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System. _ EventArgs) Handles MyBase.Click Me.Width = Me.Width + 50 Me.Height = Me.Height + 50 End Sub (3)运行项目,用鼠标每单击一次窗体,窗体将放大一些。 说明 采用设定窗体 Text 属性的方法,同样可以在窗体的【属性】窗口中设定窗体的 Width,Height 属性值。 2.1.3 常用事件 窗体事件即响应窗体行为的动作。窗体事件有许多,这里只简单介绍最常用的窗体事件。 1.Load 事件 Load 事件是在窗体被装入工作区时自动触发的事件。Load 事件过程通常给符号常量、属 性变量和一般变量赋初值。 2.Click 事件 Click 事件是当程序运行后用鼠标单击对象时触发的事件。一旦触发了 Click 事件,便调 用了相应的事件过程。 3.Move 事件 Move 事件是从内存中清除一个窗体时触发的事件。 4.Closed 事件 关闭窗体时发生的事件。 VB .NET 应用程序的工作方式是事件驱动,而应用程序是一个面向对象的过程。设计者 编写的程序并非告诉系统自始至终执行的步骤,而是响应系统或用户的事件。 一个对象是否响应某个具体事件,响应这个事件后做什么,是由对象的事件过程决定的。 通过对事件进行编码可以实现事件的响应。 2.1.4 常用方法 窗体作为对象,同样能够执行方法。窗体可以使用的主要方法如下。 u Close——关闭窗体。 u Refresh——用于清除窗体或图形框中由图形方法在运行时生成的图形或文字。 u CreateGraphics——创建 Graphics 对象。 u Activate——激活窗体并给予其焦点。 u ResetBackColor——将BackColor属性重置为其默认值。 u ResetText——将Text属性重置为其默认值。 u ShowDialog——将窗体显示为【模式】对话框。 uShow——向用户显示控件。 uHide——对用户隐藏控件。 【例 2-3】清除选定区域内的内容。 操作步骤如下。 第 2 章 窗体和常用控件 31 (1)在【例 2-1】的基础上添加两个命令按钮,并将其标题名分别设为“画图”和“清 除”,如图 2-8 所示。 图 2-8 窗体设计 (2)编写【清除】命令按钮的事件过程,如图 2-9 所示。 图 2-9 编写代码 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim pen1 As New System.Drawing.Pen(Color.Red, 3) '设置画笔 Dim g As System.Drawing.Graphics '设置画布 g = Me.CreateGraphics '建立对象 g.DrawLine(pen1, 10, 10, 200, 150) '画直线 End Sub Visual Basic .NET 程序设计教程 32 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click Me.Refresh() End Sub (3)运行程序,单击【画图】命令按钮,如图 2-10(a)所示。单击【清除】命令按钮, 如图 2-10(b)所示。 (a)执行“画图”操作 (b)执行“清除”操作 图 2-10 运行结果 【例 2-4】Hide 方法应用。 操作步骤如下。 (1)启动 VB .NET。 (2)编写单击窗体事件过程为 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System. _ EventArgs) Handles MyBase.Click Me.Hide() End Sub (3)运行程序,单击窗体,则窗体 Form1 隐藏。 2.1.5 将控件加入窗体 将控件加入窗体的操作很简单,用鼠标双击【工具箱】窗格中的控件图标,该控件即出 现在窗体中。例如,用 鼠标 双 击【 工具箱】窗格 中的命令按钮,则命令按钮 Button1 加入窗体, 如图 2-11 所示。将鼠标光标移到 Button1 上方,按 下鼠标左键可将 Button1 拖动放置在窗体的 合适位置,并可用与改变窗体尺寸同样的操作改变控件的尺寸。使用同样的方法,可以将其 他控件放置在窗体上。 第 2 章 窗体和常用控件 33 图 2-11 添加控件 2.2 Button 控件 Button 控件又称为按钮控件。在 VB .NET 的 Windows 应用程序设计中,用于建立项目 的按钮界面。 在【工具箱】窗格中,Button 控件的图示为 。 双击或用鼠标拖动【工具箱】中的 Button 按钮,可将按钮加入窗体,重复该操作可以加 入多个按钮。加入窗体的按钮可用鼠标拖放到窗体的任意位置,并可以改变按钮的尺寸。 1.常用属性 在设计项目界面时,常使用 Button 控件的属性设置按钮的外观特征。Button 控件的常用 属性如下。 u Text——设置按钮的标题文字。 u TextAlign——设置控件中标题文字的对齐方式。 u BackColor——设置按钮控件的背景色。 u BackgroundImage——设置按钮控件的背景图像。 u ForeColor——设置按钮控件所包含文字或图形的前景色。 u Font——设置按钮控件包含的文字的字体。 u Image——设置前景图像。 u Visible——设置按钮控件是否可见。 u FlatStyle——设置按钮的样式。有 4 个属性值,默认为普通立体按钮(Standard)。 2.常用事件 命令按钮的常用事件只有 Click 事件。 当用户用鼠标单击一个对象时,所触发的事件称之为 Click 事件。 注意 命令按钮不支持 DoubleClick 事件。 Visual Basic .NET 程序设计教程 34 在应用程序设计中,通常使用一组命令按钮和其他对象构成工程界面。 【例 2-5】图像按钮设计。 操作步骤如下。 (1)在窗体上放置一个按钮 Button1。 (2)打开 Button1 的【属性】窗格,如图 2-12 所示。选择 Image 属性,单击右侧的图标 按钮 ,打开【打开】对话框,选择一个位图(扩展名为.bmp)文件后,单击【打开】按钮, 结果如图 2-13 所示。 图2-12 Button1 的【属性】窗格 图2-13 图像按钮 (3)打开 Button1 的【 属性】窗 格 ,选择 BackgroundImage 属性,单 击 右侧的图标按钮 , 打开【打开】对话框,选择一个位图(扩展名为.bmp)文件后,单击【打开】按钮,即可在 按钮 Button1 加载一幅背景图像。 (4)在 Button1 的【属性】窗格选择 Text 属性,并设置属性值为“显示”。 (5)在 Button1 的【属性】窗格选择 Font 属性,单击右侧的图标按钮 ,打开【字体】 对话框,选择字体为隶书,大小为 3 号。图像按钮如图 2-14 所示。 图 2-14 有背景图像的按钮 第 2 章 窗体和常用控件 35 如果需要清除按钮上的图像,可以打开 Button1 的【属性】窗 格 ,选择 BackgroundImage 属性或 Image 属性,选择属性值栏内左侧的图像小方框,按 Delete 键即可清除图像。 2.3 文本控件 在 VB .NET 的 Windows 控件中, 常用的文本控件有 Label 控件、TextBox 控件和 RichTextBox 控件。 2.3.1 Label 控件 Label控件又称为标签控件。在 VB .NET 的 Windows 应用程序设计中,标签通常用于输 出文本信息,但输出的信息不能编辑,所以常用来输出标题、显示处理结果和标识窗体上的 对象。标签一般不用于触发事件。 在【工具箱】窗格中,Label 控件的图示为 。 在标签控件【属性】窗格的属性列表中,主要属性及其功能如下。 u AutoSize——设置控件的尺寸是否随标题内容的大小自动调整,取值为True 或 False, 默认值为 False。 u BorderStyle——设置边框。有 3 种选择:None 为无边框(默认),FixedSingle 为固定 单边框,Fixed3D 为立体边框。 u Enabled——设置控件是否允许操作,可以取值为 True 或 False。False 为禁止操作,此 时标签呈暗淡色,一般在代码中设置。 u Image——设置图像。 2.3.2 TextBox 控件 TextBox 控件又称为文本框控件。在 VB .NET 的 Windows 应用程序设计中,文本框可以 输入信息并显示、编辑、修改文本内容。 在【工具箱】窗格中,文本框控件的图示为 。 1.常用属性 文本框的属性列表中有许多与窗体和其他控件相同的属性。文本框的默认名称为 TextBox1,TextBox2,等等。文本框的其他主要属性及其功能如下。 u MaxLength—— 设置文本框允许输入字符的最大长度,该属性值为 0 时,不限制输入 的字符数,但受 Visual Basic 系统规定的 2048 个字符的限制。 u Locked——设置是否可以移动控件或调整控件的尺寸,取值为True 或 False。 u MultiLine——设置是否可以输入多行文本,取值为True 或 False。为True 时,具有自 动换行功能;为 False 时只允许输入一行,一旦超过文本框宽度则超过部分不显示。 u PasswordChar——字符串类型,允许设置一个字符。运行程序时,将输入 Text 的内容 全部显示为该属性值。 u ScrollBars——设置滚动条模式。有 4 种选择:None 为无滚动条,Horizontal 为水平滚 动条,Vertical为垂直滚动条,Both 为水平和垂直滚动条。 u Text——文本框的内容。当程序执行时,用户在文本框输入的内容会自动保存在该属 Visual Basic .NET 程序设计教程 36 性中。 其中,Text 属性的内容就是显示在TextBox 控件上的内容。可 将 ReadOnly 属性设为 True 或将如果 Enabled 属性设置为 False,则使其变为只读,这时 TextBox 中的文本只能被访问, 不能改变;PasswordChar 属性的作用是将文本的显示内容全部用该属性值替代(要求文本框 的 MultiLine属性为 False),这常用在设置密码的程序中。 2.常用事件和方法 TextBox 的常用事件和方法如下。 u TextChange 事件——文本更改时触发该事件。 u KeyPress 事件——当文本框具有焦点时,按下任意键就会产生该事件。通常可用该事 件检查输入的字符(通过 KeyPress 事件过程可以检测按键的 ASCI I 码值)。 u GotFocus 事件——用鼠标单击该对象使其获得焦点时触发该事件。 u SelectAll方法——选择 TextBox 中的全部文本。 u Focus 方法——使 TextBox 取得焦点。 u Copy 方法——复制选取的文本。 u Cut 方法——剪切选取的文本。 u Paste 方法——粘贴剪贴板上的文本。 【例 2-6】乘法运算器设计。 图 2-15 是一个乘法运算的工程界面。在窗体上放置了 3 个文本框、3 个命令按钮和 5 个 标签控件。 图 2-15 窗体设计 文本框用于输入和显示数的信息。将图中文本框的初始信息清空的代码如下。 TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" 5 个标签分别用于标识 3 个文本框对象和 2 个运算符号。 Label1.Text = "*" Label2.Text ="=" Label3.Text = "乘数" 第 2 章 窗体和常用控件 37 Label4.Text = "被乘数" Label5.Text = "积" 3 个命令按钮标题分别设为“求积”、“清空”和“结束”,设置如下。 Button1.Text = "求积" Button2.Text = "清空" Button3.Text = "结束" 编写各个命令按钮绘图的单击事件过程,可以实现乘法运算。程序设计如下。 '乘 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim ss, ee As Double ss = Val(TextBox1.Text) ee = Val(TextBox2.Text) TextBox3.Text = Str(ss * ee) End Sub '清空 Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button2.Click TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" End Sub '结束 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click Me.Close() End Sub 运行结果如图 2-16 所示。 图 2-16 运行乘法计算 Visual Basic .NET 程序设计教程 38 提示 (1)使用 Val函数可以将字符串转换为浮点数。 (2)使用 Str 函数可以将浮点数转换为字符串。 (3)使用 Close()退出系统。 2.4 选择控件 选择控件通常用于从几个选择项中选择一个或几个选项,通常包括 RadioButton 控件和 CheckBox 控件。 2.4.1 RadioButton 控件和 GroupBox 控件 RadioButton 控件又称为单选按钮控件。在 VB .NET 的 Windows 应用程序设计中,它通 常与 GroupBox 控件组合,用于建立项目的成组选择界面。 1.RadioButton 控件 单选按钮控件用于让用户在一组相关的选项中选择一项,因此单选按钮控件总是成组出 现的。通常,将若干个 RadioButton 控件放在一个 GroupBox 控件内组成一组,当这一组中的 某个单选按钮控件被选中时,该组中的其他单选按钮控件将自动处于不选中状态。 在【工具箱】窗格中,RadioButton 控件的图示为 。单击单选按钮之后,圆 圈中间就会出现一个小圆点,表示该项被选中。 单选按钮的默认名称为 RadioButton1,RadioButton2,等等。 (1)常用属性 u Text——设置 RadioButton 控件的标题文字。 u TextAlign——设置控件中标题文字的对齐方式。有 6 种选择,默认为 MiddleLeft, 即水平方向左对齐、垂直方向居中。 u CheckAlign —— 设置控件中的图标 在控件中的位置。有 6 种选择,默认为 MiddleLeft, 即图标 位于控件左侧、垂直方向居中。 u BackColor——设置控件的背景色。 u BackgroundImage——设置控件的背景图像。 u ForeColor——设置控件所包含文字或图形的前景色。 u Font——设置控件所包含文字的字体。 u Image——设置前景图像。 u Visible——设置按钮控件是否可见。 u FlatStyle——设置按钮的样式。默认为 Standard。 u Checked——单选按钮是否被选中。如果单选按钮被选中,则其 Checked 属性为 True, 并且触发 Click 事件。 (2)常用事件 u Click——当用户单击按钮时,将触发 Click 事件。 u CheckedChanged——当 Checked 属性的值更改时,触发该事件。 第 2 章 窗体和常用控件 39 2.GroupBox控件 GroupBox 控件又称为分组框。它用于为其他控件提供可识别的分组。在分组框中对所有 选项分组能为用户提供逻辑化的可视提示,并且在设计时所有控件可以方便地移动。当移动 单个 GroupBox 控件时,它包含的所有控件也将一起移动。可以向分组框添加其他控件,也 可以在分组框内绘制各个控件。 在【工具箱】窗格中,GroupBox 控件的图示为 。 如果要把现有控件放到分组框中,可以选中这些控件,将它们剪切到剪贴板,选择 GroupBox 控件,然后将它们粘贴到分组框中;也可以将它们直接拖动到分组框中。 在建立项目的按钮界面操作中,常使用 GroupBox 控件的属性设置按钮的外观特征。 GroupBox 控件的常用属性如下。 u Text——设置 GroupBox 控件的标题文字。 u BackColor——设置控件的背景色。 u BackgroundImage——设置控件的背景图像。 u ForeColor——设置控件所包含文字或图形的前景色。 u Font——设置控件所包含文字的字体。 u Image——设置前景图像。 u Visible——设置分组框控件及其所包含的控件是否可见。 u FlatStyle——设置分组框的样式。默认为 Standard。 【例 2-7】单选按钮和分组框的应用。 图 2-17 是一个使用单选按钮选择文本框内显示文字字体、大小和颜色的工程界面。在界 面设计中,注意在分组框内设置单选按钮时,应先将分组框放到窗体,然后用鼠标单击【工 具箱】窗格中的单选按钮将其放入分组框。这样当分组框移动时,单选按钮会随分组框一起 移动。本例在设计中同时使用了控件复制的方法,在控件复制之后再给复制的控件重新命名。 图 2-17 窗体设计 为【确定】按钮编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click If RadioButton1.Checked = True Then TextBox1.Font = New Font("宋体", TextBox1.Font.Size) End If Visual Basic .NET 程序设计教程 40 If RadioButton2.Checked = True Then TextBox1.Font = New Font("隶书", TextBox1.Font.Size) End If If RadioButton3.Checked = True Then TextBox1.Font = New Font("幼圆", TextBox1.Font.Size) End If If RadioButton4.Checked = True Then TextBox1.ForeColor = Color.Red End If If RadioButton5.Checked = True Then TextBox1.ForeColor = Color.Green End If If RadioButton6.Checked = True Then TextBox1.ForeColor = Color.Blue End If If RadioButton7.Checked = True Then TextBox1.Font = New Font(TextBox1.Font.FontFamily, 12) End If If RadioButton8.Checked = True Then TextBox1.Font = New Font(TextBox1.Font.FontFamily, 16) End If If RadioButton9.Checked = True Then TextBox1.Font = New Font(TextBox1.Font.FontFamily, 18) End If TextBox1.Text = "欢迎学习 Visual Basic .NET 语言!" End Sub 程序运行结果如图 2-18 所示。 图 2-18 运行结果 2.4.2 CheckBox 控件 CheckBox 控件又称为复选框,它与单选按钮一样,也是给用户提供一组供选择的项。但 与单选按钮有所不同,每个复选框都是一个单独的选项,用户既可以选择它,也可以不选择 它,不存在互斥的问题,可以同时选择多项。 第 2 章 窗体和常用控件 41 在【工具箱】窗格中,CheckBox 控件的图示为 。 单击复选框之后,复选框中间就会出现一个对钩,表示该项被选中;再次单击被选中的 复选框,则取消对该复选框的选择。 复选框的默认名称为 CheckBox1,CheckBox2,等等。 1.常用属性 u Text——设置控件的标题文字。 u TextAlign——设置控件中标题文字的对齐方式。有 6 种选择,默认为 MiddleLeft,即 文字水平方向左对齐、垂直方向居中。 u BackColor——设置控件的背景色。 u BackgroundImage——设置控件的背景图像。 u ForeColor——设置控件所包含文字或图形的前景色。 u Font——设置控件所包含文字的字体。 u Image——设置前景图像。 u Visible——设置复选框控件是否可见。 u FlatStyle——设置复选框的样式。默认为 Standard。 u Checked——复选框按钮是否被选中。如果复选框被选中,则其 Checked 属性为True, 并且触发 Click 事件。 2.常用事件 u Click——当用户单击复选框时,将触发 Click 事件。 u CheckedChanged——当单击复选框时,会改变 Checked 属性值,同时触发 Click 事件。 【例 2-8】复选框的应用。 图 2-19 是一个使用复选框选择学习媒介的项目界面。要求当选择某个复选框时,该标题 显示在文本框中。 图 2-19 界面设计 在每个复选框的 CheckChange 事件过程中编写代码如下。 Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged If CheckBox1.Checked = True Then TextBox1.Text = CheckBox1.Text Else Visual Basic .NET 程序设计教程 42 TextBox1.Text = "" End If End Sub Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged If CheckBox2.Checked = True Then TextBox1.Text = CheckBox2.Text Else TextBox1.Text = "" End If End Sub Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged If CheckBox3.Checked = True Then TextBox1.Text = CheckBox3.Text Else TextBox1.Text = "" End If End Sub 运行结果如图 2-20 所示。 图 2-20 运行结果 2.5 列表选择控件 列表选择控件通常用于从一组固定的选项中选择一个或多个选项,包括 ListBox 控件和 ComboBox 控件。 2.5.1 ListBox 控件 ListBox 控件称为列表框,它显示一个项目列表供用户选择。在列表框中,用户一次可以 选择单项,也可以选择多项。 在【工具箱】窗格中,ListBox 控件的图示为 。 第 2 章 窗体和常用控件 43 1.常用属性 u SelectionMode——提供单项选择或多重选择。 u MultiColumn——启用按多列显示项而不是项的垂直列表,可以使控件显示更多可见 项,并使用户不必滚动到某项。 u BackColor——设置控件背景色。 u Items——设置列表框中的列表项。 u SelectedItem——获取或设置ListBox中的当前选定项。 u SelectedIndex——获取当前选定项的索引。 u Text——获取或搜索ListBox中当前选定项的文本。 u Visible——获取或设置控件是否可见。 u Width——获取或设置控件的宽度。 u DrawMode——设定是否自绘制。 2.常用方法 u Item.Add——向列表框中添加项。 u Item.Remove——从列表框中删除项。 u Item.Insert——向列表框中插入项。 u SetSelected——选择列表项。 【例 2-9】测试列表框。 如图 2-21 所示,在窗体 Form1 上添加一个组框 GroupBox1,并在该组框内添加 4 个单选 按钮 RadioButton1,RadioButton2,RadioButton3 和 RadioButton4,分别表示列表框的 4 种选 择方式,以设置列表框的 SelectionMode 属性;添加另一个组框 GroupBox2,并在该组框内添 加两个单选按钮 RadioButton5 和 RadioButton6,分别表示列表框的显示方式,以设置列表框 的 MultiColumn 属性;添加一个列表框 ListBox1;添加一个静态文本标签 Label1,用于显示 所选列表项的内容。 编写代码如下。 当选择【多列显示】单选按钮时,列表框设置为多列显示。 Private Sub RadioButton5_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles RadioButton5.CheckedChanged If RadioButton5.Checked = True Then ListBox1.MultiColumn = False End If End Sub 当选择【单列显示】单选按钮时,列表框设置为单列显示。 Private Sub RadioButton6_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles RadioButton6.CheckedChanged If RadioButton6.Checked = True Then ListBox1.MultiColumn = True End If End Sub Visual Basic .NET 程序设计教程 44 当选择【单选】单选按钮时,列表框就变成了简单多选方式。其他选择方式与此类似。 Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged If RadioButton3.Checked = True Then ListBox1.SelectionMode = SelectionMode.One End If End Sub 当选择列表框中的项时,会在列表框下方的静态文本标签中显示所选项的内容。 Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal _ e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Label1.Text = "" '如果是单选,则使用 SelectedItem 返回所选项 If(ListBox1.SelectedIndices.Count = 1) Then Label1.Text = ListBox1.SelectedItem.ToString() End If End Sub 运行结果如图 2-21 所示。 图 2-21 列表框 2.5.2 ComboBox 控件 ComboBox 组件称为组合框,它是文本框和列表框的组合,对应于 System.Windows. Forms.ComboBox 类。用户可以在组合框中输入信息,也可以从下拉列表中选择预设的项。当 从下拉列表中选择项时,文本框中就显示刚选择的项。 ComboBox 组件的文本框部分和列表框部分与前面讲述的文本框组件和列表框组件基本 相同,这里就不再重复了,下面只介绍它独有的一些特性。 在【工具箱】窗格中,ComboBox 控件的图示为 。 1.常用属性 u SelectedText——设置组合框的文本框内所选定的文本。 第 2 章 窗体和常用控件 45 u DropDownStyle——设置组合框的样式,分别为 DropDown(下拉式组合框),Simple (简单组合框)和 DropDownList(下拉式列表框)。 2.常用事件 ComboBox 控件的常用事件为 DropDown 事件,单击组合框的下拉按钮时触发该事件。 【例 2-10】测试组合框。 如图 2-22 所示,在窗体 Form1 上添加列表框 ListBox1,用于显示组合框的样式;添加组 合框 ComboBox1,用于演示组合框外观的改变;添加静态文本标签 Label1,用于显示 ComboBox1 当前所选项的内容。 编写代码如下。 (1)用户选择列表框的列表项后,将改变组合框的外观。 Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal _ e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Select Case (Me.ListBox1.SelectedIndex) Case 0 ComboBox1.DropDownStyle = ComboBoxStyle.Simple Case 1 ComboBox1.DropDownStyle = ComboBoxStyle.DropDown Case 2 ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList End Select End Sub (2)用组合框上部的静态文本标签显示组合框的选择项。 Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As Object, ByVal _ e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Label1.Text = ComboBox1.SelectedItem.ToString() End Sub 运行结果如图 2-22 所示。 图 2-22 组合框 Visual Basic .NET 程序设计教程 46 2.6 图形显示控件和定时器 2.6.1 PictureBox 控件 PictureBox 控件常用于图形设计和图像处理应用程序,又称为图形框。可以加载到控件上 的图像文件格式有:位图文件(.bmp)、图标文件(.ico)、图元文件(.wmf)、.jpeg 和.gif 文件。 PictureBox 控件在【工具箱】窗格中的图标为 。 1.常用属性 u Image——设置控件显示的图形。 u Visible——设置是否显示该控件。 u Height——设置控件的高度。 u Width——设置控件的宽度。 u SizeMode——指示如何显示图像。 u Size——设置控件的高度和宽度。 u BackColor——设置控件的背景色。 u BackgrundImage——设置在控件中显示的背景图像。 u BorderStyle——设置控件的边框样式。 2.常用方法 u CreateGraphics——为控件创建一个 Graphics 对象。 u DisPose——释放由 Component 占用的资源。 u Hide——隐藏控件。 u Refresh——强制控件的工作区无效并立即重绘。 u Show——向用户显示控件。 3.常用事件 u Click——单击 PictureBox 控件时发生。 u DubleClick——在双击 PictureBox 控件时发生。 u MouseEnter——在鼠标指针进入控件时发生。 u Move——在移动控件时发生。 u Paint——在重绘控件时发生。 【例 2-11】图像输入。 如图 2-23 所示,在窗体上放置一个图形框 PictureBox1 和一个按钮 Button1,使用 OpenFileDialog 组件在 PictureBox 内输入图像。 编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim pic As Image OpenFileDialog1.ShowDialog() pic = New Bitmap(OpenFileDialog1.FileName) 第 2 章 窗体和常用控件 47 PictureBox1.Image = pic End Sub 程序运行结果如图 2-23 所示。 图 2-23 输入图像 提示 程序中语句 Dim pic As Image 声 明 pic 为 Image 对象型变量,语句 OpenFileDialog1.ShowDialog()显示【打开】对话框;语句 pic=New Bitmap(OpenFileDialog1. FileName)表示在【打开】对 话 框中选择一个位图文件赋给Pic 对象变量,语句PictureBox1.Image = pic 将 Pic 对象的内容赋给 PictureBox1 对象的 Image 属性。此段程序的功能相当于在设计状 态下使用 PictureBox1 属性窗口的 Image 属性加载图像。 2.6.2 定时控件 定时控件(Timer)也称为定时器或计时器,是按一定时间间隔周期性地自动触发事件的 控件。在程序运行时,定时器是不可见的。定时器控件的默认名称为Timer1,Timer2,等等。 1.常用属性 u Enabled——默认属性,设置定时器是否正在运行。 u Interval——设置相邻两个Timer 事件之间的时间间隔(以毫秒为单位)。 2.常用方法 u Start——启动定时器。 u Stop——停止定时器。 3.常用事件 u Tick——当定时器处于启动状态时,每隔一个 Interval 时间,触发一次该事件。 【例 2-12】利用定时器控件的Tick 事件建立一个在屏幕上移动的窗体动画。 将 Timer 控件加入项目界面,然后再加入一个 PictureBox 控件,并用其 Image 属性加载 一幅图像。如图 2-24 所示。 Visual Basic .NET 程序设计教程 48 图 2-24 动画界面 编写代码如下。 Dim p As System.Drawing.Point Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System. _ EventArgs) Handles Timer1.Tick If p.x > Me.Location.x + 100 Then p.x = 0 End If If p.y > Me.Location.y + 100 Then p.y = 0 End If p.x = p.x + 6 p.y = p.y + 10 PictureBox1.Location = p 'PictureBox1.Image = PictureBox1.Image End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub 2.7 对话框 一般情况下,应用程序都要使用对话框向用户提示信息或接收用户输入的信息。在 第 2 章 窗体和常用控件 49 VB .NET 中,可以使用自定义对话框,也可以使用 VB .NET 提供的通用对话框。 自定义对话框实际上就是将 FormBorderStyle 属性设置为 FixedDialog 的窗体。通过添加 组件(例如 Label,TextBox 和 Button)可以自定义对话框以满足特定需要。 通用对话框就是 VB .NET 已经实现,可以直接使用的对话框。使用通用对话框的优点是 方便,缺点是功能有限。下面将介绍几个 VB .NET 提供的通用对话框。 2.7.1 消息框 消息框(MessageBox)用于向用户显示通知一类的消息,其上可包含文本、按钮和图标。 消息框的使用非常简单,只需要调用 MessageBox 类的静态方法 Show 即可显示消息框。消息 框中的标题、消息文本、按钮和图标都可以通过给该方法传递参数来确定。该方法的返回值 是一个 DialogResult 枚举。例如, If(MessageBox.Show("消息框的显示内容","消息框的标题", MessageBoxButtons. _ YesNoCancel, MessageBoxIcon.Information) = DialogResult.Cancel) label1.Text = "取消" 将显示如图 2-25 所示消息框。方法 Show 的第 1 个参数是要显示的消息文本;第 2 个参数是 消息框的标题;第 3 个参数是消息框上的按钮,它是一个 MessageBoxButtons 枚举值,是 VB .NET 的预设值;第 4 个参数是消息框上显示的图标,它是一个 MessageBoxIcon 枚举值。 这些参数并非都需要,可以只取部分参数,因为 Show 有多达 12 个重载函数。 图 2-25 消息框 2.7.2 文件打开和保存对话框 用户可以使用文件的【打开】对话框浏览本地或网络中任何计算机上的文件夹,并选择 打开一个或多个文件。可以使用文件的【另存为】对话框浏览文件系统并选择要保存的文件。 在 VB .NET 中,提供了实现两个对话框的类——OpenFileDialog类和SaveFileDialog 类。两个 类的使用和属性基本相同,主要属性如下。 u Filter——设置或获取文件名筛选字符串,用于筛选具有特定扩展名的文件。筛选字符 串的形式为:所有文件*.*|*.*|VB .NET 文件|*.cs。“|”前面的字符串“所有文件*.*” 用于显示,后面的字符串“*.*”才真正用于筛选,多个筛选通过“|”连接。 u FilterIndex——获取或设置对话框文件名筛选器的索引。 u InitDirectory——设置或获取对话框显示的初始路径。使用 Title 属性设置或获取对话框 的标题。使用 FileName 属性设置或获取该对话框返回用户在对话框中选定文件的路 径和名称。 Visual Basic .NET 程序设计教程 50 注意,两个对话框只返回要打开或保存的文件名,并没有真正提供打开或保存文件的功 能。用户必须自己编写文件打开或保存代码,才能真正实现文件打开和保存功能。 【例 2-13】使用【打开】对话框打开一个文件。 窗体设计如图 2-26 所示。在窗体上放置一个 RichTextBox 控件和一个 Button 控件,在 Button1 的属性窗口将其 Text 属性设置为“打开”。 图 2-26 打开界面设计 编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim str As String Dim type1 As System.Windows.Forms.RichTextBoxStreamType OpenFileDialog1.ShowDialog() str = OpenFileDialog1.FileName RichTextBox1.LoadFile(str, RichTextBoxStreamType.PlainText) End Sub 运行程序,单击【打开】按钮,结果如图 2-27 所示,弹出一个【打开】对话框。此例可 以在 RichTextBox 内打开一个 .rtf 文件或 ASCI I 文件。 第 2 章 窗体和常用控件 51 图 2-27 【打开】对话框 2.7.3 【颜色】对话框 【颜色】对话框允许用户从调色板选择颜色,以及将自定义颜色添加到该调色板。在 VB .NET 中,可以通过 ColorDialog类实现【颜色】对话框。使用它的 ShowDialog 方法,即 可显示【颜色】对话框。当用户选择颜色后,其 Color 属性就记忆了这个颜色值。 【例 2-14】使用从【颜色】对话框选择的颜色改变静态文本标签的背景色。 窗体设计如图 2-28 所示。在窗体上放置一个 RichTextBox 控件和一个 Button 控件,在 Button1 的【属性】窗格中将其 Text 属性设置为“颜色”。 图 2-28 颜色界面设计 Visual Basic .NET 程序设计教程 52 编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click ColorDialog1.ShowDialog() RichTextBox1.SelectionColor = ColorDialog1.Color End Sub 运行结果如图 2-29(a)所示,单击【颜色】按钮,则弹出图 2-29(b)的【颜色】对 话框。 (a)运行结果 (b)【颜色】对话框 图 2-29 【颜色】对话框 2.7.4 【字体】对话框 【字体】对话框是标准的 Windows 字体对话框,用于公开系统上当前安装的字体。使用 FontDialog 类可以实现【字体】对话框。使用 FontDialog 类的 ShowDialog 方法显示【字体】 对话框,使用 FontDialog 类的 Font 属性获取用户选择的字体。Font 是一个对象,它公开系统 上当前安装的字体、字号、字形等属性。 【例 2-15】使用从【字体】对话框选择的字体设置静态文本标签的字体。 窗体设计如图 2-30 所示。在窗体上放置一个 RichTextBox 控件和一个 Button 控件,在 Button1 的【属性】窗格中将其 Text 属性设为“字体”。 编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click FontDialog1.ShowDialog() RichTextBox1.SelectionFont = FontDialog1.Font End Sub 程序运行后,单击【字体】按钮,则弹出【字体】对话框,如图 2-31 所示。 第 2 章 窗体和常用控件 53 图 2-30 字体界面设计 图 2-31 【字体】对话框 Visual Basic .NET 程序设计教程 54 2.7.5 【打印】对话框 使用 PrintDialog 可以显示 Windows 标准【打印】对 话框。在对话框中,可以选择打印机、 要打印的页及页范围和打印选定内容。使用 ShowDialog 方法可以在运行时显示该对话框。需 要注意的是,该对话框并不负责具体的打印任务,要想在应用程序中控制打印内容必须使用 PrintDocument 控件。 【例 2-16】PrintDialog 和 PrintDocument 控件的使用。 在图 2-30 的基础上,添加 PrintDialog,PrintDocument 控件和一个 Button 控件,并将 Button 控件的 Text 属性设置为“打印”,如图 2-32 所示。 图 2-32 打印界面设计 编写代码如下。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.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() 第 2 章 窗体和常用控件 55 End If End Sub 运行程序,单击【打印】按钮,弹出【打印】对话框,如图 2-33 所示。 图 2-33 【打印】对话框 练习题 1.设计一个成绩统计的项目。 (1)界面设计 如图 2-34 所示。界面为在窗体上放置 5 个标签控件,4 个 TextBox 控件和 2 个 Button 控 件,并依图所示设置各控件的Text 属性。 图 2-34 成绩统计界面设计 Visual Basic .NET 程序设计教程 56 (2)设计要求 程序运行后如图 2-35 所示。单击【重置】按钮,则清除所有文本框的内容;在相应的文 本框内输入相应课程的成绩后,单击【计算】按钮,则在总分栏内显示总成绩。 图 2-35 成绩统计界面 (3)提示 重置代码如下。 TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" 计算代码如下。 Dim gg, dd, yy As Double gg = Val(TextBox1.Text) dd = Val(TextBox2.Text) yy = Val(TextBox3.Text) TextBox4.Text = Str(gg + dd + yy) 2.在【例 2-13】打开文件界面的基础上,添加一个 SaveFileDialog 控件和一个 Button 控 件,将 Button 控件的 Text 属性设置为“保存”,并输入代码如下。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click SaveFileDialog1.ShowDialog() Dim str1 As String str1 = SaveFileDialog1.FileName RichTextBox1.SaveFile(str1, RichTextBoxStreamType.PlainText) End Sub 运行程序后将显示一个【另存为】对话框。此例可以将 RichTextBox 控件的内容存为一 第 2 章 窗体和常用控件 57 个.rtf 文件。 3.控件操作上机练习。 (1)将控件加入窗体 将控件加入窗体的操作步骤是,双击【工具箱】窗格中的控件图标,该控件即出现在窗 体中央。例如,双击【工具箱】中的【命令按钮】, 则 命令按钮 Button11 加入窗体。将鼠标光 标移到 Button11 上方,按住鼠标左键拖动即可将 Button11 放置在窗体的合适位置,并可用与 窗体放缩相同的操作改变控件的尺寸。使用同样的方法,可以将其他控件放置在窗体上。 具体要求如下。 ① 单击【工具箱】窗格中的控件按钮,在窗体的适当位置用鼠标画出相应的控件。 ② 双击【工具箱】窗格中的控件按钮,即可自动在窗体中央画出相应的控件,再拖动到 适当位置。 ③ 按住 Ctrl键,单击【工具箱】窗格中的控件按钮,松开 Ctrl键,在窗体编辑区拖动鼠 标即可画出多个对应的控件。画完之后单击【工具箱】中的其他控件。 (2)控件的缩放和移动 在窗体的控件上单击鼠标,可使该控件成为“活动”的。“活动”控件的四周有 8 个空心 小方块。 缩放控件的方法如下。 ① 将鼠标指针对准控件的小方块,出现双向箭头时拖动鼠标即可改变控件的高度和宽 度。 ② 按下Shift+方向键也可以改变控件的尺寸。 移动控件的方法如下。 ① 将鼠标指针指向活动的控件,拖动控件到所需位置。 ② 按下 Ctrl+方向键,也可以移动控件的位置。 此外,还可以在【属性】窗口中修改下述控件属性值来改变选中控件的尺寸和位置,即 Left,Top,Width 和 Height 的属性值。 (3)控件的复制和删除 复制控件的方法如下。 先选中要复制的控件,然后单击工具栏上的【复制】按钮或按 Ctrl+C 组合键,再单击工 具栏上的【粘贴】按钮或按 Ctrl+V组合键。 删除控件的 3 种方法如下。 ① 选中欲删除的控件,按 Del 键。 ② 选中欲删除的控件,单击工具栏中的【删除】按钮。 ③ 在欲删除的控件上单击鼠标右键,在弹出的快捷菜单中选择【删除】命令。 (4)选择多个控件 选择多个控件的方法如下。 ① 按住 Ctrl键,单击要选择的多个控件。 ② 按住Shift 键,单击要选择的多个连续控件的第一个和最后一个控件。 ③ 在窗体上拖动鼠标,画出一个包含要选择控件的矩形。 (5)使用【格式】菜单操作控件 Visual Basic .NET 程序设计教程 58 项目界面设计时,常常需要在窗体上放置一系列控件。然而,逐个调整控件使它们呈现 整齐的布局是很烦琐的。这时,最好使用【格式】菜单中的相关命令来改变控件的对齐方式 和尺寸。具体操作是,用选择多个控件的方法选择一组控件,然后使用【格式】菜单中的命 令调整控件的布局和尺寸。 ① 对齐控件 选择【格式】菜单的【对齐】命令,弹出如图 2-36 所示级联菜单,各子菜单项的功能如 下。 图 2-36 【格式】菜单 u【左对齐】——按照最后选中的控件的左边线对齐。 u【居中对齐】——按照最后选中的控件的垂直中线对齐。 u【右对齐】——按照最后选中的控件的右边线对齐。 u【顶端对齐】——按照最后选中的控件的上边线对齐。 u【中间对齐】——按照最后选中的控件的水平中线对齐。 u【底部对齐】——按照最后选中的控件的底线对齐。 u【对齐到网格】——按照父对象的网格对齐控件。 ② 调整控件尺寸 调整控件尺寸可以使用【格式】菜单的【使大小相同】项,各子菜单项的功能如下。 u【宽度】——按照最后选中的控件的宽度调整所有控件的宽度。 u【按网格调整大小】——按照与网格对齐的方式调整控件的尺寸。 u【高度】——按照最后选中的控件的高度调整所有控件的高度。 u【两者】——按照最后选中的控件的高度和宽度调整所有控件的高度和宽度。 ③【格式】菜单的子菜单项 第 2 章 窗体和常用控件 59 u【水平间距】——调整控件间的水平间距。 u【垂直间距】——调整控件间的垂直间距。 u【在窗体中居中对齐】——调整控件到窗体的中间。 u【顺序】——调整控件在窗体上的叠放层次。 第 3 章 项目界面设计 本章要点: þ 命令按钮界面设计 þ 菜单界面设计 þ MDI 界面设计 þ 工具条界面设计 þ 状态栏 Visual Basic .NET 界面设计是项目设计最基础的工作。 3.1 按钮界面 按钮界面是常用的 VB .NET 项目界面之一,设计步骤如下。 (1)启动系统,建立应用项目,如图 3-1 所示。 图 3-1 启动窗体 第 3 章 项目界面设计 61 (2)与 VB 6.0 的操作一样,用鼠标拖动窗体 Form1,设置其尺寸。 (3)选择【视图】菜单的【工具箱】命令,弹出【工具箱】窗格,如图 3-2 所示。 图 3-2 【工具箱】窗格 (4)双击【工具箱】窗格中的 Button 按钮,将按钮加入窗体,重复该操作可以加入多 个按钮,如图 3-3 所示。 图 3-3 建立按钮 Visual Basic .NET 程序设计教程 62 (5)与 VB 6.0 的操作一样,用鼠标拖动按钮,设置其位置,如图 3-4 所示。 图 3-4 设置按钮 (6)在【属性】窗格使用 Text 属性设置各命令按钮的标题名,选择文件保存 Form1(s), 保存设计的项目界面。 (7)双击窗体上的按钮,显示代码编辑窗口,在事件过程内编写代码。如图 3-5 所示。 图 3-5 代码编辑窗口 例如, 第 3 章 项目界面设计 63 Me.Width = Me.Width + 50 Me.Height = Me.Height + 50 (8)单击【启动】按钮 ,运行项目,在【输出】窗口内显示运行过程,后显示运行结 果。如图 3-6 所示。 图 3-6 运行结果 (9)单击代码窗口内的符号“+”,则显示相应的窗体设计器的代码,如图 3-7 所示。 图 3-7 显示相应的窗体结构代码 代码如下。 #Region " Windows 窗体设计器生成的代码 " Public Sub New() MyBase.New() '该调用是 Windows 窗体设计器所必须的 InitializeComponent() '在 InitializeComponent() 调用之后添加任何初始化 End Sub Visual Basic .NET 程序设计教程 64 '窗体重写处置以清理组件列表 Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not(components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Windows 窗体设计器所必须的 Private components As System.ComponentModel.IContainer '注意,以下过程是 Windows 窗体设计器所必须的 '可以使用 Windows 窗体设计器修改此过程 '不要使用代码编辑器修改它 Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents Button2 As System.Windows.Forms.Button Private Sub Initialize _ Component() Me.Button1 = New System.Windows.Forms.Button() Me.Button2 = New System.Windows.Forms.Button() Me.SuspendLayout() ' 'Button1 ' Me.Button1.Location = New System.Drawing.Point(40, 240) Me.Button1.Name = "Button1" Me.Button1.TabIndex = 0 Me.Button1.Text = "画图" ' 'Button2 ' Me.Button2.Location = New System.Drawing.Point(152, 240) Me.Button2.Name = "Button2" Me.Button2.TabIndex = 1 Me.Button2.Text = "结束" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14) Me.ClientSize = New System.Drawing.Size(292, 273) Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button2, _ Me.Button1}) Me.Name = "Form1" Me.Text = "Form1" Me.ResumeLayout(False) 第 3 章 项目界面设计 65 End Sub #End Region (10)在相应的文件夹内可以看到该项目的文件,如图 3-8 所示。 图 3-8 文件浏览 (11)双击图 3-8 中的图标 可以重新打开文件。 3.2 菜单界面 菜单界面也是 VB .NET 项目常用的界面之一,项目界面设计步骤如下。 (1)启动系统,建立一个项目,如图 3-9 所示。 图 3-9 建立窗体 Visual Basic .NET 程序设计教程 66 (2)在【工具箱】窗格内双击 MainMenu 控件,如图 3-10 所示。 图 3-10 加入 MainMenu 控件 (3)单击“请在此处输入”,依次输入菜单名,例如“文件”、“打开”、“ 保存”等。如 图 3-11 所示。 图 3-11 输入菜单名 (4)编辑事件过程代码。双击菜单项,在代码编辑窗口显示相应的事件过程,在事件过 第 3 章 项目界面设计 67 程内编写代码。如图 3-12 所示。 图 3-12 编辑代码 (5)运行项目。单击“启动”显示运行结果,单击【文件】菜单即显示其子菜单,如图 3-13 所示。 图 3-13 菜单界面 3.3 单选按钮界面 单选按钮界面是 VB .NET 项目常用的界面之一,界面设计步骤如下。 (1)建立一个项目。 (2)在【工具箱】窗格中选择 GroupBox 控件并放入窗体。 (3)在【工具箱】窗格中单击 OptionButton 控件,并拖放入 GroupBox 控件内。 (4)重复步骤(2)、(3)。 这 样,当移动 GroupBox 控件时,单选按钮将成组移动。 (5)设置各控件的属性。 Visual Basic .NET 程序设计教程 68 (6)保存项目。 【例 3-1】设计一个显示 VB绘图画笔和画刷样式的界面,如图 3-14 所示。 图 3-14 单选按钮界面 设计步骤如下。 (1)在窗体上方放置一个图片框和两组单选按钮。 (2)设置控件的属性,如图 3-15 所示。 图 3-15 设置控件属性 第 3 章 项目界面设计 69 (3)编写事件过程,如图 3-16 所示。 图 3-16 编写事件代码 (4)运行项目,结果如图 3-17 所示。 图 3-17 运行结果 3.4 MDI 界面 MDI 应用程序允许用户同时显示多个文档,每个文档分别显示在自己的窗口中。MDI 界 面设计包含一个父窗体和若干个子窗体。运行时,子窗体显示在父窗体的工作空间之内。一 Visual Basic .NET 程序设计教程 70 般,父窗体内不包含控件。设计示例如下。 3.4.1 建立 MDI父窗体 操作步骤如下。 (1)建立一个应用程序项目。 (2)在窗体对象 Form1 的【属性】窗格中进行设置,将 IsMdiContainer 属性设定为 True, WindowState 属性设定为 Maxmized,如图 3-18 所示。 图 3-18 属性设置 (3)在窗体上设计菜单项。第 2 个主菜单项用于建立子窗体,如图 3-19 所示。 图 3-19 建立子窗体菜单 第 3 章 项目界面设计 71 3.4.2 建立 MDI子窗体 操作步骤如下。 (1)将 Window 菜单的【属性】窗格的 MdiList 属性置为 Ture,如图 3-20 所示。 图 3-20 属性设置 (2)选择【项目】菜单的【添加 Windows 窗体】命令,显示【添加新项】对话框,如 图 3-21 所示。 图 3-21 添加Windows 窗体 (3)单击【打开】按钮,即为项目添加一个新窗体(Form2),如图 3-22 所示。 Visual Basic .NET 程序设计教程 72 图 3-22 添加新窗体 (4)在窗体 Form2 上可以设置控件。在【解决方案资源管理器】窗格中,右击 Form1(), 在弹出的快捷菜单中选择【视图设计器】命令,单击 Form1()的 new 菜单项,在代码编辑器窗 口内编写代码,如图 3-23 所示。 图 3-23 代码编辑器窗口 (5)new 事件过程代码说明。 Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem2.Click Dim newMDI2 As New Form2() '设置子窗体的父窗体 第 3 章 项目界面设计 73 newMDI2.MdiParent = Me '显示新窗体 newMDI2.Show() End Sub (6)运行。运行程序,初始界面如图 3-24 所示。单击new 显示子窗体,如图 3-25 所示。 图3-24 MDI界面 图3-25 MDI 界面的父窗体和子窗体 3.5 工具栏界面 建立工具栏界面的步骤如下。 (1)建立一个工程窗体项目。 (2)将 ToolBar 控件从【工具箱】窗格中加入窗体,为窗体添加一个工具栏,如图 3-26 所示。 图 3-26 添加工具栏 Visual Basic .NET 程序设计教程 74 (3)右击工具栏,在弹出的快捷菜单中选择【属性】命令,弹出工具栏的【属性】窗格, 如图 3-27 所示。 图 3-27 Toolar【属性】窗格 (4)单击【属性】窗格内的 Buttons 属性,打开【ToolBarButton 集合编辑器】对话框, 如图 3-28 所示。 图 3-28 ToolBarButton 集合编辑器对话框 (5)单击【添加】按钮,如图 3-29 所示。在右侧属性列表框内选择 Style 属性设置按钮 风格,用 Text 属性设定按钮标题(例如“打开”), 然 后 单击【确定】按钮,结果如图 3-30 所 第 3 章 项目界面设计 75 示。 图 3-29 添加按钮 图 3-30 设计按钮风格和名称 (6)用同样的步骤添加其他按钮。 (7)代码编写窗口如图 3-31 所示。 Visual Basic .NET 程序设计教程 76 图 3-31 代码编辑器窗口 (8)运行结果如图 3-32 所示。 图 3-32 运行 3.6 状态栏界面 建立状态栏界面的步骤如下。 (1)建立一个项目。 (2)将控件从【工具箱】窗格中加入窗体,为窗体添加一个状态栏,如图 3-33 所示。 (3)在窗体设计视图中,选中窗体上的状态栏组件。在【属性】窗口中,选中 Panels 属性,单击其右侧的按钮【…】, 打开【StatusBarPanel 集合编辑器】对话框,如图 3-34 所示。 第 3 章 项目界面设计 77 图 3-33 添加状态栏 图 3-34 【StatusBarPanel 集合编辑器】对话框 (4)在集合编辑器中,单击【添加】按钮添加面板。在右侧的属性列表框中,给 Name 属性赋值为面板的名字,例如“XPanel”;给 Text 属性赋值为面板要显示的文本,例如“X”。 重复以上步骤添加其他面板。如图 3-35 所示。添加完成后,单击【确定】按钮关闭集合编辑 器,返回窗体设计视图。 Visual Basic .NET 程序设计教程 78 图 3-35 添加面板 (5)在 StatusBar 的【属性】窗格中,把状态栏的ShowPanels 属性设为True,使已添加 的面板在窗体中显示出来。 (6)为了在面板中显示当前的时间,还应在窗体上添加一个Timer 控件。直接从工具栏 拖动 Timer 控件到窗体上即可,如图 3-36 所示。然后,在 Timer 控件的【属性】窗格中,给 Timer 控件的 Interval 属性赋值为 1000(定时时间间隔), Enable 属性设置为 True。 图 3-36 添加Timer 控件 第 3 章 项目界面设计 79 (7)编写代码如下。 Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove StatusBar1.Panels(0).Text = "x:" + e.x.ToString() StatusBar1.Panels(1).Text = "y:" + e.y.ToString() End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System. _ EventArgs) Handles Timer1.Tick StatusBar1.Panels(2).Text = DateTime.Now.ToString("T") End Sub (8)运行结果如图 3-37 所示。 图 3-37 运行结果 练习题 1.文本编辑器界面设计 文本编辑器界面如图 3-38 所示。 图 3-38 界面设计 Visual Basic .NET 程序设计教程 80 设计要求如下。 (1)主菜单设计。如图 3-38 所示设计各主菜单项。 (2)工具栏设计。如图 3-38 所示设计工具栏的各命令按钮。 (3)将 RichTextBox 控件加入窗体。 (4)将打开、保存、字体、打印等控件加入界面。 2.设计一个简单的 Web 浏览器 (1)界面设计。如图 3-39 所示,设计主菜单栏和工具栏。在窗体上添加一个 Label 控件,其 Text 属性设置为 URL;添加一个 ComboBox 控件,其 Text 属性设置为 http//; 在窗体上添加一个 AxWebBrowser 控件,其 Name 属性设置为 WEB,用于显示网页内 容。 图 3-39 简单浏览器 (2)在文件主菜单下设【打开】子菜单,并编写程序如下。 Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem2.Click OpenFileDialog1.ShowDialog() WEB.Navigate(OpenFileDialog1.FileName) End Sub (3)运行程序,选择【文件】菜单的【打开】选项,在【打开】对话框内选择一个 HTML 文档或 Word 文档观察结果。显示 HTML 文档示例如图 3-40 所示。 第 3 章 项目界面设计 81 图 3-40 显示 HTML 文档 第 4 章 程序设计基础 本章要点: þ 基本数据类型 þ 变量声明 þ 运算符 þ 常用函数 常量、变量、运算符和函数是程序设计语言的基本元素,也是程序设计的重要基础知识。 本章介绍 VB .NET 系统中常用的数据类型、运算符和标准函数。 4.1 标识符命名 在 VB .NET 中,标识符是对常量、变量、数组、过程、函数、窗体、控件等各种用户定 义的语言成分的命名。标识符的命名要求遵循以下原则: (1)以字母开头; (2)由字母、数字和下划线组成,标识符中的英文字母不区分大小写; (3)不能使用 VB .NET 保留字; (4)在同一范围内必须是惟一的。 4.2 数据类型 程序中的所有数据都与一种具体的数据类型联系在一起。数据类型决定了数据在内存中 所占存储空间的容量、取值范围及其能够参加的运算。VB .NET 程序设计中常用的数据类型 是基本数据类型和用户自定义类型。 4.2.1 基本数据类型 VB .NET 提供的基本数据类型主要有以下几类。 1.数值型 VB .NET 的数值型数据可以分为整型数据和非整型数据两类。整型数据又可以分为字节 型、短整型、整型和长整型数据。非整型数据可以分为单精度浮点数、双精度浮点数和 Decimal 型数。表 4-1 给出了数值型数据的类型说明符、表示范围和所占内存空间。 第 4 章 程序设计基础 83 表 4-1 数值型数据 类型说明符(数据类型) 内 存 空 间 范 围 Byte(字节型) 1 B 0~255 Short(短整数) 2 B -32 768~32 767 Integer(整数) 4 B -2 147 483 648~2 147 483 647 Long(长整数) 8 B -9 223 372 036 854 775 808~9 223 372 036 854 775 807 Single(单精度浮点数) 4 B ±1.40E-45~±3.40E+38 最多 7 位有效数字 Double(双精度浮点数) 8 B ±4.94D-324~±1.79D+308 最多 15 位有效数字 Decimal 16 B 0~±79 228 162 514 264 337 593 543 950 335 之间不带小数点的数; 0~±7.922 816 251 426 433 759 354 395 033 5之间带 28 位小数的数;最多 29 位有效数字 2.字符串型 字符串型(String)数据是使用双引号括起来的字符序列,其中可以包括字母、数字、汉 字、空格、标点符号等。例如,"欢迎进入 VB .NET 世界","123",""等都是合法的字符串。 字符串中的字符个数可以在 0~2×1010 个之间,其中字符个数为 0 的字符串称为空串。 3.字符型 字符型(Char)数据可以表示 0~65 535 的无符号整数,每个字符型数据占 2B的内存空 间。 4.布尔型 布尔型(Boolean)数据只有两个取值,即True(逻辑真)和 False(逻辑假), 每个布尔 型数据占 2B空间。 在将数值数据类型转换为 Boolean 值时,0 会转换为False,而其他所有值都将转换为 True。 在将 Boolean 值转换为数值类型时,False 将转换为 0,True 将转换为-1。 5.日期型 日期型(Date)数据包含日期和时间,占 8B 内存空间,表示的日期范围从公元 0001 年 1 月 1 日到 9999 年 12月31 日,时间从凌晨 00:00:00到晚上 11:59:59。 日期型数据必须以 # 括起来,格式为 mm/dd/yyyy。例如#01/24/2004 1:20 PM#。 6.对象型 对象型(Object)数据类型是 VB .NET 的默认数据类型,任何类型的数据都能被存储到 Object 类型的变量中。每个对象型数据占 4 B内存空间。 4.2.2 用户自定义数据类型 用户自定义类型的数据由多个相同或不同的数据类型的数据组成。例如,学生档案中, 每条学生记录可以包括学号(字符串型数据)、 姓 名(字符串型数据)、 出 生日期(日期型数 据)和成绩(数值型数据)等多个数据,在程序中就可以将学生记录定义为用户自定义类型 数据。 用户自定义类型不是由 VB .NET 系统提供的数据类型,必须在程序中由用户自己定义。 在 VB .NET 中,将这种用户自定义的数据类型称为结构,组成结构的多个相同或不同类型的 数据称为结构的成员。 Visual Basic .NET 程序设计教程 84 结构类型声明语句的常用格式为 [Public | Private] Structure <数据类型名> Dim | Public | Private 成员名 1 As <数据类型> … Dim | Public | Private 成员名 n As <数据类型> End Structure 功能 在模块级或类级声明结构数据类型。 说明 (1)用 Public 声明的结构是全局结构,其访问性不受任何限制;用 Private 声明的结构 是模块级结构,只能从声明语句所在的模块中访问。 (2)结构的每个成员必须使用 Dim 语句或 Public,Private 等关键字声明。 (3)使用 Dim 语句声明的成员,默认的访问权限是 Public(全局的)。 ( 4 ) 结构名和成员名的命名规则遵循标识符的命名规则。 例如, Private Structure STU Dim Num As String Dim Name As String Dim Birthday As Date Dim Score As Single End Structure 使用该语句声明的 STU成为一种新的数据类型,可以在声明它的模块中使用。 4.3 常量 常量也称为常数,是指在程序运行过程中其值不能改变的量。VB .NET 中,常量分为直 接常量和符号常量两种。常量的数据类型可以是数值型、字符串型、日期型、逻辑型等数据 类型。 4.3.1 直接常量 直接常量是指在程序中直接给出的数值、字符、字符串、日期或逻辑值等具体的数据值。 按照数据类型划分,直接常量可以分为以下几类。 1.数值型常量 (1)字节型、短整型、整型和长整型常量 数值型常数可以使用十进制、十六进制或八进制表示。 十进制常数的表示方法和数学上整数的书写方法相同,短整数、整数和长整数中可以使 用正、负号。例如 23,-1234,-456 789 等。 十六进制常数以&H开头,后跟随合法的十六进制整数。例如&HFF00,-&H3D 等。 八进制常数以&O 开头,后跟随合法的八进制整数。例如&O64,-&O12 等。 (2)单精度浮点型、双精度浮点型和 Decimal 型常量 第 4 章 程序设计基础 85 单精度浮点数、双精度浮点数和 Decimal 型数都可以表示小数。浮点(Single 和 Double) 数表示的数的范围比 Decimal 的数字大,但所支持的有效数字比 Decimal 支持的少。 这 3 种数据类型的常数有两种表示方法。 一种表示方法与数学上小数的书写方法相同,可以使用正、负号和小数点。例如 123.4, -45.6789 等。 另一种表示方法称为指数表示法,格式为 mmmEeee。其中,mmm 是尾数(即有效数字), eee 是指数(即 10 的幂)。 例如,1.23E4 即 1.23×104。 Single 类型的负数取值范围为-3.402 823 5E+38~-1.401 298E-45,正数取值范围为 1.401 298E -45~3.402 823 5E+38;Double 类型的负数取值范围为-1.797 693 134 862 315 70E +308~-4.940 656 458 412 465 44E-324,正数取值范围为 4.940 656 458 412 465 44E-324~ 1.797 693 134 862 315 70E+308;Decimal 数据类型最多支持 29 位有效位数,可以表示最大为 7.922 8×1028 的值。Decimal 型数据尤其适合诸如财务之类的计算,它需要记录的数的位数很 大,但又不允许四舍五入误差。 2.字符型和字符串型常量 字符型常量是用一对双引号括起来的单个字符,例如“a”,“6”等。 字符串型常量是用一对双引号括起来的任意字符序列,例如“Visual Basic 6.0 程序设计”。 3.日期型常量 日期型常量用一对符号“#”括起来,可以是计算机系统能够识别的各种日期格式。例如, #12/23/2002 08:30:52 AM#。 4.逻辑型常量 逻辑型常量只有两个,即True 和 False。True 表示逻辑真,False 表示逻辑假。 除了可以采用上述表示方法外,有些类型的直接常量也可以使用类型字符限制常量的数 据类型,VB .NET 中常量可以使用的类型字符如表 4-2 所示。 表 4-2 常量类型字符 数 据 类 型 类 型 字 符 举 例 Char C "A"C Decimal D 或 @ 12.3D 或 12.3@ Double R 或 # 12.3R 或 12.3# Single F 或 ! 12.3F 或 12.3! Short S 123S Integer I 或 % 123I 或 123% Long L 或 & 123L 或 123& 4.3.2 符号常量 符号常量是用一个标识符代表一个直接常量,该标识符称为符号常量名。符号常量分为 两类:系统内部定义的符号常量和用户自定义的符号常量。 1.系统内部定义的符号常量 系统提供的内部常量在程序中可以直接使用。执行【视图】菜单【其他窗口】命令中的 Visual Basic .NET 程序设计教程 86 【对象浏览器】子命令,可以打开【对象浏览器】窗口,从中查看系统提供的所有内部符号 常量。 2.用户自定义的符号常量 用户自定义常量由用户通过 Const 声明创建。 格式 [Public | Private] Const<符号常量名>[As 数据类型] =<常量表达式> 功能 将表达式的值赋给指定的符号常量。 说明 (1)符号常量名的命名规则遵循标识符的命名规则。 例如,符号常量名 M_str2 colorTex x_3 是合法的,而下面的符号常量名就是非法的: 5x 开始字符不是字母 x+y 使用了符号“+” Then 使用了 VB .NET 保留字 (2)用 Public 声明的符号常数是全局的,其访问性不受任何限制;用 Private 声明的符 号常数是模块级的,只能从声明语句所在的模块中访问。 (3)As 子句中的数据类型可以是 Boolean,Byte,Char,Date,Decimal,Double,Integer, Long,Object,Short,Single 或 String 等数据类型。注意,必须为定义的每个常数使用单独的 As 子句。 (4)常量表达式中只能出现常量和运算符。常量包括直接常量、内部常量和已定义的符 号常量。 下面给出符号常量声明语句的例子。 Public Const pi As Single = 3.14159 Private Const Str = "VB 6.0" Const r As Integer = 100 Const r2 = r + 200 Const birth As Date = #12/31/1960# 4.4 变量 变量是指在程序的执行过程中,其值能够改变的量。变量具有名称和数据类型。程序中 通过变量名引用变量,变量名遵循标识符的命名规则;变量的数据类型决定了变量在内存中 所占存储空间的字节数及所存放的数据的类型。 VB .NET 程序中,变量必须先声明后使用,声明变量以指定其名称和特性。变量声明语 句的常用格式如下。 格式 1 Public<变量名> [As 数据类型] [, 变量名 [As 数据类型]] … 格式 2 Private <变量名> [As 数据类型] [, 变量名 [As 数据类型]] … 格式 3 Dim <变量名> [As 数据类型] [, 变量名 [As 数据类型]] … 第 4 章 程序设计基础 87 格式 4 Static <变量名> [As 数据类型] [, 变量名 [As 数据类型]] … 功能 指定变量的数据类型、作用域,并由系统为变量分配内存空间。 说明 (1)As 子句中的数据类型可以是数值型、字符串型、字符型、日期型和逻辑型等基本 数据类型,也可以是用户自定义数据类型。省略 As 子句时,默认的数据类型为对象类型。 (2)Public 语句在模块级使用,用于声明全局变量。全局变量可以在所有模块的所有过 程中使用。 (3)Private 语句在模块级使用,用于声明模块级变量。模块级变量可以在本模块的所有 过程中使用。 (4)Dim 语句在模块级使用时,用于声明模块级变量;在过程级使用时,用于声明过程 级的局部变量。局部变量只能在声明变量的过程中使用。 (5)Static 语句在过程级使用,声明过程级的局部静态变量。局部静态变量只能在声明 变量的过程中使用。 (6)变量被声明后,系统自动为变量初始化,即给变量赋一个初始值。数值型变量的初 始值为 0;Char 型变量的初始值为空字符(即 ASCII 值为 0 的字符); String 型变量的初始值 为一个零长度的字符串 (即空串""); Boolean 型变量的初始值为 False。 下面给出变量声明语句的例子。 Public X2 As Single '声明一个全局的单精度浮点型变量 X2 Private Str As String '声明一个模块级字符串变量 Str Dim A1 As Integer, A2 As Boolean '声明一个整型变量 A1,一个逻辑型变量 A2 Dim D1, D2 As Long '声明两个长整型变量 D1 和 D2 Static M As Integer '声明一个静态局部变量 M 在上述变量声明语句中,除了可以使用 As 子句标识变量的数据类型外,有些类型的变量 也可以使用类型字符标识变量的数据类型。变量声明语句中可以使用的类型字符如表 4-3 所 示。 表 4-3 变量类型字符 数 据 类 型 类 型 字 符 数 据 类 型 类 型 字 符 Decimal @ Integer % Double # Long & Single ! String $ 例如, Dim A% '声明Integer 型变量 A Static B! '声明Single 型变量 B Public X1& '声明Long 型变量 X1 Visual Basic .NET 程序设计教程 88 4.5 运算符和表达式 运算符是指对某种运算的操作符号。将常量、变量、函数用运算符连接起来的运算式称 为表达式。单个的常量、变量、函数可以看做最简单的表达式。VB .Net 的表达式有算术表达 式、字符串表达式、关系表达式和逻辑表达式。 4.5.1 算术运算符和算术表达式 1.算术运算符 算术运算符是指用于进行数学计算的运算符。VB .NET 中提供的算术运算符及其功能和 运算优先级如表 4-4 所示。 表 4-4 算术运算符 算术运算符 功 能 优 先 级 ^ 指数运算 - 求反运算 * / 乘法运算 除法运算 \ 整除运算 Mod 求模运算 + - 加法运算 减法运算 由 高 到 低 说明 假设参加运算的两个操作数分别为 a 和 b,则有规则如下。 (1)-a,a*b,a/b,a+b,a-b 运算规则与数学的运算规则相同。 (2)a^b 的功能是求 ab。注意,当 a 为负数时,b 必须是整数。例如,2^3 的运算结果是 8。 (3)a\b 的功能是先求 a/b,然后丢弃小数部分,返回整数部分。注意,如果参加运算的 数据 a 或 b 是浮点数,系统首先对它们四舍五入取整,然后再完成整除运算。例如,9\2 的运 算结果是 4;5.8\2 的计算结果是 3。 (4)a Mod b 的功能是求 a 整除 b 后的余数部分。如果参加运算的数据 a 或 b 是负数时, 用绝对值参加求模运算,运算结果的符号与 a 的符号相同。例如,5 Mod 3 的运算结果是 2; -5 Mod 3 的运算结果是-2。 2.算术表达式 算术表达式一般是指由数值型的常量、变量、函数和算术运算符组合而成的具有一定意 义的式子,算术表达式的运算结果为数值型数据。 将代数式改写成 VB表达式时需要注意两者的不同之处,如下述各例所示。 代数式 VB .NET 表达式 ax2+bx+c a*x^2+b*x+c 2 2 abc x - + (2*a*b-c)/(x+2) 第 4 章 程序设计基础 89 4.5.2 字符串运算符和字符串表达式 1.字符串运算符 字符串运算符的功能是实现字符串的连接,因而也称为连接运算符。VB .NET 系统提供 两个连接运算符。 (1)通用连接运算符 通用连接运算符“&”忽略操作数的类型,强制两个表达式的值进行字符串连接。例如, 21 & 53 的运算结果是字符串"2153"。 (2)字符串连接运算符 当参加运算的两个表达式的值是字符串时,字符串连接运算符“+”实现字符串连接运算; 当参加运算的两个表达式的值是字符串时,实现算术加法运算。例如,21 + 53 的运算结果是 整数 74;"21" + "53"的运算结果是字符串"2153"。 2.字符串表达式 字符串表达式是指由字符串型常量、变量、函数和字符串运算符连接而成的有意义的式 子,字符串表达式的运算结果仍然是一个字符串。 4.5.3 关系运算符和关系表达式 1.关系运算符 关系运算符也称为比较运算符,用于实现两个算术表达式、字符表达式、日期的比较。 关系运算符及其功能如表 4-5 所示。 表 4-5 关系运算符 关系运算符 功 能 优 先 级 = 相等 <> 不相等 < 小于 > 大于 >= 大于或等于 <= 小于或等于 所有关系运算符具有相同的优先级 其他关系运算符还有 Is 和 Like。Is 用于比较两个对象的引用变量,Like 用于比较两个字 符串。对这两个运算符的详细功能在此不多做介绍。 2.关系表达式 关系表达式是指由关系运算符连接两个算术表达式或字符表达式而组成的式子。关系表达 式的运算结果是逻辑型数据。比较关系成立时,结果为 True;比较关系不成立时,结果为 False。 例如,5 <= 3的结果为 False;"VB" > "Pascal"的结果为 True;"qaz" = "QAZ"的结果为 False。 4.5.4 逻辑运算符和逻辑表达式 1.逻辑运算符 逻辑运算符用于执行逻辑运算。参加逻辑运算的数据必须是逻辑型数据。VB .NET 中常 Visual Basic .NET 程序设计教程 90 用的逻辑运算符及其功能如表 4-6 所示。 表 4-6 逻辑运算符 逻辑运算符 功 能 优先级 Not 逻辑非 And 逻辑与 Or 逻辑或 Xor 逻辑异或 由 高 到 低 逻辑运算符的运算规则如表 4-7 所示。 表 4-7 逻辑运算符的运算规则(逻辑真值表) A B Not A A And B A Or B A Xor B False False True False False False False True True False True True True False False False True True True True False True True False 2.逻辑表达式 逻辑表达式是指用逻辑运算符连接多个关系表达式或逻辑型常量、变量、函数而组成的 式子。逻辑表达式的运算结果是逻辑值。例如,3 > 2 And 3 < 4的结果为True;Not (3 > 2 And 3 < 4)的结果为 False;1 > 3 Or 2 < 3的结果为True。 4.5.5 运算符的优先级 当表达式中只出现单一类型的运算符时,可以按照前面各表中指出的优先级顺序计算; 当表达式中出现不同类型的运算符时,从高到低的优先顺序为:算术运算符 → 字符串运算 符 → 关系运算符 → 逻辑运算符。 4.6 函数 函数是一段用来表示完成某种特定运算或功能的程序。与数学中使用的函数类似,当函 数的参数值发生变化时,函数的值也按照预定的规律变化。VB .NET 和.NET 框架提供了大量 的内部函数供用户使用。 4.6.1 数学函数 Visual Basic 6.0 中的数学函数已经由.NET 框架的 System.Math 类中的等效方法取代。因 此在 VB .NET 程序中,若要不受限制地使用这些函数,必须将 System.Math 命名空间导入项 目,方法是将下列代码添加到源代码顶端。 Imports System.Math 常用的数学函数如表 4-8 所示。 第 4 章 程序设计基础 91 表 4-8 常用的数学函数 一 般 格 式 功 能 说 明 Sin(x) 返回 x 的正弦值 Cos(x) 返回 x 的余弦值 Tan(x) 返回 x 的正切值 x 为弧度值, 返回值为 Double型 Atn(x) 返回 x 的反正切 结果为弧度值 Abs(x) 返回 x 的绝对值 Exp(x) 返回 ex 的值 e 的值约等于 2.718282 Log(x) 返回 ln x的值 求x的自然对数 Sgn(x) 根据 x 的符号不同,返回不同的值 x>0 时,返回 1 x=0 时,返回 0 x<0 时,返回-1 Sqr(x) 返回 x 的算术平方根 例如, Imports System.Math … Const pi = 3.14159 Dim x1, x2, x3, x4, x5, x6 Dim y1, y2, y3 x1 = Abs(50.3) '变量 x1 的值是 50.3 x2 = Abs(-50.3) '变量 x2 的值是 50.3 x3 = Sqr(9) '变量 x3 的值是 3 x4 = Sqr(12.5) '变量 x4 的值是 3.535 533 905 932 74 x5 = Exp(2) '变量 x5 的值是 7.389 056 098 930 65 x6 = Log(15) '变量 x6 的值是 2.708 050 201 102 21 y1 = Sin(30*pi/180) '计算 30°的正弦值 y2 = Cos(30*pi/180) '计算 30°的余弦值 y3 = Tan(30*pi/180) '计算 30°的正切值 4.6.2 取整函数 VB .NET 中常用的取整函数如表 4-9 所示。 表 4-9 常用的取整函数 一 般 格 式 功 能 Int(x) 返回不大于 x 的最大整数 Fix(x) 舍弃 x 的小数部分,返回整数部分 CInt(x) 对 x 四舍五入取整 例如, Dim m1, m2, m3, m4 As Integer Dim n1, n2, n3, n4 As Integer Visual Basic .NET 程序设计教程 92 Dim k1, k2, k3, k4 As Integer 'Int 函数 m1 = Int(12.7) 'm1 的值为 12 m2 = Int(-12.7) 'm2 的值为-13 m3 = Int(12.3) 'm3 的值为 12 m4 = Int(-12.3) 'm4 的值为-13 'Fix 函数 n1 = Fix(12.7) 'n1 的值为 12 n2 = Fix(-12.7) 'n2 的值为-12 n3 = Fix(12.3) 'n3 的值为 12 n4 = Fix(-12.3) 'n4 的值为-12 'CInt 函数 k1 = Cint(12.7) 'k1 的值为 13 k2 = Cint(-12.7) 'k2 的值为-13 k3 = Cint(12.3) 'k3 的值为 12 k4 = Cint(-12.3) 'k4 的值为-12 4.6.3 转换函数 VB .NET 中常用的转换函数如表 4-10 所示。 表 4-10 常用的转换函数 一 般 格 式 功 能 Asc(S) 返回字符串 S 中首字符的 ASCII 码 Chr(n) 返回 ASCII 码为整数 n 的字符 Val(S) 返回包含于字符串 S 内的数字 Str(n) 将数值 n 转换成字符串 例如, 'Asc 函数 Dim n As Integer n = Asc("abcd") 'n 的值是 97,即字母"a"的 ASCII 码值 'Chr 函数 Dim ch As Char ch = Chr(65) 'Ch 的值是"A" 程序设计中经常使用 Chr(10)表示换行符,Chr(13)表示回车符 'Val 函数 Dim n1, n2, n3, n4 As Single n1 = Val("1.234") 'n1 的值是 1.234 n2 = Val("1.23ASD45") 'n2 的值是 1.23 n3 = Val("-12ASD") 'n3 的值是-12 n4 = Val("ASD123") 'n4 的值是 0 'Str 函数 Dim s1, s2 As String s1 = Str(12.34) 's1 的值是" 12.34",正数无符号,转换成空格 第 4 章 程序设计基础 93 s2=Str(-12.34) 's2 的值是"-12.34",负数的符号直接转换,无前导空格 4.6.4 数值计算函数 1.Rnd 函数 格式 Rnd([x]) 功能 产生一个小于1但大于或等于0的随机数,返回值为 Single 型。 说明 参数x是Single 型的常量、变量或数值表达式,x 可以省略。 对于不同的 x,产生的随机数的区别如下。 (1)当 x<0 时,每次都使用 x 作为随机数种子,因而会得到相同的随机数序列。 (2)当 x>0 时,产生序列中的下一个随机数。 (3)当 x=0 时,产生最近生成的随机数。 (4)省略 x 时,产生序列中的下一个随机数。 【例 4-1】随机数函数的应用。 在窗体上放置一个文本框控件( TextBox1)和一个按钮(Button1), 将 文本框的 MultiLine 属性设置为True,将命令按钮的 Text 属性设置为“产生随机数”,如图 4-1 所示,并编写代码 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim x1, x2, x3, x4 x1 = Rnd(1) x2 = Rnd(-2) x3 = Rnd() x4 = Rnd(0) TextBox1.Text = TextBox1.Text & Str(x1) & Str(x2) & Str(x3) & Str(x4) & _ vbCrLf End Sub 执行程序,两次单击【产生随机数】按钮,得到的运行结果如图 4-1 所示。 图 4-1 例4-1 运行结果示例 Rnd 函数中,参数 x 的值决定了 Rnd 生成随机数的方式,每一次后续调用 Rnd 函数都 用序列中前一个生成的数作为下一个数的种子,因此对于任何给定的初始种子都会生成相同 Visual Basic .NET 程序设计教程 94 的随机数序列。因而,在调用 Rnd 之前,一般先使用无参数的 Randomize 语句初始化随机 数生成器,该生成器具有一个基于系统计时器的种子,可以产生不同的随机数序列。 为了生成区间[n1,n2]之间的随机整数,可以使用以下公式: Int((n2 -n1 + 1) * Rnd + n1) 例如,生成[10,15]之间的随机整数 x,可以使用语句: x= Int((15-10+1)*Rnd + 10) 2.IIf 函数 格式 IIf(表达式 1,表达式 2,表达式 3) 功能 表达式1的值为True 时,函数的返回值为表达式 2 的值,否则函数的返回值为表 达式 3 的值。 说明 参数x是Single 型的常量、变量或数值表达式,x 可以省略。 例如, Dim x, y As Single x = Val(InputBox("x=")) y = IIf(x >= 0, x, -x) 运行上述代码,输入的 x 值为大于或等于 0 的数时,变量 y 的值等于 x;输入的 x 值为 负数时,变量 y 的值等于-x。 4.6.5 字符操作函数 1.字符串截取函数 字符串截取函数有 3 个,其格式和功能如表 4-11 所示。 表 4-11 字符串截取函数 格 式 功 能 Left(s, n) 从字符串 s 的左边截取 n 个字符 Right(s, n) 从字符串 s 的右边截取 n 个字符 Mid(s, m, n) 从字符串 s 的第 m 个字符开始截取 n 个字符 说明 Left 函数和 Right 函数用于 Windows 窗体或其他任何具有 Left 属性和 Right 属性的 类时,必须用 Microsoft.VisualBasic.Left 和 Microsoft.VisualBasic.Right 对函数进行完全限定。 例如, Dim s1, s2, s3, s4 As String s1 = "ABCDEFGH" s2 = Microsoft.VisualBasic.Left(s1, 2) 's2 的值"AB" s3 = Microsoft.VisualBasic.Right(s1, 3) 's3 的值是"FGH" s4 = Mid(s1, 3, 2) 's4 的值是"CD" 2.字符串长度检测函数 格式 Len(Str) 功能 求字符串 Str 中字符的个数。 第 4 章 程序设计基础 95 例如, s1 = "VB" i = Len(s1) ' i 的值是 2 3.子字符串检索函数 格式 Instr([n, ]Str1, Str2[, c]) 功能 从字符串 Str1 的第 n 个字符开始查找子字符串Str2 最先出现的位置。若存在,返 回该位置值;若不存在,返回整数 0。 说明 (1)省略参数 n 时,从字符串Str1 的第一个字符开始查找。 (2)参数 c 是整数 0,1 或 2,用于指定字符串的比较方法,可以省略。 例如, n1 = Instr("ABCDEF","BC") 'n1 的值为 2 n2 = Instr(2,"ABCDEF","BC") 'n2 的值为 2 n3 = Instr(4,"ABCDEF","BC") 'n3 的值为 0 4.删除空格函数 删除空格函数有 3 个,其格式和功能如表 4-12 所示。 表 4-12 删除空格函数 格 式 功 能 LTrim(s) 删除字符串 s 开头的所有空格 RTrim(s) 删除字符串 s 末尾的所有空格 Trim(s) 删除字符串 s 开头和末尾的所有空格 例如, Str1 = " ABC " s1 = LTrim(Str1) 's1 的值是"ABC " s2 = RTrim(Str1) 's2 的值是" ABC" s3 = Trim(Str1) 's3 的值是"ABC" 5.大小写字母转换函数 大小写字母转换函数有两个,其格式和功能如表 4-13 所示。 表 4-13 大小写字母转换函数 格 式 功 能 Ucase(s) 将字符串 s 中的所有字母转换成大写字母 Lcase(s) 将字符串 s 中的所有字母转换成小写字母 例如, Str1 = "Hello" Visual Basic .NET 程序设计教程 96 s1 = Ucase(Str1) 's1 的值是"HELLO" s2 = Lcase(Str1) 's2 的值是"hello" 6.生成空格字符串函数 格式 Space(n) 功能 生成一个由 n 个空格组成的字符串。 例如, Str1 = Space(2) 'Str1 的值是" ",即包含 2 个空格的字符串 4.6.6 日期和时间函数 1.提取年、月、日函数 该组函数共 3 个,其格式和功能如表 4-14 所示。 表 4-14 提取年、月、日函数 格 式 功 能 Year(d) 返回日期表达式 d 的年份,返回值是 4 位整数 Month(d) 返回日期表达式 d 的月份,返回值是 1~12 的整数 Day(d) 返回日期表达式 d 的日,返回值是 1~31 的整数 说明 (1)由于 System.WinForms 命名空间将 Day 定义成枚举,所以若使用 Day 函数,需要 用 Microsoft.VisualBasic 命名空间对其进行限制。 (2)VB .NET 中不提供返回当前系统日期的函数。在程序中,可以使用 Today 属性返回 当前系统日期,使用 Now 属性返回当前系统日期和系统时间。 例如, Dim d As Date d = #2/20/2003# TextBox1.Text = Year(d) '显示 2003 TextBox2.Text = Month(d) '显示 2 TextBox3.Text = Microsoft.VisualBasic.Day(d) '显示 20 TextBox4.Text = Year(Today) '显示当前系统日期的年份 TextBox5.Text = Month(Today) '显示当前系统日期的月份 TextBox6.Text = Microsoft.VisualBasic.Day(Today) '显示当前系统日期的日 2.提取时、分、秒函数 该组函数共 3 个,其格式和功能如表 4-15 所示。 表 4-15 提前时、分、秒函数 格 式 功 能 Hour(exp) 返回表达式 exp 的时,返回值是 0~23 的整数 Minute(exp) 返回表达式 exp 的分,返回值是 0~59 的整数 Second(exp) 返回表达式 exp 的秒,返回值是 0~59 的整数 第 4 章 程序设计基础 97 例如, TextBox1.Text = Hour(Now) '显示当前系统时间的小时 TextBox2.Text = Minute(Now) '显示当前系统时间的分钟 TextBox3.Text = Second(Now) '显示当前系统时间的秒 练习题 1.设计一个程序,向文本框中输入变量 A 和 B 的值,然后将两者的值交换显示在标签 中。 2.编制程序,完成摄氏温度向华氏温度的转换。转换公式为 华氏温度=摄氏温度×9/5+32 3.输入要购买的 3 种商品的单价和数量,输出所用的总金额。要求输入和输出均使用文 本框。 第 5 章 基本流程控制 本章要点: þ 顺序结构程序设计 þ 选择结构程序设计 þ 循环结构程序设计 程序设计有 3 种基本结构,分别是顺序结构、选择结构和循环结构。本章主要介绍实现 这 3 种基本结构的主要语句。 5.1 语句 语句是 VB .NET 程序的基本组成部分。语句由 VB .NET 保留字(也称为关键字)、常量、 变量、运算符和函数等基本元素组成。 常用的 VB语句主要有以下 3 类。 (1)基本语句 基本语句包括赋值语句、注释语句、停止语句、输入/输出语句等。 (2)选择结构语句 选择结构语句包括If…Then…Else 语句,Select Case 语句等。 (3)循环结构语句 循环结构语句包括 For…Next 语句,Do…Loop 语句,While…End While 语句等。 在代码编辑器中输入程序语句时,要求遵循以下书写规则。 (1)每行程序代码必须以回车结束。 (2)一行中可以书写多条语句,各语句之间需要用冒号分隔。例如, A = 10: B = 20: C = 30 (3)一个语句可以分多行书写,使用空格和下划线作为续行符。例如, A = "qaz" + _ "wsx" (4)语句中的保留字和各种标识符(例如常量名、变量名、运算符、函数名、控件名、 过程名等)不区分大小写。 (5)各保留字、标识符之间应有空格分隔。 (6)除注释内容之外,语句中出现的所有标点符号均为英文标点符号。 第 5 章 基本流程控制 99 5.2 顺序结构 顺序结构是最简单的一种程序结构,顺序结构程序流程图如图 5-1 所示。计算机按照语句的书写顺序执行顺序结构中的每一条语 句。 5.2.1 基本语句 1.简单赋值语句 格式 <变量名> = <表达式> 功能 将表达式的计算结果存储在变量中。 说明 表达式的类型必须可以隐式转换为变量的类型。 例如, A = 2*3 '变量 A 的值是 6 2.复合赋值语句 在 VB .NET 中,除了使用运算符“=”实现简单赋值之外,还支持复合赋值运算。复合 赋值运算符是将一个算术运算符或字符串连接运算符与一个赋值运算符连写在一起,实现复 合赋值。复合赋值运算符包括:&=、+=、-=、*=、/=、\=和^=运算符。由复合赋值运算符构 成的复合赋值语句如下。 格式 1 <变量> &= <表达式> 功能 赋值号左侧的字符串变量与右侧的字符串表达式相连接,并将结果赋给该变量。 格式 2 <变量> += <表达式> 功能 赋值号左侧的变量值与右侧的表达式值相加,并将结果赋给该变量。也可以将赋 值号左侧的字符串变量与右侧的字符串表达式相连接,并将结果赋给该变量。 格式 3 <变量> -= <表达式> 功能 从赋值号左侧的变量值中减去右侧的表达式值,并将结果赋给该变量。 格式 4 <变量> *= <表达式> 功能 赋值号左侧的变量值与右侧的表达式值相乘,并将结果赋给该变量。 格式 5 <变量> /= <表达式> 功能:赋值号左侧的变量值除以右侧的表达式值,并将结果赋给该变量。 格式 6 <变量> \= <表达式> 功能 赋值号左侧的变量值除以右侧的表达式值,并将整数结果赋给该变量。 格式 7 <变量> ^= <表达式> 功能 计算以赋值号左侧的变量值为底、以右侧的表达式值为指数的幂,并将结果赋回 给该变量。 【例 5-1】在窗体上放置一个命令按钮(Name 属性为 Button1)和一个标签(Name 属性 为 Label1), 并 在 Button1 的 Click 事件中编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ 图 5-1 顺序结构流程图 Visual Basic .NET 程序设计教程 100 System.EventArgs) Handles Button1.Click Dim a As Integer a = 10 a *= 2 + 3 Label1.Text = Str(a) End Sub 运行程序,单击命令按钮,则标签上显示的值是 50。 3.Mid 赋值语句 格式 Mid(字符串变量, number1[, number2]) = <字符串表达式> 功能 用字符串表达式的值替换字符串变量中的指定字符。 说明 (1)number1 为整型表达式,其值指定了替换的起始位置。 (2)number2 为可选整型表达式,其值指定了替换的字符个数。 (3)要替换的字符数目应该小于或等于字符串变量中的字符数目。 例如,设有如下变量声明和赋值语句: Dim a As String a = "ABCDEF" 则 Mid(a, 2, 4) = "123456" '执行该语句后变量 a 的值是"A1234F" Mid(a, 2, 4) = "123" '执行该语句后变量 a 的值是"A123EF" Mid(a, 3) = "123456" '执行该语句后变量 a 的值是"AB1234" Mid(a, 3) = "123" '执行该语句后变量 a 的值是"AB123F" 4.End 语句 格式 End 功能 结束程序的执行。 说明 End语句可以放在过程的任何位置以结束代码执行,关 闭 用 Open 语句打开的文件, 并且清除变量。 5.Randomize 语句 格式 Randomize [number] 功能 初始化随机数生成器。 说明 (1)number 为可选数值表达式。 (2)Randomize 语句使用 number 的值将 Rnd 函数的随机数生成器初始化,并给它一个 新的种子值。如果省略 number,则用系统计时器返回的值作为新的种子值。 6.注释语句 格式 1 Rem 注释内容 格式 2 ' 注释内容 功能 在程序中包含注释。 第 5 章 基本流程控制 101 说明 (1)注释语句既可以单独占一行,也可以写在其他语句的末尾。 (2)注释内容可以是任意字符序列。 5.2.2 InputBox 函数 大部分应用程序在运行时都需要用户从键盘输入数据,然后根据输入的数据继续向下处 理。例如,如果计算长方形的面积,则需要用户首先输入长和宽,然后才能计算面积并输出。 VB .NET 中经常使用文本框控件的Text 属性向应用程序输入数据。除此之外,经常用于数据 输入的还有 InputBox 函数。InputBox 函数的一般格式和功能如下。 格式 InputBox(<提示>[, 标题] [, 默认值] [, Xpos] [, Ypos]) 功能 弹出对话框,形如图 5-2 所示,等待用户输入。如果用户单击 OK按钮或按 Enter 键,则文本框中的字符串是函数的返回值;如果用户单击 Cancel 按钮,则函数的返回值是空 串。 说明 (1)<提示>是必需的字符串表达式,其内容作为提示信息显示在对话框中。如果需要分 多行显示,可以将回车符(Chr(13))或换行符(Chr(10))连接到提示字符串中。例如, InputBox("第一行提示" + Chr(13) + "第二行提示") (2)<标题>是可选字符串表达式,其内容显示在对话框的标题处,省略时显示应用程序 名。 (3)<默认值>是可选字符串表达式。弹出对话框后,如果用户未输入而直接单击 OK按 钮或按 Enter 键,则函数返回指定的默认值。省略默认值时,返回空串。 (4)Xpos,Ypos 是成对出现的,是可选的数值表达式。Xpos 指定了对话框左边距屏幕 左边的水平距离;Ypos 指定了对话框上边距屏幕上边的距离。 【例 5-2】使用InputBox 函数输入圆的半径,求圆的面积。 在窗体的单击事件中编写代码如下。 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)_ Handles MyBase.Click Const pi = 3.14159 Dim g As Graphics '声明一个 Graphics 类型变量 Dim r As Single g = Me.CreateGraphics '对变量 g 初始化 g.Clear(Me.BackColor) '清除窗体上的内容 r = Val(InputBox("请输入半径:", "半径输入框", "1")) g.DrawString("半径=" & r, Me.Font, Brushes.Red, 10, 5) g.DrawString("面积=" & Str(pi * r * r), Me.Font, Brushes.Red, 10, 20) End Sub 运行程序,单击窗体,则首先弹出输入对话框如图 5-2 所示,等待用户输入半径值。单 击 OK按钮后,在窗体上显示计算结果,如图 5-3 所示。 Visual Basic .NET 程序设计教程 102 图 5-2 调用InputBox 函数时弹出输入对话框 图 5-3 计算结果显示 5.2.3 MsgBox 函数 输出是应用程序必不可少的一部分,只有通过输出,才能将程序的处理结果展现给用户。 VB .NET 中提供的输出方法很多,例如我们已经使用过的标签控件和文本框控件的 Text 属性 均可以实现数据输出。除此之外,经常用于实现数据输出的还有 MsgBox 函数。 MsgBox 函 数的一般格式和功能如下。 格式 MsgBox(<提示>[, 按钮样式] [, 标题]) 功能 弹出消息对话框,显示提示信息,等待用户单击按钮,并返回一个整数值。 说明 (1)<提示>是必需的字符串表达式,其内容作为提示信息显示在对话框中。 (2)<按钮样式>是可选数值型表达式,用 于 指 定显示按钮的数目及形式,使用的图标样 式,默认按钮是什么,以及消息框的强制回应等。如果省略,则默认值为 0。按钮样式的常用 值是表 5-1、表 5-2、表 5-3 中三类常数之和。 表 5-1 用于指定按钮数目及形式的 MsgBoxStyle 枚举值 MsgBoxStyle 枚举值 值 功 能 OKOnly 0 显示【确定】按钮 OKCancel 1 显示【确定】和【取消】按钮 AbortRetryIgnore 2 显示【终止】、【重试】和【忽略】按钮 YesNoCancel 3 显示【是】、【否】和【取消】按钮 YesNo 4 显示【是】和【否】按钮 RetryCancel 5 显示【重试】和【取消】按钮 第 5 章 基本流程控制 103 表 5-2 用于指定图标样式的 MsgBoxStyle 枚举值 MsgBoxStyle枚举值 值 功 能 Critical 16 显示【关键消息】图标 Question 32 显示【警告查询】图标 Exclamation 48 显示【警告消息】图标 Information 64 显示【信息消息】图标 表 5-3 用于指定缺省按钮的 MsgBoxStyle 枚举值 MsgBoxStyle 枚举值 值 功 能 DefaultButton1 0 第 1 个按钮是默认值 DefaultButton2 256 第 2 个按钮是默认值 DefaultButton3 512 第 3 个按钮是默认值 (3)<标题>是可选字符串表达式,其内容将显示在消息框标题栏中。如果省略,则标题 栏中显示应用程序名。 (4)MsgBox 函数的返回值,由用户单击的按钮决定。各按钮对应的 MsgBoxStyle 枚举 值和整数值如表 5-4 所示。 表 5-4 MsgBox函数的返回值 MsgBoxStyle枚举值 值 用户的选择 OK 1 单击【确定】按钮 Cancel 2 单击【取消】按钮 Abort 3 单击【终止】按钮 Retry 4 单击【重试】按钮 Ignore 5 单击【忽略】按钮 Yes 6 单击【是】按钮 No 7 单击【否】按钮 例如,在消息框中显示【确定】和【取消】两个按钮,【警告查 询】图标,并把【取消】按钮设置为默认按钮,可以使用如下语句: a = MsgBox("确定吗?", 1 + 32 + 256, "消息框示例") 运行时,弹出的消息框如图 5-4 所示。 如果用户单击【确定】按钮,变量 a 的值是 1;如果用户单击 【取消】按钮,则变量 a 的值是 2。 5.3 选择结构 选择结构是结构化程序设计的基本结构之一。它根据条件判断的结果选择执行程序的某 一分支,而跳过其他分支,因此也称为分支结构。常见的选择结构有单分支、双分支和多分 支 3 种,如图 5-5 所示。 图 5-4 消息对话框 Visual Basic .NET 程序设计教程 104 (a)单分支 (b)双分支 (c) 多分支 图5-5 选择结构 VB .NET 中主要使用 If 语句和 Select Case 语句实现选择结构。 5.3.1 行If 语句 格式 If <条件表达式> Then <语句块 1> [Else <语句块 2>] 功能 如果条件表达式的值为True,则 执 行 Then 后的语句块 1,否则执行 Else 后的语句 块 2。 说明 (1)整个 If…Then…Else 语句必须写在同一行。 (2)语句块中包含多条语句时,各语句之间用冒号(:)分隔。 (3)如果语句块 2 为空,则连同保留字 Else 一起省略书写。 例如, Dim a As Single a = Val(InputBox("请输入一个数值")) If a < 0 Then a = -a MsgBox("a 的绝对值 = " & Str(a)) 5.3.2 块If 语句 格式 If <条件表达式> Then <语句块 1> [Else <语句块 2>] End If 功能 如果条件表达式的值为True,执行语句块 1;否则跳过语句块 1,执行语句块 2。 说明 (1)如果语句块 2 为空,则连同保留字 Else 一起省略书写。 (2)行 If 语句属于块If 语句的特例。 【例 5-3】输入 3 个正数,判断以这 3 个数作为边长能否构成三角形。如果能构成三角形, 求三角形的面积,否则给出提示信息。 第 5 章 基本流程控制 105 参照图 5-6 在窗体上放置 4 个标签、3 个文本框和 1 个命令按钮,并按表 5-5 所示设置窗 体和各控件的相关属性。 表 5-5 例5-3 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 计算三角形面积 Label1 Text 边长 a Label2 Text 边长 b Label3 Text 边长 c Text 空白 标签 Label4 BackColor 白色 输出结果 txta Text 空白 输入边长 a txtb Text 空白 输入边长 b 文本框 txtc Text 空白 输入边长 c 命令按钮 Button1 Text 计算 为【计算】按钮的 Click 事件编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim a, b, c As Single Dim t, s As Single a = Val(txta.Text) b = Val(txtb.Text) c = Val(txtc.Text) If(a + b) > c And (b + c) > a And (c + a) > b Then t = (a + b + c) / 2 s = Math.Sqrt(t * (t - a) * (t - b) * (t - c)) Label4.Text = "三角形面积=" & Str(s) Else Label4.Text = "不能构成三角形!" End If End Sub 运行程序,输入边长 a,b,c 后,单击【计算】按钮,运行结果如图 5-6 所示。 图 5-6 例5-3 用户界面及运行结果示意图 Visual Basic .NET 程序设计教程 106 5.3.3 If…Then…ElseIf 语句 格式 If <条件表达式 1> Then [语句块 1] [ElseIf <条件表达式 2> Then 语句块 2 ] … [Else 语句块 n ] End If 功能 如果条件表达式 1 的值为 True,执行语句块 1;否则,如果条件表达式 2 的值为 True,执行语句块 2;……如果所有条件都不成立,则执行语句块 n。 说明 (1)每个语句块中还可以包含另外一个 If语句,形成嵌套。 (2)在嵌套的 If 结构中,If 和 End If 必须成对出现,并且遵循“最近匹配”原则,即 End If 总是与离它最近的 If 匹配。 【例 5-4】输入方程 ax2+bx+c=0 的系数 a,b,c,求方程的根。 在窗体上放置 5 个标签、3 个文本框和 3 个命令按钮,如图 5-7 所示,并按表 5-6 设置各 窗体和控件的属性值。 表 5-6 例5-4 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 一元二次方程求根 Label1 Text 系数 A Label2 Text 系数 B Label3 Text 系数 C Text 空白 输出根 x1 lblx1 BackColor 白色 Text 空白 输出根 x2 标签 lblx2 BackColor 白色 txtA Text 空白 输入系数 A txtB Text 空白 输入系数 B 文本框 txtC Text 空白 输入系数 C Button1 Text 求根 Button2 Text 清除 命令按钮 Button3 Text 退出 为【求根】、【清除】和【退出】按钮的 Click 事件分别编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【求根】按钮 第 5 章 基本流程控制 107 Dim A, B, C, D As Single A = Val(txtA.Text) B = Val(txtB.Text) C = Val(txtC.Text) D = B ^ 2 - 4 * A * C If D < 0 Then lblx1.Text = "方程无实数根" ElseIf D = 0 Then lblx1.Text = "方程有一个实数根" lblx2.Text = "X1,2=" & Str(-B / (2 * A)) Else lblx1.Text = "X1=" & Str((-B + Math.Sqrt(D)) / (2 * A)) lblx2.Text = "X2=" & Str((-B - Math.Sqrt(D)) / (2 * A)) End If End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click '【清除】按钮 txtA.Text = "" : txtB.Text = "" : txtC.Text = "" lblx1.Text = "" : lblx2.Text = "" End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click '【退出】按钮 End End Sub 运行程序,输入系数 A,B,C 后,单击【求根】按钮,运行结果如图 5-7 所示。 图 5-7 例5-4 用户界面及运行结果 5.3.4 Select Case 语句 格式 Select Case <测试表达式> [Case <表达式列表 1> [语句块 1]] [Case <表达式列表 2> [语句块 2]] … Visual Basic .NET 程序设计教程 108 [Case Else [语句块 n]] End Select 功能 计算测试表达式的值,然后与 Case 子句中的表达式列表进行比较。如果测试表达 式的值与 Case 子句中的表达式列表相匹配,则执行对应的语句块,并跳出 Select Case 结构; 如果测试表达式的值与所有的表达式列表均不匹配,则执行 Case Else 之后的语句块 n。 说明 如果有多个 Case 与测试表达式相匹配,则执行第一个匹配的 Case 后的语句块。 Case 子句中的表达式列表有以下 3 种格式。 (1)<表达式 1>,<表达式 2>,…,<表达式 n> 如果测试表达式的值与上述表达式中的一个相等,则 认 为 测试表达式与该 Case 子句相匹 配。例如, Case 1, 3, 7, 9 Case "计算机", "电脑" (2)表达式 1 To 表达式 2 该格式由表达式 1 和表达式 2 给定一个数据范围。如果测试表达式的值在该范围内,则 认为测试表达式与该 Case 子句相匹配。例如, Case 1 To 10 Case "a" To "z" (3)Is <比较运算符> <表达式> 如果测试表达式的值与给定的表达式之间进行比较运算的结果为 True,则认为测试表达 式与该 Case 子句相匹配。例如, Case Is < 10 以上 3 种格式可以混合使用。例如, Case 1, 3, 4, 10 To 15, Is > 100 【例 5-5】 输入百分制的成绩,转换为等级制。转换规则为:当成绩<60 时,转换为 “不及格”;当 60≤成绩<70 时,转换为“及格”;当 70≤成绩<80 时,转换为“中等”;当 80≤成绩<90 时,转换为“良好”;当 90≤成绩≤100 时,转换为“优秀”。 在窗体上放置 2 个文本框,2 个标签和 2 个命令按钮,如图 5-8 所示,并按表 5-7 设置窗 体和各控件的属性值。 表 5-7 例5-5 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 成绩转换 Label1 Text 百分制成绩 标签 Label2 Text 等级 文本框 TextBox1 Text 空白 输入百分制成绩 第 5 章 基本流程控制 109 续表 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 Text 空白 输出等级制分数 文本框 TextBox2 ReadOnly True 文本框不能编辑 Button1 Text 转换 命令按钮 Button Text 清除 为【转换】和【清除】按钮的 Click 事件分别编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【转换】按钮 Dim Score As Integer Score = Val(TextBox1.Text) Select Case Score Case 0 To 59 TextBox2.Text = "不及格" Case 60 To 69 TextBox2.Text = "及格" Case 70 To 79 TextBox2.Text = "中等" Case 80 To 89 TextBox2.Text = "良好" Case 90 To 100 TextBox2.Text = "优秀" Case Else TextBox2.Text = ("非法数据") End Select End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click '【清除】按钮 TextBox1.Text = "" TextBox2.Text = "" TextBox1.Focus() End Sub 运行程序,输入一个百分制的成绩,单击【转 换】按钮后,结果如图 5-8 所示。 5.3.5 GoTo 语句 格式 GoTo <行标记> 功能 使程序无条件地跳转到行标记所指定的行。 说明 行标记的命名方法与标识符的命名方法相同。 图 5-8 例5-5 用户界面及运行结果 Visual Basic .NET 程序设计教程 110 例如,计算 1~100 所有奇数之和,可以利用 GoTo 语句实现,代码如下。 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Click Dim i As Integer = 1 Dim Sum As Integer = 0 Loop1: Sum += i i += 2 If i < 100 Then GoTo Loop1 Dim strMsg As String strMsg = "1+3+5+...+99=" & Str(Sum) Dim g As Graphics g = Me.CreateGraphics g.DrawString(strMsg, Me.Font, Brushes.Blue, 20, 20) End Sub 程序中的 Loop1 为行标记。 5.4 循环结构 循环结构是按照一定的条件,反复执行某一段程序的结构。循环结构中被反复执行的程 序段称为循环体。VB .NET 中实现循环结构的语句主要有 For…Next 循环语句、While…End While 循环语句和 Do…Loop 循环语句。 5.4.1 For…Next 循环语句 格式 For <循环控制变量>=<初值> To <终值> [Step <步长>] [语句块 1] [Exit For] [语句块 2] Next [循环控制变量] 功能 当循环控制变量的值在初值和终值所限定的范围内时,执行循环体。步长>0 时, 执行流程如图 5-9 所示;步长<0 时,执行流程如图 5-10 所示。 说明 (1)初值、终值和步长都可以是表达式。循环控制变量、初值、终值和步长可以使用任 何数值型数据,但通常使用整型数据。 (2)省略 Step 子句时,默认步长为 1。 (3)Exit For 语句的功能是强制退出 For 循环,转去执行 Next 语句后面的语句。在循环 体中可以使用多个 Exit For 语句。 【例 5-6】计算 n!。 在窗体上放置 2 个标签、2 个文本框和 1 个命令按钮,如图 5-11 所示,并按表 5-8 设置 第 5 章 基本流程控制 111 窗体和各控件的属性值。 图5-9 步长>0的For…Next 语句执行流程图 图5-10 步长<0的For…Next 语句执行流程图 表 5-8 例5-6 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 计算阶乘 Label1 Text n= 标签 Label2 Text n!= TextBox1 Text 空白 输入 n 值 文本框 TextBox2 Text 空白 输出 n! 命令按钮 Button1 Text 计算 n! 为【计算 n!】 按 钮 的 Click 事件编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim i, n As Integer Dim p As Long n = Val(TextBox1.Text) If n < 0 Then MsgBox("非法输入,请重新输入 n 值!", MsgBoxStyle.Exclamation) Exit Sub End If p = 1 For i = 1 To n p = p * i Next TextBox2.Text = Str(p) End Sub Visual Basic .NET 程序设计教程 112 运行程序,输入 n 值,单击【计算 n!】 按 钮 ,结果如图 5-11 所示。 图 5-11 例5-6 用户界面和运行结果 5.4.2 Do…Loop 循环 1.Do While…Loop 格式 Do While <条件表达式> [语句块 1] [Exit Do] [语句块 2] Loop 功能 当条件表达式的值为 True 时,执行循环体中的语句,否则结束循环,执行 Loop 之后的语句。执行流程如图 5-12 所示。 说明 循环体中使用 Exit Do 语句可以强制退出循环。 2.Do…Loop While 格式 Do [语句块 1] [Exit Do] [语句块 2] Loop While <条件表达式> 功能 先执行一次循环体,然后判断条件表达式。如果条件表达式的值为 True,继续执 行循环体,否则,结束循环,执行 Loop While 之后的语句。执行流程如图 5-13 所示。 图5-12 Do While…Loop 语句执行流程图 图5-13 Do…Loop While 语句执行流程图 说明 循环体中使用 Exit Do 语句可以强制退出循环。 3.Do Until…Loop 格式 Do Until <条件表达式> 第 5 章 基本流程控制 113 [语句块 1] [Exit Do] [语句块 2] Loop 功能 当条件表达式的值为 False 时,重复执行循环体,否则结束循环,执行 Loop 之后 的语句。执行流程如图 5-14 所示。 说明 循环体中使用 Exit Do 语句可以强制退出循环。 4.Do…Loop Until 格式 Do [语句块 1] [Exit Do] [语句块 2] Loop Until <条件表达式> 功能 首先执行循环体,然后判断条件表达式的值是否为 False,如果是,重复执行循环 体,否则结束循环,执行 Loop Until之后的语句。执行流程如图 5-15 所示。 图5-14 Do Until…Loop 语句执行流程图 图5-15 Do…Loop Until 语句执行流程图 说明 循环体中使用 Exit Do 语句可以强制退出循环。 【例 5-7】输入 x,利用公式 357 sin 3!5!7! xxxxx»-+-+L,求 sin x 的近似值,直到最后一 项的绝对值小于 10-6 为止。 在窗体上放置 2 个标签、2 个文本框和 3 个命令按钮,如图 5-16 所示,并按表 5-9 设置 窗体和各控件的属性值。 表 5-9 例5-7 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 计算 Sin (x)的近似值 Label1 Text x= 标签 Label2 Text Sin (x)≈ TextBox1 Text 空白 输入 x 值 文本框 TextBox2 Text 空白 输出 Sin (x)值 命令按钮 Button1 Text 计算 Visual Basic .NET 程序设计教程 114 续表 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 Button2 Text 清除 命令按钮 Button3 Text 退出 为【计算】按钮的 Click 事件编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【计算】按钮 Dim x, Sinx, Item As Single Dim i, f As Integer Sinx = 0 x = Val(TextBox1.Text) i = 1 f = 1 Item = x Do While Item >= 0.000001 Sinx += f * Item f = -f i += 2 Item *= x ^ 2 / (i * (i - 1)) Loop TextBox2.Text = Str(Sinx) End Sub 为【清除】按钮的 Click 事件编写代码如下。 Private Sub Button2_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Button2.Click '【清除】按钮 TextBox1.Text = "" TextBox2.Text = "" TextBox1.Focus() End Sub 为【退出】按钮的 Click 事件编写代码如下。 Private Sub Button3_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Button3.Click '【退出】按钮 End End Sub 运行程序,输入 x 值,单击“计算”按钮,结果如图 5-16 所示。 图 5-16 例5-7 用户界面和运行结果 第 5 章 基本流程控制 115 5.4.3 While…End While 语句 格式 While <条件表达式> <语句块> End While 功能 当条件表达式的值为True 时,执行循环体,否则结束循环,执行 End While 之后 的语句。执行流程如图 5-17 所示。 说明 While…End While 循环与 Do While…Loop循环的执行过程相似,其执行过程都是 先判断条件表达式的值,然后根据条件表达式的值决定是否继续执行循环体。两者的差别在 于 While…End While 语句中不能使用 Exit 语句跳出循环。 图 5-17 While…End While 语句执行流程图 5.4.4 循环嵌套 在一个循环的循环体内又包含另外一个循环,称为循环的嵌套。内嵌的循环中还可以嵌 套循环,形成多重循环。 【例 5-8】素数是除 1 和它本身之外,不能被任何数整除的正整数。输入两个正整数 M 和 N(2≤M≤N),求 M~N 的所有素数。 在窗体上放置 3 个标签、3 个文本框和 2 个命令按钮,如图 5-18 所示,并按表 5-10 设置 窗体和各控件的属性值。 表 5-10 例5-8 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 求 M~N 之间的所有素数 Label1 Text M= Label2 Text N= 标签 Label3 Text M~N 之间的所有素数为 TextBox1 Text 空白 输入 M 值 TextBox2 Text 空白 输入 N 值 Text 空白 输入 M 值 文本框 TextBox3 ReadOnly True 只读,不能编辑 Visual Basic .NET 程序设计教程 116 续表 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 MultiLine True 多行显示 文本框 TextBox3 ScrollBars Vertical 带垂直滚动条 Button1 Text 求素数 命令按钮 Button2 Text 清除 为【求素数】按钮的 Click 事件编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As_ System.EventArgs) Handles Button1.Click '【求素数】按钮 Dim m, n As Integer Dim i, j As Integer Dim f As Boolean m = Val(TextBox1.Text) If m < 2 Then MsgBox("请输入大于或等于 2 的整数 M") TextBox1.Text = "" TextBox1.Focus() Exit Sub End If n = Val(TextBox2.Text) If n < m Then MsgBox("请输入大于或等于" & Str(M) & "的整数 N") TextBox2.Text = "" TextBox2.Focus() Exit Sub End If For i = m To n f = True For j = 2 To Math.Sqrt(I) If i Mod j = 0 Then f = False Exit For End If Next If f Then TextBox3.Text = TextBox3.Text & Str(I) End If Next End Sub 【清除】按钮的 Click 事件过程请参照例 5-7。 运行程序,输入 M 和 N 值,单击【求素数】按钮,结果如图 5-18 所示。 第 5 章 基本流程控制 117 图 5-18 例5-8 用户界面和运行结果 练习题 1.输入 x 的值,单击【计算】按钮,能够根据下列分段函数求 y 的值,要求 y 的值保留 两位小数,并将计算结果显示在【计算结果】框中。 2 10 110≤ 0 e0≤10< ln ≥ 10 x xx xxy xx xx ì - ï--ï=í+ï ïî 2.输入一个不多于 4 位的正整数,求:①分别输出每一个数字;②逆序输出各位数字, 例如原数为 1234,应该输出 4321。 3.判断一个年份是闰年还是平年。说明符合下面两个条件之一的年份为闰年。 ①能被 4 整除,但不能被 100 整除的年份。 ②能被 400 整除。 例如,2004 年、2000 年、2400 年均为闰年,但 2100 年不是闰年。 4.判断回文。如果一个字符串正反读字符顺序都相同,称 之 为回文,例如 level,madam。 请编制程序,输入任意一个字符串,判断它是否为回文字符串。 5.输入 x,利用公式 23 e1 2!3! x xxx=++++L求 ex 的近似值,直到最后一项的绝对值小于 10-6 为止。 < < 第 6 章 数组和结构 本章要点: þ 数组声明和数组应用 þ 结构类型的定义和使用 在 VB .NET 中,除了可以使用以前介绍的基本数据类型之外,还允许使用由这些基本数 据类型数据构成的复合数据类型,例如数组和结构等,以适用于某些较复杂的应用。本章主 要介绍数组和结构这两种复合数据类型的概念和应用。 6.1 数组 数组是若干个具有相同数据类型的数据元素的集合,但 Object 类型的数组允许各元素具 有不同的数据类型。引用这些元素时,可以用同一个名字,不同的下标来指明。 表示数组元素的下标个数称为该数组的维数。只有一个下标的数组称为一维数组,有两 个下标的数组称为二维数组,依此类推。 为了描述数组中元素的个数,需要给出数组每一维下标的取值范围。下标的最小取值称 为数组该维的下界,下标的最大取值称为数组该维的上界。VB .NET 中,数组下标下界固定 为 0。 VB .NET 有两种类型的数组,分别是定长数组和动态数组。定长数组在运行时元素个数 保持不变;动态数组在运行时可以使用 ReDim 语句改变数组的元素个数。 6.1.1 定长数组 1.数组声明 格式 1 Public <数组名>(上界 1 [,上界 2]…) [As 数据类型] 格式 2 Private <数组名>(上界 1 [,上界 2]…) [As 数据类型] 格式 3 Dim <数组名>(上界 1 [,上界 2]…) [As 数据类型] 格式 4 Static <数组名>(上界 1 [,上界 2]…) [As 数据类型] 功能 声明数组的数组名、数组元素个数和数组元素的数据类型,并为数组分配存储空 间。 说明 (1)数组名的命名规则遵循标识符的命名规则。 (2)数组下标的上界可以是常量或常量表达式;数组下标下界固定为 0。 (3)省略 As 子句时,默认为 Object 型数组,即数组的各个元素可以具有不同的数据类 第 6 章 数组和结构 119 型。 (4)Public 语句在模块级别中使用,声明全局数组;Private 语句在模块级别中使用,声 明模块级数组;Dim 语句在模块级别使用时声明模块级数组,而在过程级别使用时声明过程 级的局部数组;Static 语句在过程级别使用,声明过程级的局部静态数组。 例如, Dim A(5) As Integer 该语句声明了一个一维整型数组 A,共 6 个元素,分别为 A(0),A(1),A(2),A(3),A(4)和 A(5)。 Dim A1(3, 2) As Single 该语句声明了一个二维单精度数组 A1,共 4×3 个元素,分别是 A1(0,0),A1(0,1),A1(0, 2),A1(1,0),A1(1,1),A1(1,2),A1(2,0),A1(2,1),A1(2,2),A1(3,0),A1(3,1) 和 A1(3,2)。 2.引用数组元素 数组声明后,即可以对数组元素进行操作。例如,为数组元素赋值,数组元素参加表达 式运算,输入或输出数组元素等。所有这些操作均涉及数组元素的引用。数组元素的引用格 式为 数组名(下标 1[,下标 2…]) 引用数组元素时应注意以下几点。 (1)下标可以是数值类型的常量、变量或表达式。如果下标值不是整数,系统自动按四 舍五入取整。例如,A(1.7)=9 相当于 A(2)=9。 (2)下标值必须在声明数组时所指定的下标范围内,否则会出现“下标越界”的错误。 (3)一般情况下,在 程序 中允许简单变量出现的地方,都可以使用数组元素代替。例如, 参加表达式运算、赋值等,但数组元素不能作为过程的形式参数。 【例 6-1】已知数组 A 有 10 个元素,各元素的值是 0~100 的随机整数。要求将数组的 前 n 个元素进行逆置,n 的值由键盘输入,并分别显示逆置前和逆置后的数组。 在窗体上放置 3 个标签、3 个文本框和 2 个命令按钮,如图 6-1 所示,并按表 6-1 设置窗 体和各控件的属性值。 表 6-1 例6-1 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 数组逆置 Label1 Text 逆置前数组 Label2 Text n= 标签 Label3 Text 逆置后数组 TextBox1 Text 空白 逆置前数组 TextBox2 Text 空白 输入 n 值 文本框 TextBox3 Text 空白 逆置后数组 Button1 Text 生成原数组 命令按钮 Button2 Text 逆置 Visual Basic .NET 程序设计教程 120 分别为【生成原数组】按钮和【逆置】按钮的 Click 事件编写代码如下。 Dim A(10) As Integer '声明模块级数组 A Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【生成原数组】按钮 Dim i As Integer Randomize() TextBox1.Text = "" For i = 1 To 10 A(i) = Rnd() * 100 TextBox1.Text = TextBox1.Text & Str(A(i)) & Space(2) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click '【逆置】按钮 Dim n, i, t As Integer n = Val(TextBox2.Text) For i = 1 To n \ 2 t = A(i) A(i) = A(n - i + 1) A(n - i + 1) = t Next TextBox3.Text = "" For i = 1 To 10 TextBox3.Text = TextBox3.Text & Str(A(i)) & Space(2) Next End Sub 运行程序,单击【生成原数组】按钮,然后输入 n 值,单击【逆置】按钮,结果如图 6-1 所示。 图 6-1 例6-1 用户界面和运行结果 【例 6-2】在窗体上显示一个 n 行的杨辉三角形。 在窗体上放置 1 个标签、1 个文本框和 1 个命令按钮,如图 6-2 所示,并按表 6-2 设置窗 体和各控件的属性值。 第 6 章 数组和结构 121 为【显示】按钮的 Click 事件过程编写代码如下。 表 6-2 例6-2 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text 杨辉三角形 标签 Label1 Text n= 文本框 TextBox1 Text 空白 输入 n 值 命令按钮 Button1 Text 显示 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim a(20, 20) As Integer Dim i, j As Integer Dim n As Integer Dim x, y As Integer Dim g As Graphics g = Me.CreateGraphics '在窗体上显示杨辉三角形 g.Clear(Me.BackColor) n = Val(TextBox1.Text) '生成一个 n 行的杨辉三角形 For i = 1 To n a(i, 1) = 1 a(i, i) = 1 For j = 2 To i - 1 a(i, j) = a(i - 1, j - 1) + a(i - 1, j) Next j Next i Dim textSize As SizeF textSize = G.MeasureString("2", Me.Font) '获取输出时单个字符所占高度和宽度 For i = 1 To n y = textSize.Height * (i + 4) x = (15 - 2 * i) * textSize.Width For j = 1 To i x = x + 4 * textSize.Width g.DrawString(Trim(Str(a(i, j))), Me.Font, Brushes.Black, x, y) Next Next End Sub 运行程序,在文本框中输入一个整数 n(例如 6),单击【显示】按钮,则在窗体上显示 一个 n 行的杨辉三角形,如图 6-2 所示。 Visual Basic .NET 程序设计教程 122 图 6-2 例6-2 用户界面和运行结果 6.1.2 动态数组 在设计程序时,数组究竟需要多少个元素,有时很难估计,因此希望在程序运行的过程 中能够改变数组元素的个数。动态数组就是可以在任何时候改变数组大小的数组,也称为可 调数组。动态数组使用灵活、方便,有助于合理地使用内存。 建立动态数组的步骤一般分为两步。 (1)用 Public,Private,Dim 或 Static 声明一个维数为空的数组,例如 Dim A() As Single。 (2)在使用时,用 ReDim 语句定义其真正的大小,例如 ReDim A(20)。 ReDim 语句的一般格式为 ReDim [Preserve] <数组名> (上界 1[,上界 2]…) 功能 重新声明动态数组的维数和元素个数。 说明 (1)ReDim 语句只能在过程级别中使用。 (2)使用 ReDim 语句可以多次定义数组元素的个数,但不能重新定义数组的维数和数 据类型。 (3)如果使用 Preserve 关键字,则只能修改数组最末维的上界,并且可以保留原数组中 的数据;否则,数组被重新初始化,原有数据全部丢失。 【例 6-3】动态数组的使用。 在窗体上放置一个允许多行显示的文本框,Name 属性为 TextBox1,然后在窗体的 Click 事件过程中编写代码如下。 Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Click TextBox1.Text = "" Dim A() As Integer ReDim A(3) A(1) = 8 TextBox1.Text = "A(1)=" & Str(A(1)) & vbCrLf ReDim A(5) TextBox1.Text = TextBox1.Text & "A(1)=" & Str(A(1)) & vbCrLf A(1) = 7 第 6 章 数组和结构 123 ReDim Preserve A(4) TextBox1.Text = TextBox1.Text & "A(1)=" & Str(A(1)) & vbCrLf End Sub 运行程序,单击窗体,结果如图 6-3 所示。注意观察使用 ReDim 语句重新定义数组 A之 后,元素 A(1)的值的变化情况。 图 6-3 例6-3 运行结果 6.2 结构 一般情况下,数组存放的是一组类型相同的数据,但在解决实际问题时,往往需要将不 同类型的数据组织在一起。例如,处理学生档案,每个学生的数据信息至少包括学号、姓名、 出生年月、成绩等。 结构类型就是用于处理上述问题的。它可以把许多相同或者不同的数据类型的数据组织 在一起,形成一个结构,这种结构也称为记录。组成每条记录的数据信息称为结构的成员或 数据项,也可以称为字段或者元素。 在 VB .NET 中,结构是用户自定义的数据类型,因此必须先用 Structure 语句定义数据类 型,然后声明该类型的变量。 6.2.1 结构类型的声明 格式 [Private | Public] Structure <结构类型名> Dim <成员名 1> As <数据类型> Dim <成员名 2> As <数据类型> … Dim <成员名 n> As <数据类型> End Type 功能 定义一个包含一个或多个成员的结构数据类型。 说明 (1)结构类型声明语句必须在模块级别中使用。 (2)结构类型名和成员名的命名规则遵循标识符命名规则。 (3)成员的数据类型既可以是基本数据类型,也可以是用户自定义的结构类型。 例如,下 面 的类型声明语句中定义了一个名为 Point 的结构数据类型,其中包括两个整型 Visual Basic .NET 程序设计教程 124 的成员,成员名分别为 x 和 y。 Public Structure Point Dim x As Integer Dim y As Integer End Structure 6.2.2 结构变量的声明 使用 Structure 语句声明数据类型之后,就可以使用 Dim 等语句声明该类型的变量,声明 方法与简单变量相同。例如, Dim p1 As Point 变量 p1 中包含两个成员,在程序中可以通过变量名访问结构的每个成员,方法为 <变量名>.<成员名> 【例 6-4】结构类型的使用。 在窗体上放置 1 个图片框、1 个组框、4 个标签、4 个文本框和 1 个命令按钮,如图 6-4 所示,并按表 6-3 设置窗体和各控件的属性值。 表 6-3 例6-4 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 窗体 Form1 Text 结构类型与画图 组框 GroupBox1 Text 输入坐标 Label1 Text 椭圆 x= Label2 Text 椭圆 y= Label3 Text 矩形 x= 标签 Label4 Text 矩形 y= txtx1 Text 空白 txty1 Text 空白 txtx2 Text 空白 文本框 txty2 Text 空白 命令按钮 Button1 Text 画图 在模块级声明结构数据类型 Point,并为【画图】按钮的 Click 事件过程编写代码如下。 Public Structure Point Dim x As Integer Dim y As Integer End Structure Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【画图】按钮 Dim LeftTop1 As Point Dim LeftTop2 As Point LeftTop1.x = Val(txtx1.Text) 第 6 章 数组和结构 125 LeftTop1.y = Val(txty1.Text) LeftTop2.x = Val(txtx2.Text) LeftTop2.y = Val(txty2.Text) Dim g As Graphics g = PictureBox1.CreateGraphics '在图片框中画图 g.Clear(PictureBox1.BackColor) '清除原有图形 g.DrawEllipse(Pens.Blue, LeftTop1.x, LeftTop1.y, 100, 50) '画椭圆 g.FillRectangle(Brushes.Red, LeftTop2.x, LeftTop2.y, 100, 50) '画填充矩形 End Sub 运行程序,在文本框中输入椭圆的外界矩形的左上角坐标(x1, y1)和矩形的左上角坐标 (x2,y2),单击【画图】按钮,在图片框中显示图形,如图 6-4 所示。 图 6-4 例6-4 用户界面和运行结果 练习题 1.利用 InputBox 框,输入 20 个学生的成绩,求出平均分,并统计高于平均分的人数。 2.单击窗体,随机生成一个 M×N 的矩阵,矩阵中的所有元素都是 10~50 的两位整数, 并求出矩阵中各行的最大值。用户界面和运行结果参照图 6-5。 3.产生 10 个 50~100(包括 50 和 100)的随机整数,并用“冒泡排序”按从小到大的 顺序输出。 4.设有如下两组数据: A:2,5,8,4,7 B:13,16,14,17,18 Visual Basic .NET 程序设计教程 126 图 6-5 练习 2 用户界面和运行结果 编制程序,分别创建数组 A和 B,然后将两个数组的对应元素相加,结果放入数组 C 中,并 输出。 5.输入 20 个学生的成绩,统计各个分数段的人数。分数段分隔方法为:0~59 分,60~ 69 分,70~79 分,80~89 分,90~99 分,100 分。 第 7 章 过 程 本章要点: þ 通用过程的定义和调用 þ 函数过程的定义和调用 þ 参数传递方式 过程是 VB .NET 程序设计中的一个重要概念。可以说,VB .NET 应用程序是由过程组成 的。本章主要介绍通用过程和函数过程,以及变量的作用范围。 7.1 过程的定义与调用 过程是包含在过程声明语句和 End 语句之间,用来完成某一特定功能的程序段。所有的 VB .NET 代码都是在过程内部编写的。 过程从代码中的其他某处被调用。当过程执行结束时,它将返回调用它的代码处继续执 行程序。 VB .NET 中主要有以下 4 种类型。 (1)Sub 过程。Sub 过程被调用时执行操作,但没有返回值传递给调用者。 (2)事件过程。事件过程是为响应由用户操作或程序中的事件触发的事件而执行的 Sub 过程。 (3)Function 过程。Function 过程被调用时执行操作,并且将返回值传递给调用者。 (4)Property 过程。Property 过程返回和分配对象或模块上的属性值。 7.1.1 Sub 过程 有时,如果几个子过程需要执行相同的程序代码段,就可以将这一段代码放入一个 Sub 过程中,并在其他子过程中调用它。 1.定义 格式 [Private | Public][Static] Sub <过程名> (<形式参数表>) [<语句块 1>] [Exit Sub] [<语句块 2>] End Sub 说明 (1)过程名的命名规则遵循标识符的命名规则。 Visual Basic .NET 程序设计教程 128 (2)形式参数表中的形参个数多于一个时,中间使用逗号分隔。 (3)中间的语句块称为过程体,在过程体中可以使用 Exit Sub 语句强制退出 Sub 过程, 返回到调用处。 (4)使用 Public 关键字定义的 Sub 过程是公用过程,所有模块的所有过程都可以调用该 子过程;使 用 Private 关键字定义的子过程是局部过程,只能在本模块的其他过程中调用该 Sub 过程。默认为 Public。 (5)使用 Static 关键字定义的 Sub 过程是静态子过程,在每次调用静态子过程时,局部 变量都保持上一次调用子过程时的值;如果没有使用Static 关键字,则在调用结束后,子过程 中定义的非 Static 局部变量全部被释放。 2.调用 格式 [Call ] <过程名>[(<实际参数表>)] 功能 程序转去执行指定的 Sub 过程,并将实际参数传递给 Sub 过程定义中的形式参数, 子过程执行结束,返回到调用语句之后继续执行。 说明 (1)调用语句必须提供所有非可选参数的值,并且必须用括号将参数列表括起来。如果 未提供任何参数,则可以选择省略括号。 (2)实际参数可以是常量、变量、数组或表达式,各参数之间使用逗号分隔。 (3)Call关键字可以省略书写。 【例 7-1】编写一个 Sub 过程,完成 3 个整数从小到大的排序。 在窗体上放置 2 个组框、1 个命令按钮,每个组框内各放置 3 个文本框,然后按表 7-1 设 置窗体和各控件的属性值。 表 7-1 例7-1 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text Sub 过程 GroupBox1 Text 原始数据 组框 GroupBox2 Text 排序后数据 txtx1 Text 空白 txty1 Text 空白 txtz1 Text 空白 位于组框 1 中,用于输入 txtx2 Text 空白 txty2 Text 空白 文本框 txtz2 Text 空白 位于组框 2 中,用于输出 命令按钮 Button1 Text 调用 Sub 过程 编写一个 Sub 过程 Order,其功能是实现 3 个整数从小到大的排序,代码如下。 Sub Order(ByRef a As Integer, ByRef b As Integer, ByRef c As Integer) Dim t As Integer If a > b Then t = a : a = b : b = t 第 7 章 过 程 129 End If If a > c Then t = a : a = c : c = t End If If b > c Then t = b : b = c : c = t End If End Sub 为【调用 Sub 过程排序】按钮的 Click 事件过程编写代码,在该事件过程中调用 Order 过程,实现文本框中数据的排序。代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click '【调用 Sub 过程排序】按钮 Dim x, y, z As Integer x = Val(txtx1.Text) y = Val(txty1.Text) z = Val(txtz1.Text) Call Order(x, y, z) txtx2.Text = Str(x) txty2.Text = Str(y) txtz2.Text = Str(z) End Sub 运行程序,在【原始数据】框的 3 个文本框中输入 3 个整数,单击命令按钮,结果如图 7-1 所示。 图 7-1 例7-1 用户界面和运行结果 7.1.2 Function 过程 1.定义 格式 [Public | Private] [Static] Function <函数名>[(<形式参数表>)] [As <数据类型>] [语句块 1] [<函数名> =<表达式>] [Exit Function] Visual Basic .NET 程序设计教程 130 [语句块 2] [<函数名> =<表达式>] End Function 说明 (1)函数名的命名规则遵循标识符的命名规则。 (2)形式参数表中的形参个数多于一个时,中间使用逗号分隔。 (3)As 子句指定了函数返回值的类型,可以是数值型、字符串型、日期型和变体型。 (4)中间的语句块称为函数体,在函数体中可以使用 Exit Function 语句强制退出函数过 程,返回调用处。 (5)为了从函数返回一个值,可以在函数体的任何位置使用赋值语句: <函数名> = <表达式> 但如果在函数体中未对函数名赋值,则函数返回一个默认值:数值函数返回 0,字符串函数 返回一个零长度字符串 (""), Variant 函数返回 Empty。 (6)关键字 Public、Private 和 Static 的作用与 Sub 语句中相同。 2.调用 调用函数过程的方法与调用 VB .NET 标准函数的方法相同,即给出函数名和实参,作为 表达式的一部分。 【例 7-2】字符串查找。编写一个 Function 过程,功能是查找一个字符串在另外一个字 符串中出现的次数。 参照图 7-2 设计项目的用户界面,并按表 7-2 设置窗体和各控件的属性值。 表 7-2 例7-2 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 说 明 窗体 Form1 Text Function 过程 Label1 Text 源字符串 Label2 Text 子串 标签 Label3 Text 出现次数 TextBox1 Text 空白 输入源字符串 TextBox2 Text 空白 输入子串 文本框 TextBox3 Text 空白 输出出现次数 命令按钮 Button1 Text 查找 编写一个 Function 过程 Find,其功能是在字符串 s1 中查找字符串 s2 出现的次数,代码 如下。 Private Function Find(ByVal s1 As String, ByVal s2 As String) As Integer Dim n As Integer, i As Integer n = 0 i = InStr(s1, s2) While i <> 0 n = n + 1 第 7 章 过 程 131 i = InStr(i + Len(s2), s1, s2) End While Find = n End Function 为【查找】按钮的 Click 事件过程编写代码,在该事件过程中调用 Find 函数,完成字符 串查找。代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click TextBox3.Text = Str(Find(TextBox1.Text, TextBox2.Text)) End Sub 运行程序,分别输入源字符串和子串,单击【查找】按钮,运行结果如图 7-2 所示。 图 7-2 例7-2 用户界面和运行结果 7.2 过程参数 在大多数情况下,调用过程时,调用者需要向被调用者传递一些数据,使得过程更具有 通用性。 在调用过程时,需要传递给被调过程的数据称为实际参数,简称实参。实参可以是各种 类型的常量、变量、表达式、数组名,在调用语句中放在过程名之后构成实参表,有多个实 参时,各实参之间使用逗号分隔。 在过程中,接收调用者传递来的数据的变量称为形式参数,简称形参。在定义过程时, 如果有形参,需要在过程名之后的括号中,以 As 子句的形式给出形参的类型声明。形参声明 的一般格式为 [Optional] [ByVal | ByRef] [ParamArray] <形参名> As <数据类型> 7.2.1 参数传递方式 多数情况下,过程调用者提供的实参个数与过程的形参个数是一致的。当产生调用时, 实参向对应的形参传递数据。VB .NET 中,实参和形参间可以使用两种方式传递数据,分别 是值传递和引用传递。 Visual Basic .NET 程序设计教程 132 1.值传递 形参声明时,在形参名前面加关键字 ByVal,则指定该参数是通过值传递的。例如, Private Sub Sub1(ByVal x As Integer) … End Sub 形参 x 是通过值传递的参数。 通过值传递参数时,系统将实参的值传递给对应的形参,如果在过程中改变了该值,则 所做变动只影响形参本身而不会影响实参。 2.引用传递 声明形参时,如果在形参名前面加关键字 ByRef,则该参数是通过引用传递的。例如, Private Sub Sub1(ByRef A As Integer, ByRef B As Integer) … End Sub 形参 A和形参 B之前均有关键字 ByRef,两个参数都是通过引用传递的。 通过引用传递参数时,要求实参必须是变量名,此时实参和形参变量共用同一个存储单 元,如果在过程中改变了形参的值,则对应实参也将发生改变。 如果实参是常量或表达式,则通过值传递参数。 【例 7-3】通过值传递和通过引用传递参数。 参照图 7-3 设计项目的用户界面,并按表 7-3 设置窗体和各控件的属性值。 表 7-3 例7-3 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 窗体 Form1 Text 参数传递 组框 GroupBox1 Text 原始数据 Label1 Text A= 标签 Label2 Text B= txtA1 Text 空白 文本框 txtB1 Text 空白 组框 GroupBox2 Text 交换后的数据 Label3 Text A= 标签 Label4 Text B= txtA2 Text 空白 文本框 txtB2 Text 空白 命令按钮 Button1 Text 调用子过程 编写一个 Sub 过程 SwapAB,使用形参与实参之间采用值传递方式,代码如下。 Private Sub SwapAB(ByVal x As Integer, ByVal y As Integer) 'x:传值 y:传值 Dim temp As Integer 第 7 章 过 程 133 temp = x x = y y = temp End Sub 为【调用子过程】按钮的 Click 事件过程编写代码,在该事件过程中调用 SwapAB 子过 程。代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim A As Integer Dim B As Integer A = Val(txtA1.Text) B = Val(txtB1.Text) SwapAB(A, B) txtA2.Text = A txtB2.Text = B End Sub 运行该程序,在“原始数据”框中输入 A,B 的值,单击命令按钮,可以得到如图 7-3 所示运行结果。 图 7-3 例7-3 用户界面和运行结果 观察运行结果可以发现,实参与形参之间按值传递数据,所以形参的改变不影响实参。 按如下方法可以修改 SwapAB子过程中参数的传递方式。 Private Sub SwapAB(ByRef x As Integer, ByRef y As Integer) 'x:传地址 y:传地址 Dim temp As Integer temp = x x = y y = temp End Sub 再次运行程序,在【原始数据】框中输入 A,B 的值,单击命令按钮,可以得到如图 7-4 Visual Basic .NET 程序设计教程 134 所示的运行结果。 图 7-4 实参和形参之间按地址传递 7.2.2 可选参数和参数数组 1.使用可选参数 如果在形参名前面使用关键字 Optional,则该参数是可选的。即在调用过程时,对应的 实参可以不给。例如, Private Sub Sub2(ByVal x As Integer, y As Integer, Optional z As Integer) … End Sub 形参 z 之前有关键字 Optional,所以该参数是可选的。 说明 (1)在形参列表中,可选参数必须放在最后。 (2)在形参表中可以为可选参数赋一个默认值,方法如下。 Optionl <形参名> As <数据类型> =<常量> 当调用该过程时,如果为可选参数提供了实参,则将实参的值或地址传递给形参,默认 值不起作用;如果没有为可选参数提供对应的实参,则默认值就是可选参数的初始值。 【例 7-4】可选参数。 在窗体上放置一个命令按钮 Button1,Text 属性值为“调用子过程”。 编写代码如下。 Private Sub Sub2(ByVal x As Integer, ByRef y As Integer, Optional ByVal _ z As Integer = 500) 'x:按值传递 y:按地址传递 z:可选参数,默认值是 500 x = x + 1 y = y + 2 z = z + 3 TextBox1.Text += " x=" & x & " y=" & y & " z=" & z & vbCrLf 第 7 章 过 程 135 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim A As Integer, B As Integer, C As Integer A = 100 : B = 200 : C = 300 Call Sub2(A, B, C) '为可选参数提供实参 TextBox1.Text += " A=" & A & " B=" & B & " C=" & C & vbCrLf A = 100 : B = 200 : C = 300 Call Sub2(A, B) '没有为可选参数提供实参 TextBox1.Text += " A=" & A & " B=" & B & " C=" & C End Sub 运行该程序,单击命令按钮,可以显示如图 7-5 所示运行结果。 图 7-5 例7-4 运行结果 2.参数数组 一般情况下,被调过程可以接收的实参个数都是固定的。但是,有时调用同一个过程可 能会使用不同个数的参数,这种情况下,可以在形参名前使用关键字 ParamArray,过程就可 以接收不定个数的参数。例如, Private Sub Sub3(ParamArray p()) … End Sub 形参 p 可以接收不定个数的参数。 【例 7-5】使用不定个数的参数,求任意多个数的最大值。 在窗体上放置一个命令按钮 Button1,Text 属性值为“调用子过程”。 编写代码如下。 Private Sub Sub3(ByVal ParamArray p()) Dim Max As Single Dim dataP Max = p(0) For Each dataP In p If Max < dataP Then Max = dataP Next dataP Visual Basic .NET 程序设计教程 136 TextBox1.Text += Max & vbCrLf End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Call Sub3(12, 5, 56, 7) Call Sub3(3, 6, 2, 7, 13, 4, 9) End Sub 运行该程序,单击命令按钮,可以显示如图 7-6 所示运行结果。 图 7-6 例7-5 运行结果 练习题 1.建立如图 7-7 所示的用户界面,并按如下要求设计程序。 (1)编写一个函数Sort,该函数能够对参数数组进行从小到大的排序。 (2)编写一个函数 Search,该函数的功能是采用二分查找算法查找数组中是否存在值为 key 的元素。如果存在,返回该元素的下标,否则返回-1。 (3)单击【产生数组并排序】按钮,能够随机产生 10 个两位的正整数,并调用 Sort 函 数对这 10 个数据按从小到大的顺序排序,将排序结果显示在【原始数组】框中。 (4)输入要查找的数,单击【查找】按钮,能够调用 Search 函数,并将查找结果显示 在【结论】框中。 图 7-7 练习 1 用户界面和运行结果 第 7 章 过 程 137 2.编写一个过程,能够把十进制数转换为 r(2≤r≤9)进制数。然后参照图 7-8 设计用 户界面。 图 7-8 练习 2 用户界面 运行程序时,输入十进制数,选择要转换的进制数。单击【转换】按钮时,调用该过程, 显示转换结果。 第 8 章 图 形 设 计 本章要点: þ 如何在应用程序中建立画笔、画线图函数及使用方法 þ 填充函数及其使用方法 þ 交互绘图技术等 本章介绍 Visual Basic .NET 图形程序设计所必备的基础知识,包括画笔建立、常用绘图 函数及其在应用程序中的使用方法等。 8.1 图形环境设置 8.1.1 图形装置接口 1.GDI+ 在.NET 框架中,使用名为 GDI+(Graphics Device Interface Plus)的 Windows 图形设备 界面(GDI)在 Windows 窗体和控件上显示图形图像。使用 GDI+,可以绘制图形、文本,也 可以将图形、图像作为对象进行处理。GDI+是进行二维向量图形、图像及文字等方面处理的 Win32API,是目前在 Windows 窗体应用程序中以编程方式显示图形的惟一方法。所有 GDI+ 的功能都包含在 System.Darwing,System.Darwing.Image,System.Darwing. Darwing2D, System.Darwing.Text 等名称空间的各个类中。Visual Basic .NET 通过这些名称空间提供的功能 进行图形设计和图形处理。 2.创建图形对象 一般而言,图形设计过程分为两步,一是用 GDI+创建 Graphics 对象,即建立一块画布; 二是使用 Graphics 对象提供的方法绘制图形、文本或处理图像。创建 Graphics 对象通常使用 的方法如下。 (1)接受对图形对象的引用。该对象是窗体或控件的 Paint 事件中 PaintEventArgs 的一 部分。在为窗体或控件设计图形程序时,通常使用此方法建立对图形对象的引用。例如, Private Sub Form1_Paint(sender As Object, pe As PaintEventArgs) Handles _ MyBase.Paint Dim g As Graphics = Me.Graphics 'Insert code to paint the form here End Sub (2)在已存在的窗体或控件上绘图时,调用某控件或窗体的 CreateGraphics 方法可以获 第 8 章 图 形 设 计 139 取对Graphics 对象的引用,该对象表示这个控件或窗体的绘图表面。例如,建立一个窗体对 象的程序如下。 Dim g as Graphics 'Sets g to a Graphics object representing the drawing surface of the 'control or form g is a member of g = Me.CreateGraphics 本书中的程序示例均使用第二种方法建立图形对象。建立图形对象后,可以用于绘制图 形、显示文本或处理图像。在图形图像处理程序设计中,与 Graphics 对象一起使用的用户对 象还有用于绘制线条的 Pen 类、用于填充图形区域的 Brush 类、用于显示文本的 Font 类和设 定显示的不同颜色的 Color 结构。 3.名称空间 .NET 框架类库由名称空间组成。每个名称空间都包含可以在程序中使用的类、结构、枚 举、委托和接口。例如,System.WinForms 名称空间包含用于创建窗口程序设计所需要的组件, 像 Form,Button 等;System.Drawing 名称空间提供了对 GDI+ 基本图形功能的访问,其子名 称空间 System Drawing.Drawing2D,System Drawing.Imaging,以及 System Drawing. Text 中 提供了更高级的图形、图像及文字处理功能。 表8-1 给出了图形图像处理中常调用到的名称空间。 表 8-1 常调用到的名称空间 名 称 空 间 功 能 System 包括常用的基础数据类型和 24 个子名称空间 System.Collections 提供实用的数据结构(例如列表、队列、位数组、哈希表、词典)和类 System.ComponentModel 提供用于实现组件和控件运行时和设计时行为的类 System.Data 提供许多与数据处理相关的结构的类。ADO .NET 结构可以用于进行数据库的操作 System.Drawing 提供对 GDI+基本图形功能的访问 System.Drawing.Drawing2 D 提供高级的二维和向量图形功能。此命名空间包括渐变画笔、Matrix类和GraphicsPath类 System.Drawing.Imaging 提供高级 GDI+图像处理功能 System.Drawing.Printing 提供与打印相关的服务 System.Drawing.Text 提供高级 GDI+版式功能 System.IO 提供基本的输入/输出操作 System.Text 提供表示 ASCII,Unicode,UTF-7 和 UTF-8 字符编码的类 System.Timers 提供精确的计时操作 System.WinForms 提供窗口程序设计所需的组件 System.Net 提供网络应用程序设计所需要的基础类 名称空间组织在程序集中定义的对象。在 VB .NET 应用程序中引用给定名称空间的示例 如下。 Inherits System.Windows.Forms.Form '名称空间声明 Dim color1 As System.Drawing.Color '创建名为 color1 的颜色结构对象 Dim tuxing As System.Drawing.Bitmap ' 创 建名为 tuxing 的 Bitmap 对象 Visual Basic .NET 程序设计教程 140 Dim g1 As System.Drawing.Graphics ' 创 建一个名为 g1 的 Graphics 对象 8.1.2 画笔 使用画笔在 Graphics 对象上绘图。在程序设计中,在创建 Graphics 对象后,尚需创建画 笔对象。画笔对象通常具有宽度、样式和颜色 3 种属性。画笔的宽度用于确定所画的线条宽 度,默认的画笔宽度为一个像素单位;画笔的样式确定了所绘图形的线型,通常有实线、虚 线、点线、点划线、双点划线等样式;画笔的颜色确定了所绘制的线条颜色。通过设置画笔 的颜色属性改变图形中线条的颜色。 1.创建画笔对象 创建一个画笔对象 Pen1 的颜色使用语句 Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Black) 此时默认画线宽度为一个像素。 如果同时设置画笔的宽度和颜色,可以使用语句 Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Black, width_ As integer) 例如, Dim pen1 As New System.Drawing.Pen(Color.Red, 3) 2.定义画笔的画线样式 定义笔的画线样式用的是笔的 DashStyle 的属性,可以赋予各种不同的样式。样式如图 8-1 所示。属性值意义如表 8-2 所示。 表 8-2 画笔的样式 样 式 名 称 线 段 样 式 Dash 虚线 DashDot 点划线 DashDotDot 双点划线 Dot 点线 Solid 实线 Custom 用户自定义 程序中的设定格式为 画笔对象名.DashStyle = Drawing.Drawing2D.DashStyle.属性值 【例 8-1】设定画笔的画线样式为 Dash。 窗体设计如图 8-2 所示。 编写代码如下。 Dim pen1 As System.Drawing.Pen Dim g As System.Drawing.Graphics 图 8-1 画笔的画线样式 第 8 章 图 形 设 计 141 图8-2 Dash 画线样式 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click PictureBox1.Refresh() g = PictureBox1.CreateGraphics pen1 = New System.drawing.Pen(Color.Red, 2) pen1.DashStyle = Drawing.Drawing2D.DashStyle.Dash g.DrawEllipse(pen1, 0, 0, 200, 150) g.DrawLine(pen1, 10, 10, 200, 200) End Sub 程序运行结果如图 8-3 所示。 图 8-3 Dash 画线样式 Visual Basic .NET 程序设计教程 142 3.重新设置画笔的颜色 在绘图中,不同的线段往往要求使用不同的颜色画出,这时就需要重新设定画笔的颜色。 设置画笔颜色的程序示例如下。 pen1.Color = color1.Red '设置画笔为红色 gobject1.DrawLine(pen1, x1, y1, x2, y2) '用红色画笔画线 pen1.Color = color1.BlueViolet ' 重新设定画笔的颜色为 BlueViolet gobject1.DrawLine(pen1, x2, y2, x3, y3) '用 BlueViolet 色画笔画线 pen1.Color = color1.Red '重新设定画笔的颜色为红色 gobject1.DrawLine(pen1, x3, y3, x4, y4) '用红色画笔画线 pen1.Color = color1.GreenYellow gobject1.DrawLine(pen1, x4, y4, x5, y5) 4.设置线段两端的外观 设置线段两端的外观使用 SetLineCap 方法。格式为 Pen 对象名.SetLineCap(StartCap, EndCap, DashCap) 参数说明如下。 StartCap,EndCap 用于设置线段起、止两端的外观,其可选项意义见表 8-3。 表 8-3 线段起点和终点样式 样 式 名 称 样 式 符 号 ArrowAnchor 箭头符号 DiamondAnchor 菱形符号 Flat 无符号 NoAnchor 无符号 RoundAnchor 圆形符号 SquareAnchor 尚无符号 Square 尚无符号 Round 弧形符号 Triangle 三角形符号 DashCap 用于设置虚线段两端的外观,其可选项意义如下。 u Flat——指定每一划线段的两端均为方形帽。 u Round——指定每一划线段的两端均为圆角帽。 u Triangle——指定每一划线段的两端均为带尖的三角帽。 【例 8-2】设定画笔的设置线段两端的外观。 编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click PictureBox1.Refresh() g = PictureBox1.CreateGraphics pen1 = New System.Drawing.Pen(Color.Red, 1) 第 8 章 图 形 设 计 143 pen1.DashStyle = Drawing.Drawing2D.DashStyle.DashDotdot pen1.SetLineCap(Drawing.Drawing2D.LineCap.ArrowAnchor, _ Drawing.Drawing2D.LineCap.ArrowAnchor, _ Drawing.Drawing2D.DashCap.Round) g.DrawLine(pen1, 10, 10, 200, 200) End Sub 说明 本例中使用语句 pen1.SetLineCap(Drawing.Drawing2D.LineCap.ArrowAnchor, _ Drawing.Drawing2D.LineCap.ArrowAnchor, Drawing.Drawing2D.DashCap.Round) 设置线段两端的外观。 8.1.3 画刷 画刷用于指定填充的特性。许多窗口、控件及其他区域都需要用画刷进行填充绘制,它 比画笔的内容更加丰富。在程序设计中,画填充图形时需要事先创建画刷对象。 例如,创建一个单色画刷对象 brush1 的格式为 brush1 = New SolidBrush(Color.DarkTurquoise) 颜色使用的是系统 Color 类的颜色,例如 Color.Blue,Color.Red 等。 VB .NET 中提供了 5 种刷子的模式,如表 8-4 所示。 表 8-4 VB .NET 提供的刷子样式 Brush 模式 说 明 SolidBrush 单色画刷 HatchBrush 阴影画刷 TextureBrush 纹理(图像)画刷 LinearGradientBrush 颜色渐变画刷 PathGradientBrush 使用路径及复杂的混合色渐变画刷 1.SolidBrush 画刷 SolidBrush(单色画刷)类是所有 Brush 之中最基础的一种,主要用途是将某一特定区域 填入单一的颜色。其建立方法只有一种,即 Brush 对象名 = New SolidBrush(Color.Color) 例如, Dim brush1 As System.Drawing.Brush brush1 = New SolidBrush(Color.Red) 建立一个 SolidBrush 画刷 brush1。名称空间为System.Drawing。 2.HatchBrush 画刷 HatchBrush 类画刷有两种颜色,即前景色和背景色,有 6 种阴影。前景色定义填充线条 的颜色,背景色定义各线条之间间隙的颜色。名称空间为System.Drawing.Drawing2D。 Visual Basic .NET 程序设计教程 144 例如,创建一个 HatchBrush 画刷对象 brush1 语句为 brush1 = New System.Drawing.Drawing2D.HatchBrush( _ Drawing.Drawing2D.HatchStyle.Cross(填充的模式), _ 'Color.Blue(前景色), Color.Green(背景色)) HatchBrush 画刷的样式如图 8-4 所示。 图 8-4 画刷的样式 【例 8-3】使用 HatchBrush 画刷填充图形。 使用画刷填充图形的窗体设计如图 8-5 所示。 图 8-5 使用画刷填充图形的窗体设计 编写代码如下。 Dim brush1 As System.Drawing.Brush Dim g As System.Drawing.Graphics Dim color1, color2 As System.Drawing.Color Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Brush1 = New System.Drawing.Drawing2D.HatchBrush(_ Drawing.Drawing2D.HatchStyle.Cross, Color.Blue, Color.Green) 第 8 章 图 形 设 计 145 PictureBox1.Refresh() g = PictureBox1.CreateGraphics g.FillEllipse(brush1, 0, 0, 200, 150) End Sub 程序运行结果如图 8-6 所示。 图 8-6 HatchBrush画刷 3.GradientBrush 画刷 GradientBrush(渐层画刷)用于在某一个特定的区域内产生渐层效果。一般而言,常见 的渐层效果由两种颜色逐渐变化而来。 在 System.Drawing.Drawing2D 命名空间中包含两个 GradientBrush,即 LinearGradient Brush 和 PathGradientBrush 。其中,LinearGradientBrush 可以显示线性渐层效果; PathGradientBrush 是路径渐变的,可以显示比较具有弹性的渐层效果。 【例 8-4】使用 LinearGradientBrush 画刷填充图形。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click Dim brush1 As System.Drawing.Drawing2D.LinearGradientBrush Dim g As System.Drawing.Graphics Dim p1, p2 As System.Drawing.Point p1.X = 100 : p1.Y = 100 p2.X = 20 : p2.Y = 50 brush1 = New System.Drawing.Drawing2D.LinearGradientBrush(p1, p2, _ Color.Bisque, Color.DarkSalmon) PictureBox1.Refresh() g = PictureBox1.CreateGraphics g.FillEllipse(brush1, 0, 0, 200, 150) End Sub 程序运行结果如图 8-7 所示。 Visual Basic .NET 程序设计教程 146 图 8-7 LinearGradientBrush 画刷 4.TextureBrush 画刷 TextureBrush 类的每一个属性都是 Brush 对象,该对象使用图像填充形状的内部。这里 不再详述。 【例 8-5】使用TextureBrush 画刷填充图形。 在窗体 Form1 上添加一个 Button 控件,在代码设计窗口编写代码如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim brush1 As New TextureBrush(New Bitmap("C:\sh1.bmp")) Dim g As System.Drawing.Graphics Me.Refresh() g = Me.CreateGraphics g.FillEllipse(brush1, 0, 0, 200, 150) End Sub 程序运行结果如图 8-8 所示。 图 8-8 TextureBrush 画刷 第 8 章 图 形 设 计 147 8.2 Graphics 对象的图形方法 任何图形都是由点和线组成的。Visual Basic .NET 的 Graphics 类提供了 10 余种画线图的 方法,在编写程序代码时,系统将自动弹出信息对话框提示方法和方法的格式。例如,在例 8-1 的代码窗口中,当鼠标移到程序代码中的 DrawLine()时,系统将自动显示出该方法的原形 格式,如图 8-9 所示。 图 8-9 系统自动显示出的原形格式 当编写方法代码时,系统将自动弹出 Graphics 类绘图函数名的列表框,移动鼠标选择所 需的函数双击之,该函数名则自动书写到该代码位置。 Visual Basic .NET 提供了大量的绘图方法,常用方法及其用法介绍如下。 8.2.1 Point 结构 画点是最基本的绘图操作之一。但 Visual Basic .NET 不再使用 VB 6.0 的 Pset 方法,而是 采用 Point 和 SetPixel方法完成画点的功能。其中,Point 方法在图形绘制中使用,SetPixel 方 法在图像绘制中使用。 在程序中,可以使用 Dim p1 As System.Drawing.Point 定义一个 Point 结构变量 p1。p1 是结构类型,有 x,y 的属性,分别代表点的横、纵坐标。例 如,p1.x=30:p1.y=100。 8.2.2 DrawLine 方法 通常使用的画线方法有以下两种形式。 (1)DrawLine(pen, x1, y1, x2, y2) Visual Basic .NET 程序设计教程 148 参数说明 u pen——画笔。 u x1,y1——画线起点坐标。 u x2,y2——画线终点坐标。 (2)DrawLine(pen, p1, p2) 参数说明 u pen——画笔。 u p1——画线起点坐标。 u p2——画线终点坐标。 【例 8-6】使用 DrawLine 方法画直线。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim g As System.Drawing.Graphics Dim pen1 As New Pen(Color.Red, 2) Dim pen2 As New Pen(Color.Green) Dim p1 As New Point(50, 50) Dim p2 As New Point(200, 200) PictureBox1.Refresh() g = PictureBox1.CreateGraphics Pen1.DashStyle = Drawing.Drawing2D.DashStyle.Dash g.DrawLine(Pen1, p1, p2) g.DrawLine(Pen2, 20, 20, 200, 40) End Sub 程序运行结果如图 8-10 所示。 图 8-10 使用 DrawLine 画直线示例 第 8 章 图 形 设 计 149 8.2.3 画椭圆和圆弧的方法 画椭圆、圆弧的方法有 Ellipse,Arc 和 Pie 方法。 1.Ellipse 方法 Ellipse 方法的功能是画椭圆,格式为 Public Sub DrawEllipse(pen As System.Drawing.Pen, x As Integer, y As_ Integer, width As Integer, height As Integer) 参数说明 u pen——画笔。 u x——限制椭圆矩形左上角 x 坐标。 u y——限制椭圆矩形左上角 y 坐标。 u width——限制椭圆矩形的宽。 u height——限制椭圆矩形的高。 2.Arc 方法 Arc 方法用于画椭圆弧,格式为 Public Sub DrawArc(pen as System.Drawing.Pen, x As Integer, y As _ Integer, width As Integer, height As Integer, startAngle As _ Integer, sweepAngle As Integer) 参数说明 u pen——画笔。 u x——限制椭圆矩形左上角 x 坐标。 u y——限制椭圆矩形左上角 y 坐标。 u width——限制椭圆弧矩形的宽。 u height——限制椭圆弧矩形的高。 u startAngle——弧的起始点。 u sweepAngle——弧经过的点。 3.Pie 方法 Pie 方法用于画椭圆弧,并且弧的两个端点与圆心连线,格式为 Public Sub DrawPie(pen As System.Drawing.Pen, x As Integer, y As _ Integer, width As Integer, height As Integer, startAngle As _ Integer, sweepAngle As Integer) 参数说明 u pen——画笔。 u x——限制椭圆矩形左上角 x 坐标。 u y——限制椭圆矩形左上角 y 坐标。 u width——限制椭圆矩形的宽。 u height——限制椭圆矩形的高。 u startAngle——弧的起始点。 Visual Basic .NET 程序设计教程 150 u sweepAngle——弧经过的点。 【例 8-7】画椭圆。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Dim g As System.Drawing.Graphics Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Black) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click g = PictureBox1.CreateGraphics g.DrawEllipse(pen1, 10, 10, 100, 50) g.DrawArc(pen1, 10, 100, 160, 100, 160, 200) g.DrawPie(pen1, 140, 10, 160, 100, 160, 200) End Sub 运行结果如图 8-11 所示。 图 8-11 画椭圆和圆弧示例 8.2.4 Rectangle 方法 Rectangle 方法使用当前画笔画矩形,格式为 Public Sub DrawRectangle(pen As System.Drawing.Pen, x As Single, y As _ Single, width As Single, height As Single) 参数说明 u x——矩形左上角 x 坐标。 u y——矩形左上角 y 坐标。 u width——矩形宽。 u height——矩形高。 【例 8-8】Rectangle 函数用法。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 第 8 章 图 形 设 计 151 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click Dim x As Single = 20 Dim y As Single = 30 Dim a As Short = 200 Dim b As Short = 150 g = PictureBox1.CreateGraphics g.DrawRectangle(pen1, x, y, a, b) End Sub 运行结果如图 8-12 所示。 图 8-12 Rectangle 方法示例 8.2.5 DrawBezier 方法 使用 DrawBezier 方法画一条 Bezier 曲线。原形格式为 Public Sub DrawBezier(pen As System.Drawing.Pen, x1 As Single, y1 As _ Single, x2 As Single, y2 As Single, x3 As Single, y3 As Single, _ x4 As Single, y4 As Single) 参数说明 u pen——画笔。 u x1,y1——起点。 u x2,y2——控制点。 u x3,y3——控制点。 u x4,y4——终点。 3 次 Bezier 曲线需要 2 个控制点和 1 个终点,起始尚需 1 个起点,即 4 个点决定一条 Bezier 曲线。 例如, Visual Basic .NET 程序设计教程 152 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button10.Click g = PictureBox1.CreateGraphics g.DrawBezier(pen1, 10, 20, 140, 140, 80, 40, 200, 270) End Sub 程序运行结果为绘制一条 Bezier 曲线。 8.2.6 DrawPolygon 方法 该方法画多边形。原形格式为 Overloads Public Sub DrawPolygon(ByVal pen As Pen, ByVal points () As Point) 参数说明 u pen——画笔。 u points()——点数组。 注意,数组中的每对相邻的两个点指定多边形的一条边。另外,如果数组的最后一个点 与第一个点不重合,则这两个点指定多边形的最后一条边。 例如, Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim g As System.Drawing.Graphics Dim pen1 As New Pen(Color.Red) Dim point1 As New Point(50, 50) Dim point2 As New Point(100, 25) Dim point3 As New Point(120, 15) Dim point4 As New Point(160, 50) Dim point5 As New Point(200, 100) Dim point6 As New Point(150, 150) Dim point7 As New Point(20, 100) Dim Points As Point() = {point1, point2, point3, point4, point5, _ point6, point7} PictureBox1.Refresh() g = PictureBox1.CreateGraphics g.DrawPolygon(Pen1, Points) End Sub 程序运行结果为绘制一个闭合多边形。 8.2.7 DrawCurve 方法和 DrawClosedCurve 方法 1.DrawCurve 方法 DrawCurve 方法绘制经过一组由指定的 Point 结构的基数样条曲线,格式为 Overloads Public Sub DrawCurve(ByVal pen As Pen, ByVal points() As _ Point) 第 8 章 图 形 设 计 153 参数说明 u pen——Pen对象。 u points——Point结构的数组。 【例 8-9】使用 DrawCurve 方法示例。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim g As System.Drawing.Graphics Dim pen1 As New Pen(Color.Red) Dim point1 As New Point(50, 50) Dim point2 As New Point(100, 25) Dim point3 As New Point(120, 15) Dim point4 As New Point(160, 50) Dim point5 As New Point(200, 100) Dim point6 As New Point(150, 150) Dim point7 As New Point(20, 100) Dim Points As Point() = {point1, point2, point3, point4, point5, _ point6, point7} PictureBox1.Refresh() g = PictureBox1.CreateGraphics g.DrawCurve(Pen1, Points) End Sub 运行结果如图 8-13 所示。 图 8-13 使用 DrawCurve 方法画曲线 2.DrawClosedCurve 方法 DrawClosedCurve 方法绘制经过一组由指定的 Point 结构的闭合基数样条曲线,格式为 Overloads Public Sub DrawClosedCurve(ByVal pen As Pen, ByVal points() _ As Point) Visual Basic .NET 程序设计教程 154 参数说明 u pen——Pen 对象。 u points——Point 结构的数组。 注意,此方法绘制经过数组中每个点的闭合基数样条。如果最后一个点不匹配第一个点, 则在最后一个点和第一个点之间添加一条附加曲线段以使该图闭合。点数组必须包含至少 4 个 Point 结构。 如果将例 8-9 中的最后一条语句 DrawCurve()更换为 DrawClosedCurve,请观察运行结果。 8.3 填充图形 VB .NET 的 Graphics 提供了一些画填充图形的方法,例如 FillEllipse,FillRectangle, FillPie 方法等。 8.3.1 画填充椭圆和填充饼图 1.FillEllipse 方法 FillEllipse 画一个填充椭圆,格式为 Public Sub FillEllipse(brush As System.Drawing.Brush, x As Integer, _ y As Integer, width As Integer, height As Integer) 参数说明 u brush——画刷。 u x——限制椭圆矩形左上角 x 坐标。 u y——限制椭圆矩形左上角 y 坐标。 u width——限制椭圆矩形的宽。 u height——限制椭圆矩形的高。 2.FillPie 方法 FillPie 方法使用当前画刷画一填充饼图,格式为 Public Sub FillPie(brush as System.Drawing.Brush, x As Integer, y As _ Integer, width As Integer, height As Integer, startAngle As _ Integer, sweepangle As Integer) 参数说明 u brush——画笔。 u x——限制椭圆矩形左上角 x 坐标。 u y——限制椭圆矩形左上角 y 坐标。 u width——限制椭圆矩形的宽。 u height——限制椭圆矩形的高。 u startAngle——弧的起始点。 u sweepAngle——弧所经过的点。 【例 8-10】填充椭圆和填充饼图。 第 8 章 图 形 设 计 155 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Dim g As System.Drawing.Graphics Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Black) Dim brush1 As System.Drawing.Brush Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click brush1 = New SolidBrush(Color.DarkTurquoise) g = PictureBox1.CreateGraphics g.FillEllipse(brush1, 0, 0, 100, 50) g.FillPie(brush1, 60, 60, 160, 100, 160, 200) End Sub 程序运行结果如图 8-14 所示。 图 8-14 FillPie 方法 8.3.2 FillRectangle 方法 FillRectangle 方法使用当前画刷画一填充矩形,格式为 Public Sub FillRectangle(brush As System.Drawing.Brush, x As Integer, _ y As Integer, width As Integer, height As Integer) 参数说明 u brush——画刷。 u x——矩形左上角 x 坐标。 u y——矩形左上角 y 坐标。 u width——矩形宽。 u height——矩形高。 使用 FillRectangle 画矩形的示例如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ Visual Basic .NET 程序设计教程 156 System.EventArgs) Handles Button13.Click Dim x As Single = 20 Dim y As Single = 30 Dim a As Short = 100 Dim b As Short = 150 brush1 = New SolidBrush(Color.Red) g = PictureBox1.CreateGraphics g.FillRectangle(brush1, x, y, a, b) End Sub 8.3.3 FillClosedCurve 和 FillPolygon 方法 1.FillClosedCurve 方法 FillClosedCurve 方法用当前画刷填充一个由 Point 结构数组定义的闭合曲线的内部,格 式为 Public Overloads Sub FillClosedCurve(brush As System.Drawing.Brush, _ points() As System.Drawing.Point) 参数说明 u brush——填充特性的Brush对象。 u points()——Point 结构的数组。 【例 8-11】使用 FillClosedCurve 方法填充一个图形的闭合区域。 在窗体 Form1 上添加一个 PictureBox 控件和一个 Button 控件,在代码设计窗口编写代码 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim g As System.Drawing.Graphics '建立画刷 Dim brush1 As New System.Drawing.Drawing2D.HatchBrush( _ Drawing.Drawing2D.HatchStyle.Cross, Color.Red, Color.Green) Dim point1 As New Point(100, 100) Dim point2 As New Point(200, 50) Dim point3 As New Point(250, 200) Dim point4 As New Point(50, 150) Dim points As Point() = {point1, point2, point3, point4} PictureBox1.Refresh() g = PictureBox1.CreateGraphics g.FillClosedCurve(brush1, points) End Sub 程序运行结果如图 8-15 所示。 2.FillPolygon 方法 FillPolygon方法用当前画刷填充一个由 Point 结构数组定义的多边形的内部,格式为 Public Overloads Sub FillPolygon(brush As System.Drawing.Brush, _ 第 8 章 图 形 设 计 157 points() As System.Drawing.Point) 图 8-15 填充一个图形的闭合区域 参数说明 u brush——填充特性的 Brush 对象。 u points()——Point 结构的数组。 将例 8-11 中的最后一条语句中的FillClosedCurve 更换为 FillPolygon,观察运行结果。 8.4 交互绘图 在使用图形方法绘图中,坐标的指定是非常重要的。本 节 介绍使用鼠标事件捡取坐标值, 进行坐标的指定从而实现交互绘图的方法。 8.4.1 鼠标事件 在交互绘图中,常用的鼠标事件如下。 Private Sub object_MouseDown(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown Private Sub object_MouseUp(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase. MouseDown Private Sub object_MouseMove(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown Private Sub object_MousePress(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown 说明 参数e记载了鼠标所在位置,例如 e.x 是横坐标,e.y 是纵坐标。 8.4.2 鼠标绘图示例 【例 8-12】在指定的两点间画直线。 Visual Basic .NET 程序设计教程 158 将第一次鼠标单击的位置和第二次鼠标单击的位置的坐标赋给 DrawLine 方法的(x1, y1) 和(x2, y2),可以实现在这两点之间画直线。在程序设计时应注意两点,一是将第一次鼠标单 击位置和第二次鼠标单击位置的坐标分别赋给起始和终止变量;二是须设置监视鼠标单击的 标志,即设置区分是第一次鼠标单击位置还是第二次鼠标单击位置的标志变量。在窗体上指 定的两点间画直线的程序如下。 窗体设计如图 8-16 所示。 图 8-16 窗体设计 编写代码如下。 Dim yu As System.Drawing.Bitmap Dim p As System.Drawing.Graphics Dim x2, x1, y2, y1 As Short Dim pen As New System.Drawing.Pen(System.Drawing.Color.Black) Dim left_c As Short = 0 Dim c As System.Drawing.Color Dim b As Boolean Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown If left_c = 0 Then x1 = e.x y1 = e.y left_c = 1 '标志置 1,表示已单击鼠标 Else x2 = e.x y2 = e.y 第 8 章 图 形 设 计 159 pen.Color = Color.Red p = Me.CreateGraphics p.DrawLine(pen, x1, y1, x2, y2) left_c = 0 '标志置 0 End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load End Sub 程序运行结果如图 8-17 所示。 图 8-17 画直线 【例 8-13】使用鼠标画任意曲线。 使用 MouseMove 事件和 DrawLine 方法可以在窗体或图形框上依拖动鼠标的轨迹显示任 意曲线。注意,MouseMove 事件只是在移动鼠标时产生,当松开鼠标按钮后画线停止。同样, 须设置监视鼠标单击的标志。当 MouseDown 事件发生时,设定表示按下鼠标按钮的标志值; 当 MouseUp 事件发生时,对标志变量的值初始化。 参考程序如下。 Dim yu As System.Drawing.Bitmap Dim p As System.Drawing.Graphics Dim math1 As System.Math Dim x2, x1, y2, y1 As Short Dim c As System.Drawing.Color Dim pen As New System.Drawing.Pen(System.Drawing.Color.Black) Dim b As Boolean = False Dim x As Short Dim left_c As Short = 0 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ Visual Basic .NET 程序设计教程 160 System.EventArgs) Handles MyBase.Load End Sub Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown left_c = 1 x1 = e.X y1 = e.Y End Sub Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove If left_c = 0 Then Exit Sub Else x2 = e.x y2 = e.y pen.Color = Color.Blue p = Me.CreateGraphics p.DrawLine(pen, x1, y1, x2, y2) ' Picture8.Line (x1, y1)-(x2, y2) x1 = x2 y1 = y2 End If End Sub Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As _ System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp left_c = 0 End Sub 程序运行结果如图 8-18 所示。 图 8-18 任意曲线 第 8 章 图 形 设 计 161 练习题 1.仿金刚石图案 (1)设计思路 将半径为 r 的圆周分为 n(奇数或偶数)等分,并将所有等分点用直线相连,则形成一幅 类似金刚石的图案。当 n=24 和 n=8 时,图案如图 8-19 所示。 (a)n=24 (b)n=8 图 8-19 金刚石图案 (2)参考代码 Visual Basic .NET 程序设计教程 162 Dim math1 As System.Math Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Green) Dim gobject1 As System.Drawing.Graphics Dim b As System.Drawing.Bitmap Dim color1 As System.Drawing.Color Const pi = 3.14159 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics Dim a1(80), a2(80) As Single Dim i, j, n As Short Dim theta As Single Dim r As Single = 120 n = 8 theta = 2 * pi / n For i = 0 To n a1(i) = r * math1.Cos(theta * (i + 1)) + 220 a2(i) = 150 - r * math1.Sin(theta * (i + 1)) Next i For i = 0 To n - 1 For j = i + 1 To n gobject1.DrawLine(pen1, Int(a1(i)), Int(a2(i)), Int(a1(j)), _ Int(a2(j))) Next j Next i End Sub 2.正叶线图形 (1)设计思路 正叶线是一种类似植物叶子形状的曲线,如图 8-20 所示。正叶线的数学表达式为 图 8-20 正叶线 第 8 章 图 形 设 计 163 r=a*sin (n*th) x= r*cos (th) y= r*sin (th) (a>0 , n = 2, 3, …) 可以绘出由二重、三重的正叶线所组成的美丽图形。 (2)参考代码 Dim math1 As System.Math Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Green) Dim gobject1 As System.Drawing.Graphics Const pi = 3.1416 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim cx, cy, gra, k, a, n As Short Dim th, r, x, y, p, gx, gy As Single Dim p1 As System.Drawing.Point Dim p2 As System.Drawing.Point a = 100 : n = 2 gobject1 = PictureBox1.CreateGraphics PictureBox1.Refresh() cx = PictureBox1.Size.Width / 2 cy = PictureBox1.Size.Height / 2 gra = 0 : k = 200 For p = 1 To 0.2 Step -0.2 For th = 0 To 2 * pi + 0.1 Step pi / k r = math1.Abs(a * math1.Cos(n * th)) * p x = r * math1.Cos(th) y = r * math1.Sin(th) ' 画图 gx = cx + x : gy = cy + y If gra = 0 Then p1.x = gx : p1.y = gy : gra = 1 Else p2.x = gx : p2.y = gy gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next th gra = 0 Next p End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ Visual Basic .NET 程序设计教程 164 System.EventArgs) Handles Button2.Click End End Sub 程序运行结果如图 8-20 所示。 (3)试一试 本程序示例中,n=2,画 4 瓣。试变化 n 值,例如 n=3 或 n=4 并运行程序,观察图形的变 化情况。程序中,变量 p 的循环用于变化 r 的大小,以绘制多重正叶线。 第 9 章 图 像 处 理 本章要点: þ 如何在应用程序中建立图像的打开、保存,图像的复制、粘贴方法 þ 彩色图像的变换技术 本章介绍 Visual Basic .NET 图像程序设计所必备的基础知识。包括图像的打开、保存, 图像的复制、粘贴及彩色图像的变换等。 9.1 图像处理基础 9.1.1 图像文件类型 使用 GDI+可以显示和处理多种格式的图像文件。使用 Windows 窗体 PictureBox 控件, 可以在设计时将 Image 属性设置为有效图片,从而在窗体上加载和显示图片。允许使用的图 像文件类型如表 9-1 所示。 表 9-1 图像文件类型 类 型 文件扩展名 位图 .bmp Icon .ico GIF .gif 图元文件 .wmf JPEG .jpg 9.1.2 位图图像的装入 在 PictureBox 控件装入图像有两种方式,一种是在窗体设计时在对象的【属性】窗格使 用对象的 Image 属性,另一种是使用【打开】对话框的控件 OpenFileDialog。 1.使用对象的 Image 属性 界面设计时,在对象的【属性】窗格使用对象的 Image 属性装入图像的操作如下。 (1)在 PictureBox 对象【属性】窗格中选择的 Image 属性如图 9-1 所示。 Visual Basic .NET 程序设计教程 166 图 9-1 【属性】窗格 (2)单击 Image 属性右侧的按钮 ,弹出【打开】对话框,如图 9-2 所示。 图 9-2 【打开】对话框 第 9 章 图 像 处 理 167 (3)选择图像文件后,单击【打开】按钮。 2.使用【打开】对话框输入图像 使用命令按钮和【打开】对话框装入图像示例如下。 【例 9-1】建立如图 9-3 所示的窗体。运行后单击命令按钮打开【打开】对话框,在 PictureBox1 对象中装入图像。 图 9-3 窗体设计 操作步骤如下。 (1)建立如图 9-3 所示的窗体界面。在窗体上放置一个 PictureBox 对象和一个 Button, 并将 Button 对象的 Text 属性设为“输入图像”。 (2)将 OpenFileDialog 控件从工具箱中装入项目界面。 (3)编写命令按钮的事件过程代码。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim path As String Dim pic As Image OpenFileDialog1.ShowDialog() pic = New Bitmap(OpenFileDialog1.FileName) PictureBox1.Image = pic End Sub (4)运行。单击图像【输入图像】按钮,弹出【打开】对话框,在对话框中选择一个位 图图像文件。示例如图 9-4 所示。 Visual Basic .NET 程序设计教程 168 图 9-4 输入图像示例 9.1.3 位图图像的保存 对输入的图像进行处理后,往往需要对处理后的图像进行保存。使用命令按钮和【另存 为】对话框可以保存图像,示例如下。 【例 9-2】建立如图 9-5 所示窗体。运行后单击命令按钮,弹出【另存为】对话框,保存 PictureBox1 中图像。 (1)使用按钮和【另存为】对话框保存文件时,加入【保存】按钮,窗体设计如图 9-5 所示。 图 9-5 保存项目界面 第 9 章 图 像 处 理 169 (2)将工具箱中的SaveFileDialog 控件加入项目。 (3)编写【保存】命令按钮事件的过程。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim pic As Image SaveFileDialog1.ShowDialog() pic = New Bitmap(OpenFileDialog1.FileName) PictureBox1.Image = pic End Sub (4)执行该过程时将显示【另存为】对话框,如图 9-6 所示。选择合适的文件夹和文件 名保存。 图 9-6 【另存为】对话框 9.1.4 使用 Clipboard 对象的复制和粘贴 图像复制和粘贴是图像处理的基本操作之一。使用 AxPictureClip 的 Picture 方法可以 进行图像的复制和粘贴。仅当 PictureBox 的 AutoRedraw 属性值为真( True)时,PictureBox 内的图像可以复制到剪贴板(AxPictureClip)。例如,当确认 PictureBox1 的 AutoRedraw 属 性值为真时,将 PictureBox1 的图像复制到剪贴板的程序如下。 Private Sub Cmdcopy_Click() AxPictureClip1.Picture = PictureBox1.Image End Sub 将剪贴板的内容粘贴到 PictureBox 对象时同样使用 Picture 方法。例如,粘贴剪贴板的内 容到 PictureBox2 时,可写为 PictureBox2.Image = AxPictureClip1.Picture Visual Basic .NET 程序设计教程 170 将剪贴板的内容粘贴到 PictureBox2 的程序如下。 Private Sub Command1_Click() PictureBox2.Image = AxPictureClip1.Picture End Sub 【例 9-3】使用 AxPictureClip 对象的复制和粘贴的示例。 (1)建立如图 9-7 所示窗体。在 PictureBox1 输入图像,然后复制到 PictureBox2。 图 9-7 窗体设计 (2)将图像输入 PictureBox1,如图 9-8 所示。 图 9-8 图像输入到图片框 1 第 9 章 图 像 处 理 171 (3)编写使用 AxPictureClip 对象的复制和粘贴程序。 '复制到剪贴板 Private Sub Cmdcopy_Click() AxPictureClip1.Picture = PictureBox1.Image End Sub '粘贴到 PictureBox2 Private Sub Command1_Click() PictureBox2.Image = AxPictureClip1.Picture End Sub (4)单击【复制】按钮后单击【粘贴】按钮,则 PictureBox1 的图像被复制到 PictureBox2, 如图 9-9 所示。 图 9-9 图像被复制粘贴到图片框 2 9.2 彩色位图图像处理 9.2.1 位图图像处理基础 1.Bitmap 对象 对图像文件进行处理的类主要为 Bitmap 类。Bitmap 类属于 System.Drawing 命名空间, 该命名空间提供了对 GDI+ 基本图形功能的访问。Bitmap 类封装 GDI+ 位图,此位图由图 形图像及其属性的像素数据组成。Bitmap 对象是 Bitmap 类的实例,用于处理由像素数据定 义的图像。Bitmap 对象的常用方法和属性如表 9-2 所示。 表 9-2 Bitmap 的常用方法和属性 常用公共属性 属 性 说 明 Height 获取此 Image 对象的高度 PhysicalDimension 获取此 Image 对象的宽度和高度 PixelFormat 获取此 Image 对象的像素格式 Visual Basic .NET 程序设计教程 172 续表 常用公共属性 属 性 说 明 Size 获取此 Image 对象的宽度和高度 Width 获取此 Image 对象的宽度 常 用 方 法 方 法 说 明 GetPixel 获取此 Bitmap 中指定像素的颜色 RotateFlip 旋转、翻转或者同时旋转和翻转 Image 对象 Save 将Image 对象以指定的格式保存到指定的 Stream 对象 SetPixel 设置 Bitmap 对象中指定像素的颜色 2.彩色图像颜色值的获取 对图像进行处理时要使用GetPixel方法获取此 Bitmap 中指定像素的颜色。这些颜色是 由(R,G,B)三基色和(A)透明度组成的。 在彩色图像处理中,获取图像上指定像素颜色值使用 Bitmap 类的 GetPixel 方法,格式为 Dim tuxing As System.Drawing.Bitmap c = tuxing.GetPixel(i, j) 其中,tuxing 表示变量名,(i,j)为取得颜色的坐标位置。GetPixel 方法将指定位置的颜色值返 回一个长整形的整数。例如,求图片框 1中图像在位置(x, y)的像素颜色值(c)时,可写为 Dim tuxing As System.Drawing.Bitmap Dim c As System.Drawing.Color c = tuxing.GetPixel(i, j) 3.三基色值分解 从 c 结构中分解出 R 值、G 值和 B值可以直接使用 r = c.R g = c.G b = c.B 4.图像像素颜色的设定 重新设置图像像素的颜色使用 Color.FromArgb 方法。方法是从 4 个 8 位 ARGB 分量 (alpha、红色、绿色和蓝色)值创建 Color 结构。尽管此方法允许为每个分量传递 32 位值, 但每个分量的值仅限于 8 位。格式为 Overloads Public Shared Function FromArgb(Integer, Integer, Integer, _ Integer) As Color 5.重显图像 重显图像使用 SetPixel 方法,用法如下。 c = c.FromArgb(a, rr, rr, rr) tuxing.SetPixel(i, j, c) 第 9 章 图 像 处 理 173 9.2.2 彩色图像变换 1.彩色图像生成灰度图像 彩色图像生成灰度图像的示例如下。 (1)界面设计 彩色图像生成灰度图像的窗体设计如图 9-10 所示。 图 9-10 彩色图像生成单色图像的窗体设计 (2)算法步骤 设源图像像素的颜色值分解后的三基色 r,g,b 为 r1,g1,b1,处理后该新像素的 r,g, b 分量值设为 rr,gg,bb。 ① 颜色分解如下。 c = tuxing.GetPixel(i, j) r1 = c.R g1 = c.G b1 = c.B ② 求新像素的 r,g,b 分量值。例如,设为 rr,gg,bb, rr = gg = bb = (r1+g1+b1)/3 ③ 使用FromArgb 方法建立新的 Color 结构,即 c = c.FromArgb(a, rr, rr, rr) ④ 使用SetPixel 方法以新的 Color 结构生成新图像,即 Visual Basic .NET 程序设计教程 174 tuxing.SetPixel(i, j, c) (3)程序设计 彩色图像生成灰度图像程序如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim rr, gg, bb, i, j, a As Integer Dim r1, r2, b1, b2, g1, g2 As Integer tuxing = PictureBox1.Image For i = 1 To PictureBox1.Size.Width - 1 For j = 1 To PictureBox1.Size.Height - 1 rr = 0 : gg = 0 : bb = 0 c = tuxing.GetPixel(i, j) r1 = c.R g1 = c.G b1 = c.B rr = (r1 + b1 + g1) / 3 If rr < 0 Then rr = 0 If rr > 255 Then rr = 255 If gg < 0 Then gg = 0 If gg > 255 Then gg = 255 If bb < 0 Then bb = 0 If bb > 255 Then bb = 255 c = c.FromArgb(a, rr, rr, rr) tuxing.SetPixel(i, j, c) Next j PictureBox1.Refresh() Next i End Sub 彩色图像生成灰度图像程序的运行结果如图 9-11 所示。 图 9-11 彩色图像生成灰度图像运行结果 第 9 章 图 像 处 理 175 2.位图图像的逆反处理 (1)算法说明 位图图像逆反处理的算法如下。 rr = 255-r gg = 255-g bb = 255-b 式中,r,g,b 分别为源图像像素 f(i,j)的红、绿、蓝分量值,rr,gg,bb 分别为处理后像素 g(i,j)的红、绿、蓝分量值。 (2)程序设计 逆反处理的参考程序如下。 Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button9.Click g1 = PictureBox1.CreateGraphics tuxing = PictureBox1.Image For i = 0 To PictureBox1.Size.Width For j = 0 To PictureBox1.Size.Height color1 = tuxing.GetPixel(i, j) color2 = color1.FromArgb(255 - color1.A, 255 - color1.B, _ 255 - color1.G, 255 - color1.R) color1 = color2 tuxing.SetPixel(i, j, color1) Next j PictureBox1.Refresh() Next i End Sub 程序运行示例如图 9-12 所示。 图 9-12 逆反处理运行结果 Visual Basic .NET 程序设计教程 176 3.平滑处理 (1)算法说明 平滑处理是指将原图像的每一个像素都由其相邻 n×n 个像素的平均值来代替。例如,对 于 3×3 点阵,每一个像素用其周围的 8 个像素及其本身像素值之和的平均值代替。设 源 图像 某像素的值为 f (i,j),平滑处理后该像素的值为 g(i,j),则有 f(i -1,j-1) f(i,j-1) f(i+1,j-1) f(i -1,j) f(i,j) f(i+1,j) f(i -1,j+1) f(i,j+1) f(i+1,j+1) G(i, j)=(f(i, j)+ f(i-1, j) + f(i+1, j) +f(i-1, j-1) + f(i, j-1) + f(i-1, j-1) + f(i-1, j+1) + f(i, j+1) + f(i+, j+1))/9 注意,不能平滑图像边界的像素。 (2)程序设计 平滑处理的参考程序如下。 Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button6.Click Dim blocksize As Short = 3 Dim n As Short = 0 tuxing = PictureBox1.Image For i = Int(blocksize / 2) To PictureBox1.Size.Width - Int(blocksize / 2) For j = Int(blocksize / 2) To PictureBox1.Size.Height - Int(blocksize / 2) rx = 0 : gx = 0 : bx = 0 For k1 = -Int(blocksize / 2) To Int(blocksize / 2) For k2 = -Int(blocksize / 2) To Int(blocksize / 2) c = tuxing.GetPixel(i + k1, j + k2) r = c.R g = c.G b = c.B a = c.A rx = rx + r gx = gx + g bx = bx + b Next k2 Next k1 rr = rx / 9 gg = gx / 9 bb = bx / 9 If rr < 0 Then rr = 0 If rr > 255 Then rr = 255 If gg < 0 Then gg = 0 If gg > 255 Then gg = 255 If bb < 0 Then bb = 0 第 9 章 图 像 处 理 177 If bb > 255 Then bb = 255 c = c.FromArgb(a, rr, gg, bb) tuxing.SetPixel(i, j, c) Next j PictureBox1.Refresh() Next i End Sub 程序运行示例如图 9-13 所示。 图 9-13 平滑处理运行结果 9.3 彩色图像的几何变换 彩色图像的几何变换是指用几何处理的方法处理图像。主要包括彩色图像的平移变换、 比例变换、旋转变换、对称变换等。 9.3.1 图形的几何变换基础 对图像的每一个像素依据二维图形几何变换公式进行计算后再进行图像显示,可以得到 图像的几何变换。 二维图形的几何变换通常包括平移变换、比例变换、旋转变换和对称变换。 1.平移变换 将图形上的点(x, y)分别在 x 方向(水平方向)和 y 方向(垂直方向)分别移动 dx 和 dy, 则变换后点(x', y' )坐标值为 Visual Basic .NET 程序设计教程 178 x' =x+dx y' =y+dy 2.比例变换 以原点为中心,将图形各坐标点的 x 分量和 y 分量分别乘以 Sx,Sy,则可使图形进行整 体放大和缩小。这时, x' =x*Sx y' =y*Sy 当 Sx=Sy 时,图形作相似变换;当 Sx=Sy 时,图形产生变形。 3.旋转变换 以原点为中心,将点(x, y)旋转角度q而得到新的坐标(x', y' )的变换称为旋转变换。其数学 表达式为 x' =x* cos q-y* sin q y' =x* sin q+y* cos q 4.对称变换 (1)以 x 轴为对称的对称变换 点(x, y)以 x 轴为对称的点(x', y' )坐标为 x' =x y' = -y (2)以 y 轴为对称的对称变换 以 y 轴为对称的变换式为 x' = -x y' = y (3)以原点为对称的对称变换 以原点为对称的变换式为 x' = -x y' = -y 9.3.2 图像的几何变换程序设计 1.窗体设计 图像几何变换窗体设计如图 9-14 所示。 2.公共程序 Dim math1 As System.Math Dim i, rr, gg, r, a, g, b, bb, aa, ax, rx, bx, gx, k1, k2 As Short Dim j As Short Dim color1, c, cc, cd As System.Drawing.Color Dim color2 As System.Drawing.Color Dim tuxing As System.Drawing.Bitmap Dim tuxing2 As System.Drawing.Bitmap Dim g1 As System.Drawing.Graphics 第 9 章 图 像 处 理 179 图9-14 窗体设计 3.输入图像 输入图像如图 9-15 所示。 图 9-15 输入图像 4.平移效果 将图形框 1 中图像的各像素 P(i,j)作平移变换,然后在图形框 1 中显示,如图 9-16 所示。 Visual Basic .NET 程序设计教程 180 图 9-16 图像的平移变换 平移变换程序代码如下。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click Dim blocksize As Short = 3 Dim n As Short = 0 tuxing = PictureBox1.Image Dim rr, gg, bb, i, rr1, gg1, a, bb1, aa, ax, rr2, gg2, bb2, rx, _ bx, gx, k1, k2 As Integer Dim r1, r2, r3, b1, b2, b3, g1, g2, g3 As Short Dim pic(600, 600, 3) As Integer For i = 0 To PictureBox1.Size.Width - 1 For j = 0 To PictureBox1.Size.Height - 1 c = tuxing.GetPixel(i, j) pic(i, j, 0) = c.R pic(i, j, 1) = c.G pic(i, j, 2) = c.B Next j Next i For i = 0 To PictureBox1.Size.Width - 20 For j = 0 To PictureBox1.Size.Height - 20 rr = pic(i, j, 0) gg = pic(i, j, 1) bb = pic(i, j, 2) c = c.FromArgb(a, rr, gg, bb) tuxing.SetPixel(i + 20, j + 20, c) Next j PictureBox1.Refresh() Next i 第 9 章 图 像 处 理 181 End Sub 说明 图像平移是通过对像素的坐标进行变换操作实现的。本例程序中,通过 For 循环 给每一个像素的 x,y 坐标值增加一个移动值,从而实现图像的平移。 5.对称变换效果 将图形框 1 中图像的各像素 P(i, j)作镜像变换,然后在图形框 1 中显示,如图 9-17 所示。 图 9-17 图像的对称变换 对称变换程序代码如下。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click Dim blocksize As Short = 3 Dim n As Short = 0 tuxing = PictureBox1.Image Dim rr, gg, bb, i, rr1, gg1, a, bb1, aa, ax, rr2, gg2, bb2, rx, _ bx, gx, k1, k2 As Integer Dim r1, r2, r3, b1, b2, b3, g1, g2, g3 As Short Dim pic(600, 600, 3) As Integer For i = 0 To PictureBox1.Size.Width - 1 For j = 0 To PictureBox1.Size.Height - 1 c = tuxing.GetPixel(i, j) pic(i, j, 0) = c.R pic(i, j, 1) = c.G pic(i, j, 2) = c.B Next j Next i For i = 0 To PictureBox1.Size.Width - 1 For j = 0 To PictureBox1.Size.Height - 1 rr = pic(i, j, 0) Visual Basic .NET 程序设计教程 182 gg = pic(i, j, 1) bb = pic(i, j, 2) c = c.FromArgb(a, rr, gg, bb) tuxing.SetPixel(PictureBox1.Size.Width - i, _ PictureBox1.Size.Height - j, c) Next j PictureBox1.Refresh() Next i End Sub 练习题 1.使用检测像素合成法合成图像 (1)设计思路 检测像素合成法由“画图”软件制作成背景图像,并设定背景图像的底色为白色。逐一 检测背景图像和前景图像的每一个像素。当背景图像为白色时,合成图像中仅显示前景图像 中同一位置的像素,背景图像中白色以外的像素按照原样显示在合成图像中。 (2)窗体设计 窗体设计参数如图 9-18 所示。它由 3 个图片框、4 个命令按钮和 2 个打开文件对话框组 成。图片框 1(上左)中输入图像, 图片框 2(上右)中输入前景图像,图片框 3(下左)中 显示合成图像。单击【图像】按钮,图片框 1 输入图像;单击【背景】按钮,图片框 2 输入 背景图像;单击【合成】按钮,图片框 3 显示合成图像。 图 9-18 窗体设计 (3)程序代码 第 9 章 图 像 处 理 183 本例程序代码设计如下。 '变量声明 Dim color2, color1 As System.Drawing.Color Dim tuxing As System.Drawing.Bitmap Dim tuxing1, tuxing2 As System.Drawing.Bitmap '输入图像 1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim path As String Dim pic As Image OpenFileDialog1.ShowDialog() pic = New Bitmap(OpenFileDialog1.FileName) PictureBox1.Image = pic tuxing = pic End Sub '输入图像 2 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click Dim path As String Dim pic As Image OpenFileDialog2.ShowDialog() pic = New Bitmap(OpenFileDialog2.FileName) PictureBox2.Image = pic tuxing1 = pic End Sub '图像合成 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click tuxing2 = PictureBox3.Image tuxing.Width.Equals(200) tuxing.Height.Equals(200) Dim i As Integer 'x 轴坐标 Dim j As Integer 'y 轴坐标 Dim col_1 As Long 'Picture1 像素值 Dim col_2 As Long 'Picture2 像素值 Dim r, g, b As Short For i = 0 To PictureBox3.Size.Width - 1 For j = 0 To PictureBox3.Size.Height - 1 color1 = tuxing.GetPixel(i, j) color2 = tuxing1.GetPixel(i, j) r = color1.R g = color1.G b = color1.B Visual Basic .NET 程序设计教程 184 col_1 = r + g + b If col_1 = 3 * 255 Then tuxing2.SetPixel(i, j, color2) Else tuxing2.SetPixel(i, j, color1) End If Next j PictureBox3.Refresh() Next i End Sub '结束 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click End End Sub (4)运行 程序运行时,首先输入背景图像,再输入前景图像,单击【合成】按钮则显示合成后的 图像,示例如图 9-19 所示。 图 9-19 图像合成结果 2.界面切换 (1)窗体设计 在窗体上设置两个 PictureBox,一个打开文件控件和两个命令按钮。命令按钮中,一个 第 9 章 图 像 处 理 185 用于在PictureBox1 内输入图像,另一个是切换动作按钮。在 PictureBox2 中,预先输入一幅 图像。窗体设计如图 9-20 所示。 图 9-20 窗体设计 (2)设计要求 单击【输入图像】按钮,在 PictureBox1 输入一幅图像;单击【由左向右】按钮,则在 PictureBox2 内由左向右徐徐显示 PictureBox1 输入的图像。 (3)参考代码 Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button11.Click Dim r, g, b As Long Dim pwidth, pheight As Long Dim x, pw, ph As Long Dim i, j As Long tuxing = PictureBox1.Image tuxing1 = PictureBox2.Image pw = PictureBox1.Image.Size.Width - 1 ph = PictureBox1.Image.Size.Height - 1 x = 0 Do While x <= pw For j = 0 To ph c = tuxing.GetPixel(x, j) c = color1.FromArgb(c1.A, c.R, c.G, c.B) tuxing1.SetPixel(x, j, c) Next j Visual Basic .NET 程序设计教程 186 x = x + 1 PictureBox2.Refresh() Loop End Sub (4)试一试 在界面上添加一个命令按钮 Button3,并将其 Text 属性设为“从上到下”。编写程序,实 现单击【从上到下】命令按钮,则在 PictureBox2 内从上到下徐徐显示 PictureBox1 输入的图 像。 第 10 章 数 据 访 问 本章要点: þ ADO .NET 概念 þ 数据组件及数据库的访问方式 很多应用程序都需要处理大量的数据,而数据库的作用就是对这些数据进行管理、存储 和访问。Visual Basic .NET 利用. NET 框架提供的 ADO .NET 访问数据库,使用户可以在短时 间内开发出高效、简捷的数据库应用软件。 10.1 ADO .NET 概述 Visual Basic 6.0 经常使用 DAO,RDO,ADO 方式访问数据库。随着应用程序的发展, 以及.NET 框架的发布,微软公司设计并建立了第二代数据访问技术,即 ADO .NET 数据访问。 ADO .NET 为创建分布式数据共享应用程序提供了丰富的组件。 10.1.1 功能简介 ADO .NET 使用标准的 XML 数据模式,提供对 Microsoft SQL Server 等数据源的一致访 问。数据共享应用程序可以使用 ADO .NET 连接到这些数据源,并检索、操作和更新数据。 其主要功能如下。 1.数据访问手段 ADO .NET 提供了全面高效的数据访问手段,可以运用多种数据提取形式,实现用户的 不同要求,其中最主要的对象是 DataReader 和 DataSet。以只读方式提取的 DataReader 对象, 可以提高数据获取速度,简化了 ADO 中的复杂操作;DataSet 对象则实现了对各种复杂数据 源的数据提取,也是数据访问的主要方式。这些对象在提取数据的过程中遵循的基本操作步 骤如下。 (1)创建数据连接(Data Connection)。 (2)创建数据命令(Data Command)。 (3)获取数据。 2.数据库相关的集成开发环境 【工具箱】窗格的【数据】选项卡中提供了对数据库访问的类,如图 10-1 所示。用户可 以通过拖放操作将它们加入设计窗口,并通过更改属性实现对数据库的访问。 Visual Basic .NET 程序设计教程 188 图 10-1 【工具箱】窗格的【数据】选项卡 10.1.2 主要对象 图 10-2 显示了使用 ADO .NET 时用到的主要对象。 图 10-2 使用 ADO .NET 时用到的主要对象 OleDbConnection 和 SqlConnection 对象用于数据库连接。 OleDbCommand 和 SqlDbCommand 对象表示将要直接发送到数据库的 SQL 文本字符串。 OleDbDataAdapter 和 SqlDataAdapter 对象用于保存数据库的 SELECT,INSERT , UPDATE 和 DELETE 命令。这些对象可以作为数据库与 DataSet 对象之间的中介。使用 Fill 方法可以填充 DataSet 对象并从数据库断开连接,然后使用 Update 方法重新连接到数据库, 并将在 DataSet 对象中进行的更改保存到数据库。 OleDbReader 和 SqlReader 对象是连接的、仅向前移动的、只读数据的读取器。如果能够 保持与数据库的持续连接,并且只希望读取数据而不进行更改,可以使用这两个对象。 10.2 数据组件 ADO .NET 能够有效地从数据操作中将数据访问分解为多个可以单独或依次顺序使用的 不连续组件,它包含用于连接到数据库,执行命令和检索结果的.NET 数据提供程序。 .NET 框架附带了两个. NET 数据提供程序:SQL Server .NET 和 OLE DB .NET。SQL 第 10 章 数 据 访 问 189 Server .NET 数据提供程序用于 Microsoft SQL Server 7.0 或更高版本;OLE DB .NET 数据提供 程序用于使用 OLE DB公开的数据源。大多数数据组件以 SQL Server 和 OLE DB两种方式划 分。 所有的 SQL Server 方式的数据库组件都包括在 System.Data.SqlClient 命名空间中,在程 序中使用 SQL Server 方式的数据组件时,需要在代码的开始部分加入语句 Import System.Data.SqlClient 所有的 SQL Server 方式的数据库组件都包括在 System.Data.SqlClient 命名空间中,在程 序中使用 SQL Server 方式的数据组件时,需要在代码的开始部分加入语句 Import System.Data.SqlClient 如果采用 OLE DB方式的数据组件,需要在代码的开始部分加入语句 Import System.Data.OleDb 10.2.1 Connection 对象 Connection 对象是专门为创建数据库连接而提供的。如果使用的是 SQL Server 数据源, 那么在代码中应具体使用 SqlConnection 类的对象;如果使用的是 OLE DB数据源,那么在代 码中使用的是 OleDbConnection 类的对象。 创建 Connect 对象常使用以下两种方法。 (1)使用 New 关键字创建一个 SqlConnection类或 OleDbConnection类的一个对象。例如, Dim sqlCon As New SqlConnection() 或 Dim oleDbCon As New OleDbConnection() (2)利用【工具箱】窗格的【数据】选项卡中的控件。在窗体设计窗口中,双击【工具 箱】窗格中的 SqlConnection 控件图标或 OleDbConnection 控件图标,将控件添加到窗体下方, 系统同时自动创建对应的 SqlConnection 类或 OleDbConnection 类对象。 创建连接对象之后,还需要根据具体应用设置连接字符串,实现连接对象与数据源的连 接。例如,在 Windows 2000 Advanced Server 操作系统上使用 SQL Server 2000 创建的数据库 名为 student,管理员账号为 sa,未设置口令,则使用上述 sqlCon 对象连接到一个 SQL student 数据库上时可以使用如下代码。 Dim conStr As String '声明连接字符串变量 conStr = "user id=sa; password=;" & _ "initial catalog=student; data source=(local);" & _ "connect Timeout=5" sqlCon.ConnectionString = conStr 同样,使用 OLE DB方式也需要按照指定格式设置连接字符串,然后实现连接对象与数 据源的连接。例如,在 Windows 2000 Advanced Server 操作系统上使用 Access 2002 创建的数 据库名为 student,则使用上述的 oleDbCon 对象连接到一个 Access 数据库上,可以使用如下 Visual Basic .NET 程序设计教程 190 代码。 Dim conStr As String '声明连接字符串变量 conStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=student.mdb" oleDbCon.ConnectionString = conStr 10.2.2 Command 对象 Command 对象提供执行 SQL 命令的功能。如果使用的是 SQL Server 数据源,那么在代 码中应具体使用 SqlCommand 类的对象;如果使用的是 OLE DB数据源,那么在代码中具体 使用的是 OleDbCommand 类的对象。 创建 Command 对象常用以下两种方法。 (1)使用 New 关键字创建一个 SqlCommand 类或 OleDbCommand 类的一个对象。例如, Dim sqlCmd As New SqlCommand() 或 Dim oleDbCmd As New OleDbCommand() (2)利用【工具箱】窗格的【数据】选项卡中的控件。在窗体设计窗口中,双击【工具 箱】窗格中的 SqlCommand 控件图标或 OleDbCommand 控件图标,将控件添加到窗体下方, 同时系统自动创建对应的 SqlCommand 类或 OleDbCommand 类对象。 创建 Command 对象后,利用 Connect 对象可以设置 Command 对象的连接属性。例如, sqlCon.Open() '打开数据库连接 sqlCmd.Connection = sqlCon '设置命令对象的连接属性 类似地,也可以通过 OLE DB连接设置 OLE DB命令对象的连接属性。例如, OleDbCon.Open() OleDbCmd.Connection = OleDbCon Command 对象有两个重要属性:CommandText 属性和 CommandType 属性。 ◆ CommandText——该属性中存放的字符串是 Command 对象具体执行的命令。 ◆ CommandType——该属性用于设置 CommandText 属性的形式,有 3 种不同的选择: ① Text(默认值),表示 CommandText 的内容是 T-SQL 语句;② TableDirect,表示 CommandText 的内容是一个或多个表名;③ StoredProcedure,表示 CommandText 的 内容是一个或多个存储过程的名称。 在程序中使用 Command 对象时,需要首先设置 CommandText 属性和 CommandType 属 性值。例如,通过 SQL 方式连接可以进行如下设置。 sqlCmd.CommandType = CommandType.Text Dim cmdStr As String cmdStr = "Select * From stu1 " & _ "Where sID='200401'" sqlCmd.CommandText = cmdStr 通过 OLE DB方式连接的设置方法与此类似。 第 10 章 数 据 访 问 191 Command 对象的主要方法如下。 ◆ ExecuteReader——执行T-SQL 命令,生成一个 DataReader 类的对象保存查询结果。 ◆ ExecuteNonQuery——执行如 T-SQL INSERT,DELELE,UPDATE 和 SET 语句等 命令。 ◆ ExecuteScalar——从数据库中检索单个值。 ◆ ExecuteXmlReader——将 CommandText 发送到 Connection 并生成一个 XmlReader 对象。 10.2.3 DataReader 对象 DataReader 对象提供只读方式的数据对象,该类对象只能通过 Command 对象的 ExecuteReader 方法创建。也就是说,DataReader 对象用于存放 ExecuteReader 方法的查询结 果。例如, Dim dataRd As SqlDataReader dataRd = myCmd.ExecuteReader 使用时应该注意,当正在使用 SqlDataReader 时,关联的 SqlConnection 在忙于服务 SqlDataReader,而且除了关闭以外不能对 SqlConnection 执行其他任何操作。除非调用 SqlDataReader 的 Close 方法,否则会一直处于此状态。例如,在调用 Close 之前,无法检 索输出参数。 DataReader 对象的常用方法如下。 ◆ Read——使 SqlDataReader 前进到下一条记录。如果 SqlDataReader 中还有记录,则 返回 True,否则返回 False。 ◆ Get——Get 方法有许多种。例如,GetInt16 方法,用于获取指定列的 16 位有符号整 数形式的值;GetString 方法,用于获取指定列的字符串形式的值;GetName 方法, 用于获取指定列的名称;等等。 例如,下面代码用 Read 方法和 Get 方法返回查询结果。 If dataRd.Read Then TextBox2.Text = dataRd.GetString(1) '返回表中第 2 个字段的值 TextBox3.Text = dataRd.GetInt32(3) '返回表中第 4 个字段的值 dataRd.Close() myCon.Close() Else MsgBox("学号不正确,请重新输入") End If 使用 Get 方法时应注意字段序号是从 0 开始的。 10.3 SQL 语言数据查询语句简介 SQL(Structured Query Language,结构化查询语言)语言的主要功能是对关系数据库实 现数据定义和数据操作,按照 ANSI 规定,SQL 已作为关系型数据库管理系统的标准语言。 SQL 的数据定义语言主要用于建立和定义数据表、字段和索引等数据结构;SQL 的数据 Visual Basic .NET 程序设计教程 192 操纵语言主要实现数据查询、排序和筛选数据等功能。 SQL 语句由命令、子句、运算符和集合函数等构成。例如, SELECT * FROM stu1 WHERE sex='女' AND score>=80 其中,SELECT 为语句的命令,FROM 和 WHERE为子句,=、>=、AND 为运算符。 10.3.1 关系数据库 数据库是按照一定组织方式存储的相关数据的集合。按照其组织形式,可以分为关系、 层次和网状 3 种类型,其中较为流行的是关系数据库。 在关系数据库中,数据集合组织成二维表的形式。一个数据库可以包含多个表,表中的 每一行称为记录,表中的每一列称为字段,同一字段的数据具有相同的数据类型。 例如,student 数据库中包含两个表,表名分别为 stu1 和 stu2;表 stu1 的数据结构如图 10-3 所示,表中记录如图 10-4 所示。 图 10-3 表stu1 的数据结构 图 10-4 表stu1 的数据记录 10.3.2 数据定义功能 1.创建表 CREATE TABLE 表名 ( 列名 1 类型 1, 列名 2 类型 2, … 列名 n 类型 n) 2.增加新列 ALTER TABLE 表名 ADD 列名 类型 第 10 章 数 据 访 问 193 3.删除列 ALTER TABLE 表名 DROP 列名 4.删除表 DROP TABLE 表名 10.3.3 数据操纵功能 1.数据查询 数据查询语句 SELECT 是 SQL 语言中利用率最高的语句,该语句中包含多个子句,其最 常用的语句格式及其包含的子句如下。 SELECT 输出项 FROM 表名 WHERE 条件 其中,SELECT 子句中的输出项常用的是:① 列名;② 由列名、常数和+、-、*、/运算符 所构成的算术表达式;③ 聚合函数 AVG,COUNT,MAX, MIN,SUM。 WHERE子句的条件表达式中可以使用的运算符主要有:① 算 术 比较运算符( < 、<=、>、 >=、=、<>)和 BETWEEN 运算符;② 逻辑运算符(AND、OR、NOT); ③ 字符串匹配运 算符 LIKE。 2.数据插入 INSERT INTO 表名(列名 1,列名 2,…,列名 n) VALUE (值 1,值 2,…,值 n) 3.删除数据 DELETE FROM 表名 [WHERE 条件] 如果使用 WHERE 子句指定条件,则删除表中满足条件的记录;否则,删除表中所有 记录。 4.数据更新 UPDATE 表名 SET 列名 1=值 1[,列名 2=值 2,…, 列名 n=值 n] [WHERE 条件] 如果使用 WHERE 子句指定条件,则对表中满足条件的记录相关列的值进行更新;否则, 对表中所有记录的相关列的值进行更新。 10.4 数据库操作实例 【例 10-1】使用 SQL Server 方式访问 SQL 数据库。 Visual Basic .NET 程序设计教程 194 假设在 SQL Server 2000 系统中已经建立student 数据库,并 且 在数据库中创建了名为 stu1 的表,表结构和表中数据如图 10-3 和图 10-4 所示。 参照图 10-5 设计项目的用户界面,并按表 10-1 设置各控件的属性值。 图 10-5 例10-1 用户界面 表 10-1 例10-1 窗体及控件属性设置 对 象 类 型 对象(Name) 属 性 名 称 属 性 值 标签 Label Text 请输入学号 文本框 TextBox1 Text 空白 组框 GroupBox1 Text1 查询结果 Label2 Text 姓名 标签 Label3 Text 成绩 TextBox2 Text 空白 文本框 TextBox3 Text 空白 BSearch Text 查询 命令按钮 BClear Text 清除 首先,在代码的开始部分加入语句 Imports System.Data.SqlClient 然后,编写事件过程如下。 Dim myCon As New SqlConnection() Dim myCmd As New SqlCommand() Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load Dim conStr As String conStr = "user id=sa; password=;" & _ "initial catalog=student; data source=(local);" & _ "connect Timeout=5" myCon.ConnectionString = conStr 第 10 章 数 据 访 问 195 myCon.Open() myCmd.Connection = myCon End Sub Private Sub BSearch_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles BSearch.Click Dim dataRd As SqlDataReader myCmd.CommandType = CommandType.Text Dim cmdStr As String cmdStr = "Select * From stu1 " cmdStr += "Where sID='" + TextBox1.Text + "'" myCmd.CommandText = cmdStr myCon.Close() myCon.Open() dataRd = myCmd.ExecuteReader If dataRd.Read Then TextBox2.Text = dataRd.GetString(1) TextBox3.Text = dataRd.GetInt32(3) dataRd.Close() myCon.Close() Else MsgBox("学号不正确,请重新输入") End If End Sub Private Sub BClear_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles BClear.Click TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox1.Focus() End Sub 【例 10-2】使用 OLE DB方式访问 Access 数据库。 假设在 Access 2002 中已经建立了 student.mdb 数据库,并且在数据库中创建了名为 stu1 的表,表结构如图 10-6 所示。将 student.mdb 数据库存放到本项目文件夹的 bin 子文件夹中。 图 10-6 stu1 表结构 参照图 10-5 设计项目的用户界面,并按表 10-1 设置各控件的属性值。 另外,打开【工具箱】窗格的【数据】选项卡,分别将 OleDbConnection 控件和 OleDbCommand 控件添加到程序中。将 OleDbConnection 控件的 Name 属性修改为 OleDbCon, Visual Basic .NET 程序设计教程 196 将 OleDbCommand 控件的 Name属性修改为 OleDbCmd,如图 10-7 所示。 图 10-7 添加的OleDbConnection 控件和 OleDbCommand 控件 编写事件过程如下。 Dim dataRd As System.Data.OleDb.OleDbDataReader Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load Dim conStr As String conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=student.mdb" OleDbCon.ConnectionString = conStr OleDbCon.Open() OleDbCmd.Connection = OleDbCon End Sub Private Sub BSerch_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles BSerch.Click OleDbCmd.CommandType = CommandType.Text Dim cmdStr As String cmdStr = "Select * From stu1 " cmdStr += "Where sID='" + TextBox1.Text + "'" OleDbCmd.CommandText = cmdStr OleDbCon.Close() OleDbCon.Open() dataRd = OleDbCmd.ExecuteReader If dataRd.Read Then TextBox2.Text = dataRd.GetString(2) TextBox3.Text = dataRd.GetInt16(4) dataRd.Close() OleDbCon.Close() Else MsgBox("学号不正确,请重新输入") End If End Sub 练习题 使用 OLE DB 方式连接例 10-2 的 Access 数据库 student.mdb,从数据库中查找所有的成 绩高于 80 分的记录,并将这些记录逐条添加到一个列表框中。 第 11 章 应用程序设计实训 本章要点: þ 文本编辑器设计 þ 统计图设计 þ 图像动画 þ 图案生成 11.1 文本编辑器设计 11.1.1 任务及项目界面设计 1.任务 设计一个如图 11-1 所示的简单的文本编辑器,要求具有下列功能。 图 11-1 文本编辑器 (1)建立或打开一个文本文件(.txt 或.rtf)。 ( 2 )保存编辑好的文本文件。 (3)具有全选、复制、剪切、粘贴等文字编辑功能。 Visual Basic .NET 程序设计教程 198 (4)具有文字字体、字型、大小和颜色设置功能。 (5)段落对齐和打印功能。 2.界面设计 界面设计如图 11-2 所示。在窗体上添加一个 RichTextBox 控件,名为 RichTextBox1。从 【工具箱】窗体中将 MainMenu 控件、OpenFileDialog控件、SaveFileDialog 控件、FontDialog 控件、ColorDialog 控件和 PrintDialog 控件加入项目,并分别取其默认名 MainMenu1、 OpenFileDialog1、SaveFileDialog1、FontDialog1、ColorDialog1 和 PrintDialog1。 图 11-2 界面设计 使用 MainMenu1 进行菜单设计。主菜单栏设有【文件】、【编辑】、【格式】、【对齐方 式】、【字体选择】和【打印】6 个主菜单项,各主菜单项的子菜单分别如下。 (1)【文件】菜单 u【打开】——打开一个文本文件。 u【保存】——保存当前编辑的文本文件。 u【退出】——结束当前编辑的文本文件,退出系统。 (2)【编辑】菜单 u【剪切】——剪切选定内容,并把它放在剪贴板上。 u【复制】——复制选定内容并把它放在剪贴板上。 u【粘贴】——把剪贴板上的内容插入当前位置。 u【撤销】——撤销上次操作。 第 11 章 应用程序设计实训 199 (3)【格式】菜单 u【字体】——设置文本字体。 u【颜色】——设置文本颜色。 11.1.2 RichTextBox 控件简介 RichTextBox 是一种既可以输入文本、又可以编辑文本的文字处理控件。与 TextBox 控件 相比,其文字处理功能更加丰富,可以设定文字的颜色、字体,还具有字串检索功能。 RichTextBox 控件可以打开、存 储 .rtf 格式文件及 ASCII 文本格式的文件,并对文件进行编辑。 1.属性 RichTextBox 控件的【属性】窗格如图 11-3 所示。主要属性说明如下。 图 11-3 【属性】窗格 ◆ Autosize——设置 RichTextBox 控件是否可以根据单行编辑控件字体的大小来自动调 整大小。取值为 True 或 False,默认值为 True,即可以自动调整。 ◆ BackColor——设置 RichTextBox 控件中文本的背景色。 ◆ Enabled——设置 RichTextBox 控件是否有效。取 值 为 True 或 False,默认值为 True。 ◆ Font 属性——设置 RichTextBox 控件中文本的字体。 ◆ ForeColor 属性——设置 RichTextBox 控件中文本的颜色,默认值为黑色。 ◆ Locked——设置是否可以在窗体编辑过程中移动控件或调整控件尺寸。取值为 True 或 False,默认值为 True,即可以移动控件或调整控件。 Visual Basic .NET 程序设计教程 200 ◆ MaxLength——控制 RichTextBox 控件中容纳的字符串长度。如 果值是 0,则字符串的 长度就没有限制,否则就限制在设置的范围之内。 ◆ ReadOnly——设置是否可以更改编辑控件中的文本。取值为 True 和 False,默认值为 False,即可以输入字符。 ◆ Text——控件中包含的文本。 ◆ Visible——设定控件是否可见。取值为 True 或 False,默认值为 True,即 RichTextBox 控件是可见的。 ◆ Borderstyle——设定 RichTextBox 控件的边界。取 值 为 None,FixedSingle 或 Fixed3D, 默认值为 Fixed3D。 2.主要事件 (1)TextChanged 事件 当 RichTextBox 控件的文本内容发生改变时就会激发该事件。在本实例中,我们用此事 件监视文本内容的改变。 (2)LinkClicked 事件 当用户在控件文本内的链接上单击时发生。 (3)SelectionChange 事件 控件内的选定文本更改时发生。 3.主要方法 (1)Clear 方法 清空 RichTextBox 中的文本内容。 (2)Copy 方法 将 RichTextBox 中的选定内容复制到剪贴板中。 (3)Cut 方法 将 RichTextBox 中的选定内容剪切到剪贴板中。 (4)Find 方法 在 RichTextBox 的文本内容中查找指定的字符串。 (5)Paste 方法 粘贴剪贴板中的内容。 (6)SaveFile 方法 将 RichTextBox 中的内容保存到文件中。 (7)LoadFile 方法 将文件中的内容导入 RichTextBox 中。 (8)Undo 方法 取消最近一次的文本编辑操作。 (9)Select All方法 选择 RichTextBox 中的全部内容。 (10)Redo 方法 重做已取消的操作。 第 11 章 应用程序设计实训 201 11.1.3 RichTextBox 控件应用 利用 RichTextBox 控件提供的属性、方法可以很方便地进行文件的输入、保存和各种编 辑处理,说明如下。 1.文件的装入和保存 使用 LoadFile 方法可以将 .txt 文件、.rtf 文件装入 RichTextBox 控件。语句格式为 RichTextBox1.LoadFile(文件名) 使用 SaveFile 方法可以将控件上的文档存储为文件。语句格式为 RichTextBox1.SaveFile(文件名) 2.右侧空白 读入到 RichTextBox 的文件通过 RightMargin 属性可以设置右侧空白。所谓指定右侧空 白,实际上是指定一行文字自动折行的宽度。当希望根据窗口宽度而实现自动折行时,可以 使用如下语句: RichTextBox1.RightMargin = RichTextBox1.Width-300 其中,300 为右侧空白,单位为像素。 3.设置滚动条 在 RichTextBox 内通过 ScrollBars 属性可以设置滚动条。Scrollbars 属性值及其意义如下。 ◆ RichTextBoxScrollBars.None——不显示滚动条。 ◆ RichTextBoxScrollBars.Horizontal——在文本比控件的宽度长时显示水平滚动条。 ◆ RichTextBoxScrollBars.Vertical——在文本比控件的高度长时显示垂直滚动条。 ◆ RichTextBoxScrollBars.Both——在需要时同时显示水平滚动条和垂直滚动条。 ◆ RichTextBoxScrollBars.ForcedBothHorizontal——始终显示水平滚动条。 ◆ RichTextBoxScrollBars.ForcedBothVertical——始终显示垂直滚动条。 ◆ RichTextBoxScrollBars.ForcedBoth——始终显示水平滚动条和垂直滚动条。 例如,语句 RichTextBox1.Scrollbars = RichTextBoxScrollBars.ForcedBoth; 将在 RichTextBox1 内设置水平、垂直滚动条。 4.查找 使用Find方法可以查找字符串。使用GetLineFromCharIndex 方法返回查找字符串的位置。 例如,从起始文字(0)开始查找字符串“abc”,将找到字符串的位置返回给 n1,找不到字符 串返回-1。找到字符串反色。同时 GetLineFromChar 方法将找到的字符串的位置位于窗口的 那一行赋给变量 line。代码如下。 n1 = RichTextBox1.Find("abc", 0) line = RichTextBox1.GetLineFromCharIndex(n10) 5.剪切、复制和粘贴 使用 Copy 方法可以将 RichTextBox 中的选定内容复制到剪贴板中,格式为 Visual Basic .NET 程序设计教程 202 RichTextBox1.Copy() 使用 Cut 方法可以将 RichTextBox 中的选定内容剪切到剪贴板中,格式为 RichTextBox1.Cut() 使用 Paste 方法可以粘贴剪贴板中的内容,格式为 RichTextBox1.Paste() 11.1.4 文本编辑器功能程序设计 1.文件菜单功能程序设计 (1)打开 使用 OpenFileDialog 控件打开一个输入对话框,输入文本文件。代码设计如下。 Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem2.Click Dim str As String Dim type1 As System.Windows.Forms.RichTextBoxStreamType OpenFileDialog1.ShowDialog() str = OpenFileDialog1.FileName RichTextBox1.LoadFile(str, RichTextBoxStreamType.PlainText) End Sub (2)保存 使用 SaveFileDialog 控件打开一个保存对话框,保存编辑后的文本文件。代码设计如下。 Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem3.Click SaveFileDialog1.ShowDialog() Dim str1 As String str1 = SaveFileDialog1.FileName RichTextBox1.SaveFile(str1, RichTextBoxStreamType.PlainText) End Sub 2.编辑菜单功能程序设计 (1)剪切 使用 RichTextBox 控件提供的 Cut 方法。代码设计如下。 Private Void MenuItem8_Click(object sender, System.EventArgs e) { RichTextBox1.Cut(); } (2)复制 使用 RichTextBox 控件提供的 Copy 方法。代码设计如下。 Private Sub MenuItem8_Click(ByVal sender As System.Object, ByVal e As _ 第 11 章 应用程序设计实训 203 System.EventArgs) Handles MenuItem8.Click RichTextBox1.Copy() End Sub (3)粘贴 使用 RichTextBox 控件提供的 Paste 方法。代码设计如下。 Private Sub MenuItem9_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem9.Click RichTextBox1.Paste() End Sub 3.格式菜单功能程序设计 (1)字体 使用 FontDialog 对话框,代码设计如下。 Private Sub MenuItem12_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem12.Click FontDialog1.ShowDialog() RichTextBox1.SelectionFont = FontDialog1.Font End Sub (2)颜色 使用 ColorDialog 对话框,代码设计如下。 Private Sub MenuItem13_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem13.Click ColorDialog1.ShowDialog() RichTextBox1.SelectionColor = ColorDialog1.Color End Sub 4.字体选择菜单功能程序设计 (1)粗体 Private Sub MenuItem19_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem19.Click If Not RichTextBox1.SelectionFont Is Nothing Then Dim currentFont As System.Drawing.Font = RichTextBox1.SelectionFont Dim newFontStyle As System.Drawing.FontStyle If RichTextBox1.SelectionFont.Bold = True Then newFontStyle = FontStyle.Regular Else newFontStyle = FontStyle.Bold End If RichTextBox1.SelectionFont = New Font(currentFont.FontFamily, _ currentFont.Size,newFontStyle) End If End Sub (2)斜体 Visual Basic .NET 程序设计教程 204 Private Sub MenuItem20_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem20.Click If Not RichTextBox1.SelectionFont Is Nothing Then Dim currentFont As System.Drawing.Font = RichTextBox1.SelectionFont Dim newFontStyle As System.Drawing.FontStyle If RichTextBox1.SelectionFont.Italic = True Then newFontStyle = FontStyle.Regular Else newFontStyle = FontStyle.Italic End If RichTextBox1.SelectionFont = New Font(currentFont.FontFamily, _ currentFont.Size, newFontStyle) End If End Sub (3)下划线 Private Sub MenuItem21_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem21.Click If Not RichTextBox1.SelectionFont Is Nothing Then Dim currentFont As System.Drawing.Font = RichTextBox1.SelectionFont Dim newFontStyle As System.Drawing.FontStyle If RichTextBox1.SelectionFont.Underline = True Then newFontStyle = FontStyle.Regular Else newFontStyle = FontStyle.Underline End If RichTextBox1.SelectionFont = New Font(currentFont.FontFamily, _ currentFont.Size, newFontStyle) End If End Sub (4)删除线 Private Sub MenuItem22_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem22.Click If Not RichTextBox1.SelectionFont Is Nothing Then Dim currentFont As System.Drawing.Font = RichTextBox1.SelectionFont Dim newFontStyle As System.Drawing.FontStyle If RichTextBox1.SelectionFont.Strikeout = True Then newFontStyle = FontStyle.Regular Else newFontStyle = FontStyle.Strikeout End If RichTextBox1.SelectionFont = New Font(currentFont.FontFamily, _ currentFont.Size, newFontStyle) End If End Sub 5.打印功能程序设计 使用 PrintDialog 对话框,代码设计如下。 第 11 章 应用程序设计实训 205 Private Sub MenuItem23_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MenuItem23.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 If End Sub 11.2 统计图的绘制 11.2.1 功能和界面设计 1.任务 设计一个如图 11-4 所示的统计图设计器,要求该设计器能够根据数据库中所存数据,生 成相应的折线图、直方图等多种统计图表。 图11-4 统计图设计 2.界面设计 界面设计如图 11-5 所示。在窗体上放置 1 个 MSChart 定制控件、1 个 DataGrid 控件和 8 个按钮,其 Text 属性设置如表 11-1 所示。 Visual Basic .NET 程序设计教程 206 图 11-5 界面设计 表 11-1 Text 属性设置值 按 钮 控 件 对 象 名 Text属性 Button1 Button1 输入数据 Button2 Button2 折线图 Button3 Button3 立体折线图 Button4 Button4 直方图 Button5 Button5 立体直方图 Button6 Button6 立体域图 Button7 Button7 饼图 Button8 Button8 结束 11.2.2 MSChart 定制控件和 DataGrid 控件 1.AxMSChart 控件 AxMSChart 是一个以图形方式显示数据的图表。在窗体中加入 AxMSChart 控件后的画面 如图 11-6 所示。图中,R1,R2,R3,…表示数据的项目,每一个项目包含多个数据。图的 水平方向为 x 轴,垂直方向为 y 轴。图中 y 轴方向的两侧均标有数据,为区别起见,右侧称 为 y1 轴,左侧称为 y2 轴。 第 11 章 应用程序设计实训 207 图 11-6 AxMSChart 控件 控件的主要属性说明如下。 (1)RowCount 属性和 ColumnCount 属性 AxMSChart 控件的 RowCount 属性和 ColumnCount 属性用于统计图的数据设定。一 旦 在 窗体上配置了 AxMSChart 控件,则自动生成一个数据表,用于存放数据。AxMSChart 控件的 数据是一个按项目排列的二维表。初始设计时数据表中填入的是一组随机数据,用于生成范 例表。例如,图 10-9 中 AxMSChart 控件初始显示了 5 组、每组 4 个数据,数据表为 R1: 41 68 32 0 R2: 70 24 78 58 R3: 62 64 5 46 R4: 81 26 62 91 R5: 95 42 28 36 其中,第 1 行、第 1 列的数据是 41,对应于 R1 的第 1 个条形。程序运行时,这些随机数将 被实际数据所代替。 在程序设计中,必须使用 AxMSChart 控件的 RowCount 属性和 ColumnCount 属性预先设 定与统计图显示数据相对应的数据表的整体结构。RowCount 属性设置数据表行总数,对应于 统计图中的数据组数;ColumnCount 属性设置数据表列总数,对应于统计图中每组数据的个 数。例如,代码 AxMSChart1.RowCount = 5 AxMSChart1.ColumnCount = 4 设定了一个显示 5 组、每组 4 个数据的统计图的数据表整体结构。同样,也可以在界面设计 时利用 AxMSChart 控件的【属性】窗口设置这两个属性的属性值。 Visual Basic .NET 程序设计教程 208 在程序设计中,给数据表设定数据有两种方法,一种方法是使用 AxMSChart1 的 Row、 Column 和 Data属性按行、列直接赋值。例如, AxMSChart1.Row = 3 AxMSChart1.Column = 4 AxMSChart1.Data = 200 表示数据表第 3 行、第 4 列的数据是 200。 第二种方法是使用数组设定数据。该方法首先用一个二维数组设定数据,然后再送给图 形控件,当然也可以送给数据表。例如, Dim ssdata(1 to 3,1 to 4) As Integer ssdata(1,1) = 200 ssdata(1,2) = 100 … ssdata(3,4) = 400 AxMSChart1.ChartData = ssdata (2)RowLabel 属性和 ColumnLabel属性 利用 AxMSChart 控件的 RowLabel 属性和 ColumnLabel属性可以设定统计图中数据系列 的分类标签。例如,第 1 行的行标签为“电视机”,第 1 列的列标签为“数据 1”,在程序中可 以写为 AxMSChart1.Row = 1 AxMSChart1.RowLabel = "电视机" AxMSChart1.Column = 1 AxMSChart1.ColumnLabel = "数据 1" (3)RowLabelCount 和 RowLabelIndex 属性 一般而言,行、列标签只使用一行就可以了,但也可以使用多行,此时就需要使用 AxMSChart 控件的 RowLabelCount 和 RowLabelIndex 属性。例如,设定行标签为两段时的代 码示例如下。 AxMSChart1.RowLabelCount = 2 AxMSChart1.Row = 1 AxMSChart1.RowLabelIndex = 1 AxMSChart1.RowLabel = "电视机" AxMSChart1.RowLabelIndex = 2 AxMSChart1.RowLabel=“月产量” 这里,AxMSChart1.RowLabelIndex 为指定多个行标签的索引。利用同样的方法,使用 ColumnLabelCount 和 ColumnLabelIndex 属性可以处理多列标签。 (4)TitelText,FootNoteText 和 ShowLegend 属性 统计图中图题、脚注和图标示例的表示可以使用 TitelText、FootNoteText 和 ShowLegend 属性。例如, 第 11 章 应用程序设计实训 209 AxMSChart1.TitelText = "产品统计图" AxMSChart1.FootNoteText = "2004 年 9 月 28 日" AxMSChart1.ShowLegend = True '显示图标示例 (5)ChartType 属性 使用 AxMSChart 控件可以绘制直方图、折线图、圆图、立体直方图等 12 种内定的统计 图表,使用 ChartType 属性可以设置显示图表的类型。格式为 object.AChartType [ = type] 其中,object 为对象名;type 为 Integer ,描述图表类型的 VtChChartType 常数 。 VtChChartType 常数说明如表 11-2 所示。 表 11-2 VtChChartType 常数说明 常 数 说 明 0-VtChChartType3dBar 三维直方图 1-VtChChartType2dBar 二维直方图 2-VtChChartType3dLine 三维折线图 3-VtChChartType2dLine 二维折线图 4-VtChChartType3dArea 三维面积图 5-VtChChartType2dArea 二维面积图 6-VtChChartType3dStep 三维累计图 7-VtChChartType2dStep 二维累计图 8-VtChChartType3dCombination 三维组合图 9-VtChChartType2dCombination 二维组合图 14-VtChChartType2dPie 二维饼图 16-VtChChartType2dXY 二维 XY 散点图 (6)Size 和 BorderStyle 属性 利用 AxMSChart 控件的 Size 属性可以设置控件的高度和宽度,单位为像素。利用 AxMSChart 控件的 BorderStyle 属性可以设置控件的边框形态。 BorderStyle 属性值如表 11-3 所示。 表 11-3 BorderStyle 属性值设置说明 常 数 设 置 说 明 xxxNone 0 无(没有边框或与边框相关的元素) xxxFixedSingle 1 固定单线边框 2.DataGrid 控件 一般而言,AxMSChart 控件与数据网格(DataGrid 对象)相关连,可以用数据网格显示 图表中的数据。数据网格是存有已图表化数据的表。数据网格中也包括用于在图表中标识系 列和分类的标签。设计人员通过从表或数组中插入或输入数据给数据网格填充信息。DataGrid 对象被配置为行和列。可以向该矩阵添加和减去行、列和标签以更改图表的外观。 Visual Basic .NET 程序设计教程 210 ◆ BackColor——设置偶数行的背景色。 ◆ BackgroundColor——设置网格中非行区域的背景颜色。 ◆ BorderStyle——设置边框样式。 ◆ DataSouce——设置网格所显示数据的数据源。 ◆ Font——设置显示的文字字体。 ◆ Height——设置控件高度。 ◆ Item——设置指定单元格值。 ◆ Size——设置控件的高度和宽度。 ◆ Visible——设置是否显示该控件。 ◆ VisibleColumnCount——设置可见列的数目。 ◆ VisibleRowCount——设置可见行的数目。 ◆ Width——设置控件的宽度。 3.DataSet 控件 DataSet 控件是 ADO .NET 结构的主要控件,它是从数据库中检索到的数据在内存中的 缓存。DataSet 控件由一组DataTable对象组成,可以使这些对象与DataRelation对象互相关 联,也可以通过使用UniqueConstraint和ForeignKeyConstraint对象在 DataSet 中实施数据完整 性。 尽管 DataTable 对象中包含数据,但是DataRelationCollection允许遍览表的层次结构,这 些表包含在通过Tables属性访问的DataTableCollection中。当访问 DataTable 对象时,注意它们 是按条件区分大小写的。例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名 为“Mydatatable ”, 则用 于搜 索其中一个表的字符串被认为是区分大小写的。但如果 “mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。 DataSet 控件将数据和架构作为 XML 文档形式进行读/写。数据和架构可以通过 HTTP 传 输,并在启用 XML 的任何平台上被任何应用程序使用。使用WriteXmlSchema方法可以将该 架构保存为 XML 架构,并 且 可以使用WriteXml方法保存架构和数据。若要读取既包含架构也 包含数据的 XML 文档,可以使用ReadXml方法。 创建和刷新 DataSet 控件,并依次更新原始数据的步骤如下。 ① 使用SqlDataAdapter或OleDbDataAdapter,用数据源中的数据构造和填充 DataSet 控件 中的每个 DataTable对象。 ② 通过添加、更新或删除DataRow对象,更改单个DataTable对象中的数据。 ③ 调用GetChanges方法,创建只反映对数据进行更改的第 2 个 DataSet 控件。 ④ 调用SqlDataAdapter(或OleDbDataAdapter)的Update方法,并将第 2 个 DataSet 控件 作为参数传递。 ⑤ 调用Merge方法将第 2 个 DataSet 控件中的更改合并到第 1 个中。 (1)主要属性如下。 ◆ DataSetName——设置当前 DataSet 控件的名称。 ◆ HasErrors——获取指示此 DataSet 控件的任何表的任何行中是否有错误值。 ◆ NameSpace——设置 DataSet 控件的命名空间。 ◆ Prefix——设置 XML 前缀。 第 11 章 应用程序设计实训 211 ◆ Tables——获取包含在 DataSet 控件中表的集合。 (2)主要方法如下。 ◆ Clear——清除 DataSet 控件。 ◆ Copy——复制 DataSet 控件的结构和数据。 ◆ ReadXml——将 XML 架构和数据读入 DataSet 控件。 ◆ WriteXml——从 DataSet 控件写 XML 数据,也可以选择写架构。 11.2.3 设计代码 1.输入数据 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim rows, cols, r, c As Short Dim a(4) As String a(1) = "2000 年" a(2) = "2001 年" a(3) = "2002 年" a(4) = "2003 年" OleDbConnection1.Open() OleDbDataAdapter1.Fill(DataSet11, "TABLE1") DataGrid1.DataSource = DataSet11 rows = DataSet11.TABLE1.Rows.Count() cols = DataSet11.TABLE1.Columns.Count() AxMSChart1.RowCount = rows AxMSChart1.ColumnCount = cols AxMSChart1.TitleText = DataSet11.TABLE1.TableName.ToString() AxMSChart1.ShowLegend = True For r = 1 To AxMSChart1.RowCount AxMSChart1.Row = r AxMSChart1.RowLabel = a(r) For c = 1 To AxMSChart1.ColumnCount AxMSChart1.Column = c AxMSChart1.ColumnLabel = DataSet11.TABLE1.Columns(c - 1).ColumnName AxMSChart1.Data = DataSet11.TABLE1.Rows(r - 1)(c - 1).ToString() Next c Next r OleDbConnection1.Close() End Sub 2.折线图 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType2dLine End Sub 折线图如图 11-7 所示。 Visual Basic .NET 程序设计教程 212 图 11-7 折线图 3.立体折线图 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType3dLine End Sub 立体折线图如图 11-8 所示。 图 11-8 立体折线图 第 11 章 应用程序设计实训 213 4.直方图 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType2dBar End Sub 直方图如图 11-9 所示。 图 11-9 直方图 5.立体直方图 Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button5.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType3dBar End Sub 立体直方图如图 11-10 所示。 6.立体域图 Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button6.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType3dArea End Sub 立体域图如图 11-11 所示。 Visual Basic .NET 程序设计教程 214 图 11-10 立体直方图 图 11-11 立体域图 7.饼图 Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button7.Click AxMSChart1.chartType = MSChart20Lib.VtChChartType.VtChChartType2dPie End Sub 第 11 章 应用程序设计实训 215 饼图如图 11-12 所示。 图 11-12 饼图 8.结束 Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button8.Click Application.Exit() End Sub 11.3 图像动画设计 将屏幕上显示的画面或者画面的一部分,按照一定的规则或要求在屏幕上移动的技术称 为动画技术。在屏幕上实现动画有 3 种方式。 (1)位置不动,形态变化。 (2)形态不变,位置变化。 (3)位置和形态均变化。 下面介绍一个位置不动、形态变化的动画设计。 11.3.1 窗体设计 窗体设计如图 11-13 所示。在窗体上设置 5 个图片框 PictureBox1~PictureBox5,利用 PictureBox 的 Image 属性,在 PictureBox2~PictureBox5 中各输入一幅不同形态的小熊猫图像。 另外,在窗体上设置 2 个 Button 按钮,1 个 HScrollBar 和 1 个 Timer 控件。 Visual Basic .NET 程序设计教程 216 图 11-13 窗体设计 上述设置完成后,用鼠标缩小窗体,隐藏 Picture2~Picture5,如图 11-14 所示。 图 11-14 窗体 11.3.2 程序设计及运行 程序设计如下。 1.变量声明 Dim n As Integer Dim flg As Integer 2.开始 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Timer1.Enabled = True If flg = 0 Then n = 1 Timer1.Interval = HScrollBar1.Value 第 11 章 应用程序设计实训 217 flg = 1 Else n = 0 flg = 0 End If End Sub 3.初始化 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles MyBase.Load n = 0 flg = 0 End Sub 4.动画速度调节 Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As_ System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll Timer1.Interval = HScrollBar1.Value End Sub 5.定时器设定 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Timer1.Tick Dim ret As Integer If n = 0 Then Exit Sub End If ret = n Mod 4 Select Case ret Case 0 PictureBox1.Image = PictureBox2.Image Case 1 PictureBox1.Image = PictureBox3.Image Case 2 PictureBox1.Image = PictureBox4.Image Case 3 PictureBox1.Image = PictureBox5.Image End Select n = n + 1 End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click End End Sub Visual Basic .NET 程序设计教程 218 End Class 6.运行 程序运行后,可以看到一个小熊猫在运动。调整速度条,可以变化运动速度。如图 11-15 所示。单击【开始】按钮,即开始运动;用鼠标向右拖动滑块,则运动速度加快;单击【结 束】按钮,动画结束。 图 11-15 运行结果 11.4 美术图案程序设计 日常生活中见到的美术图案,例如纺织品图案、装饰图案等,大多是将一个图案单元或 几个图案单元进行组合和排列,从而形成一幅美丽的艺术图案。这里介绍一个美术图案的自 动生成程序。程序运行时,由键盘根据屏幕提示,输入必要的参数即可得到一幅美丽的图案。 通过不同参数的组合,可以自动设计出成千上万种风格各异的美术图案。 11.4.1 美术图案单元的生成 选取的曲线不同,生成的美术图案亦不同。 1.函数曲线选择 曲线可以选择各种不同函数生成,例如函数可以选择 y=a*sin (x)*sin (d*x) 或 y=a*cos (b*x)*cos (d*x) 等。当选择函数为 y=a*sin (x)*sin (d*x) 时,选择不同 a 值和 d 值,使 x 值为 0~360°。例如,当 a=100 时,d 取不同值时的函数曲线 如图 11-16 所示。 第 11 章 应用程序设计实训 219 图 11-16 函数曲线 程序设计如下。 Inherits System.Windows.Forms.Form 'Inherits System.Windows.Forms.Form Dim math1 As System.Math Dim pen1 As New System.Drawing.Pen(System.Drawing.Color.Green) Dim gobject1 As System.Drawing.Graphics Dim brush1 As System.Drawing.Brush Const pi = 3.14159 Dim p1, p2, p3, p4 As System.Drawing.Point Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click Dim p1, p2 As System.Drawing.Point PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics Const pi = 3.14159 Dim cx, cy, n, l, a, b, z, x2, y2, bx, by As Short Dim x, al, y, d As Single PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics a = 30 : d = 0 For cx = 100 To 320 Step 200 For cy = 60 To 300 Step 150 d = d + 0.5 For z = -90 To 90 Step 5 Visual Basic .NET 程序设计教程 220 x = z al = (z + 90) * 2 * pi / 180 y = a * math1.Sin(al) * math1.Sin(d * al) x2 = cx + x y2 = cy - y If z = -90 Then bx = x2 : by = y2 p1.x = bx p1.y = by Else p2.x = x2 : p2.y = y2 gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next z Next cy, cx End Sub 2.函数曲线的镜像变换 取函数 y=a*sin (x)*sin (d*x)的镜像,即取 y= -a*sin (x)*sin (d*x)并画图,图形如图 11-17 所示。 图 11-17 镜像变换 程序设计如下。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click Dim p1, p2 As System.Drawing.Point PictureBox1.Refresh() 第 11 章 应用程序设计实训 221 gobject1 = PictureBox1.CreateGraphics Const pi = 3.14159 Dim cx, cy, n, l, a, b, z, x2, y2, bx, by, x3, y3, bx1, by1, z1, _ cx1, cy1 As Short Dim x, al, y, d, x0, y0, d1, a0 As Single PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics a = 30 : d = 0 : d1 = 0 For cx = 100 To 320 Step 200 For cy = 60 To 300 Step 150 d = d + 0.5 For z = -90 To 90 Step 5 x = z al = (z + 90) * 2 * pi / 180 y = a * math1.Sin(al) * math1.Sin(d * al) x2 = cx + x y2 = cy - y If z = -90 Then bx = x2 : by = y2 p1.x = bx p1.y = by Else p2.x = x2 : p2.y = y2 gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next z Next cy, cx For cx1 = 100 To 320 Step 200 For cy1 = 60 To 300 Step 150 d1 = d1 + 0.5 For z1 = -90 To 90 Step 5 x0 = z1 a0 = (z1 + 90) * 2 * pi / 180 y0 = -a * math1.Sin(a0) * math1.Sin(d1 * a0) x3 = cx1 + x0 y3 = cy1 - y0 If z1 = -90 Then bx1 = x3 : by1 = y3 P3.x = bx1 P3.y = by1 Else p4.x = x3 : p4.y = y3 gobject1.DrawLine(pen1, p3, p4) p3 = p4 End If Visual Basic .NET 程序设计教程 222 Next z1 Next cy1, cx1 End Sub 3.函数曲线图形旋转 90° 我们再做进一步的处理,即交换曲线上每个画线点的 x 坐标和 y 坐标值。例如, temp = x x = y y = temp 处理后再画图,图形如图 11-18 所示。 图 11-18 旋转 90° 图 11-8 的图案单元称为四瓣花型图案。绘制图 11-8 单元的参考程序如下。 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button3.Click Dim p1, p2 As System.Drawing.Point PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics Const pi = 3.14159 Dim cx, cy, n, l, a, b, z, x2, y2, bx, by, g As Short Dim x, al, y, d, temp As Single PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics a = 30 : d = 0 For cx = 100 To 320 Step 200 For cy = 60 To 300 Step 150 d = d + 0.5 第 11 章 应用程序设计实训 223 For g = 1 To 2 For l = -1 To 1 Step 2 For z = -90 To 90 Step 5 x = z al = (z + 90) * 2 * pi / 180 y = l * a * math1.Sin(al) * math1.Sin(d * al) If g = 2 Then temp = x : x = y : y = temp End If x2 = cx + x y2 = cy - y If z = -90 Then bx = x2 : by = y2 p1.x = bx p1.y = by Else p2.x = x2 : p2.y = y2 gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next z, l, g Next cy, cx End Sub 4.图案单元的花形设计 以图 11-18 的美术单元为基础,对单元再进行旋转处理,可以得到 8 瓣、12 瓣、16 瓣、 20 瓣等 4 的整数倍的图案单元,图 11-19 所示为 8 瓣单元。 图 11-19 图案单元 Visual Basic .NET 程序设计教程 224 程序设计如下。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button4.Click Dim p1, p2 As System.Drawing.Point PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics Const pi = 3.14159 Dim cx, cy, n, l, a, b, z, x2, y2, bx, by, g As Short Dim x, al, y, d, temp, bt, bt1, bt2, x1, y1 As Single PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics a = 30 : d = 0 bt = pi / 4 For cx = 100 To 320 Step 200 For cy = 60 To 300 Step 150 d = d + 0.5 For bt = 0 To pi / 4 Step pi / 4 bt1 = math1.Cos(bt) : bt2 = math1.Sin(bt) For g = 1 To 2 For l = -1 To 1 Step 2 For z = -90 To 90 Step 5 x = z al = (z + 90) * 2 * pi / 180 y = l * a * math1.Sin(al) * math1.Sin(d * al) If g = 2 Then temp = x : x = y : y = temp End If x1 = x * bt1 - y * bt2 y1 = x * bt2 + y * bt1 x2 = cx + x1 y2 = cy - y1 If z = -90 Then bx = x2 : by = y2 p1.x = bx p1.y = by Else p2.x = x2 : p2.y = y2 gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next z, l, g, bt Next cy, cx End Sub 综上所述,如果取 y=a*sin (b) cos (d),改变函数式中参数 a,b,d 再通过旋转使瓣数变 化,例如 第 11 章 应用程序设计实训 225 (1)a 取 5~90 之间的数据,步长为 5 时,可取 18 种; (2)b 值取 0.5,1.0,1.5,2.0,2.5,3.0 等 6 种; (3)d值取0.5,1.0,1.5,2.0,2.5,3.0 等 6 种; (4)瓣数取 3,4,…,20 等 18 种。 由上述参数组合变化,则可生成上万种图案单元。 11.4.2 图案单元的屏幕设置 1.设置 为通用起见,这里选用分辨率为 640×400 点的显示屏幕。当选用低分辨率的屏幕(例如 640×200)时,y 方向的数据应进行适当调整。 如图 11-20 所示,在 640×400 的屏幕上取 360×360 的方框,设 un 为一行的美术图案单 元的配置数,则每个单元的点数 uv 为 uv=360/un 图 11-20 单元设置 设 un=6,并设 p0 参数为配置参数。当 p0 取值不同时,其配置位置如图 11-21 所示。 图 11-21 位置设定 Visual Basic .NET 程序设计教程 226 从图 11-21 中可以看到,当 un=6 时,p0 取 1,2,3,4 等不同数值时,美术单元在屏幕 上的配置数不同,其位置也不同。根据上述,可以编写出美术图案自动生成程序。参考程序 如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button1.Click gobject1 = PictureBox1.CreateGraphics Const pi = 3.1415926 Dim flag flag = 1 Dim ss, a, ed, d, sf, st, bt1, bt2, al, xl, yl, bt As Single Dim un, p0, uv, st2, ad, el1, hf2, k, t, be, hf1, dy, dx, m, px, _ py As Short Dim j, cx, cy, g, gg, l, z, x, y, sy, i, bx, by, xy As Integer Dim x3(4000), y3(4000), pt(1000) As Single un = CInt(Rnd() * 13) Mod 13 + 1 uv = 360 / un : k = uv / 2 hf1 = 180 - uv : hf2 = 180 - k ss = uv / 100 p0 = (Rnd() * 10) Mod 4 + 1 Select Case p0 Case 1 : bx = hf2 : by = hf2 Case 2 : bx = hf1 : by = hf1 Case 3 : bx = hf2 : by = hf1 Case 4 : bx = hf1 : by = hf2 End Select el1 = Rnd() * 10 Mod 5 + 1 If el1 = 5 Then st2 = 50 Else st2 = 2 End If be = (Rnd() * 10 Mod 2) * 45 If be = 45 Then be = pi / 4 ad = Rnd() * 10 Mod 5 + 1 Select Case ad Case 1 : ed = 0 : st = 1 Case 2 : ed = pi / 4 : st = pi / 4 Case 3 : ed = pi / 3 : st = pi / 6 Case 4 : ed = 3 * pi / 8 : st = pi / 8 Case 5 : ed = 2 * pi / 5 : st = pi / 10 End Select If el1 <> 5 Then gg = 1 a = CInt(Rnd() * 8) * 0.1 第 11 章 应用程序设计实训 227 d = (Rnd() * 10 Mod 6 + 1) * 0.5 If d < 2 Then st2 = 5 Else gg = -1 End If sf = 1 i = 0 : m = 0 For bt = be To be + ed Step st bt1 = math1.Cos(bt) : bt2 = math1.Sin(bt) For g = 1 To 2 For l = -1 To gg Step 2 For z = -50 To 50 Step st2 i = i + 1 x = z al = (z + 50) * 2 * pi / 100 Select Case el1 Case 1 : y = l * a * 15 * math1.Sin(al) * math1.Sin(d * al) Case 2 : y = l * a * 15 * math1.Cos(al) * math1.Sin(d * al) Case 3 : y = l * a * 15 * math1.Sin(al) * math1.Cos(d * al) Case 4 : y = l * a * 15 * math1.Cos(al) * math1.Cos(al) Case 5 : y = 0 End Select If g = 2 Then xy = x : x = y : y = xy xl = x * bt1 - y * bt2 : yl = x * bt2 + y * bt1 x3(i) = xl * sf : y3(i) = yl * sf If z = -50 Then m = m + 1 : pt(m) = i Next z Next l Next g Next bt For cx = -bx To bx Step uv For cy = -by To by Step uv t = 1 For j = 1 To i px = cx + x3(j) * ss : py = cy + y3(j) * ss dx = 200 + px : dy = 180 - py If j = pt(t) Then t = t + 1 : p1.x = dx : p1.y = dy Else p2.X = dx : p2.y = dy gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next j Next cy Next cx Visual Basic .NET 程序设计教程 228 End Sub 运行结果如图 11-22 所示。 图 11-22 生成的美术图案 2.说明 程序中各参数的取值范围及意义如下。 (1)un。取值 1~12,为屏幕上每行配置的美术图案单元数。注意,实际显示的单元数, 尚与 p0 有关。 (2)p0。取值 1~4,该参数与 un 置数。在程序中,由开关语句 switch(p0)进行选择。 (3)pt。取值 1~5,为曲线数字公式选择。一般情况下取 1~4,取 5 时绘制栅状线或 斜线。 程序中,由 switch(eli)可以选择以下 5 种函数。 ① y=l*a*25*sin (al)*sin (d*al) ② y=l*a*25*cos (al)*sin (d*al) ③ y=l*a*25*sin (al)*cos (d*al) ④ y=l*a*25*cos (al)*cos (d*al) ⑤ y=0 改变程序中函数数学的公式,则可以改变图形单元的形状。 (4)ed。画图起始角。取值为 0°或 45°,一般取 0°。 (5)ad。取值 1~5。 (6)本例程序是一个随机生成花形图案的程序,程序中使用了随机函数使一些参数随机 变化,例如,程序中的参数 un,p0 等。 第 11 章 应用程序设计实训 229 练习题 (1)动画中图片的预置方法很多。例如,使用图片对象数组,把一系列动作连续的图片 保存在内存中实现图片的快速变换。这样做有许多好处, 可以不必在窗体使用多个图形框或图 像控件。试用对象数组完成图 11-15 的动画设计。 (2)花边图案设计 花边自动生成程序是在图样生成程序的基础上编制而成的。如果将图 11-22 所示图形中 只保存最后一层图案,除去内部的图案,则构成花边生成程序。 程序设计如下。 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _ System.EventArgs) Handles Button2.Click PictureBox1.Refresh() gobject1 = PictureBox1.CreateGraphics Const pi = 3.1415926 Dim ss, a, ed, d, sf, st, bt1, bt2, al, xl, yl, bt As Single Dim un, p0, uv, st2, ad, el1, hf2, k, t, be, hf1, dy, dx, m, px, py As Short Dim j, cx, cy, g, gg, l, z, x, y, sy, i, bx, by, xy As Integer Dim x3(4000), y3(4000), pt(1000) As Double un = 8 uv = 360 / un : k = uv / 2 hf1 = 180 - uv : hf2 = 180 - k ss = uv / 100 p0 = (Rnd() * 10) Mod 4 + 1 Select Case p0 Case 1 : bx = hf2 : by = hf2 Case 2 : bx = hf1 : by = hf1 Case 3 : bx = hf2 : by = hf1 Case 4 : bx = hf1 : by = hf2 End Select el1 = Rnd() * 10 Mod 5 + 1 If el1 = 5 Then st2 = 50 Else st2 = 2 End If be = (Rnd() * 10 Mod 2) * 45 If be = 45 Then be = pi / 4 ad = Rnd() * 10 Mod 5 + 1 Select Case ad Case 1 : ed = 0 : st = 1 Case 2 : ed = pi / 4 : st = pi / 4 Case 3 : ed = pi / 3 : st = pi / 6 Case 4 : ed = 3 * pi / 8 : st = pi / 8 Visual Basic .NET 程序设计教程 230 Case 5 : ed = 2 * pi / 5 : st = pi / 10 End Select If el1 <> 5 Then gg = 1 a = CInt(Rnd() * 8) * 0.1 d = (Rnd() * 10 Mod 6 + 1) * 0.5 If d < 2 Then st2 = 5 Else gg = -1 End If sf = 1 i = 0 : m = 0 For bt = be To be + ed Step st bt1 = math1.Cos(bt) : bt2 = math1.Sin(bt) For g = 1 To 2 For l = -1 To gg Step 2 For z = -50 To 50 Step st2 i = i + 1 x = z al = (z + 50) * 2 * pi / 100 Select Case el1 Case 1 : y = l * a * 15 * math1.Sin(al) * math1.Sin(d * al) Case 2 : y = l * a * 15 * math1.Cos(al) * math1.Sin(d * al) Case 3 : y = l * a * 15 * math1.Sin(al) * math1.Cos(d * al) Case 4 : y = l * a * 15 * math1.Cos(al) * math1.Cos(al) Case 5 : y = 0 End Select If g = 2 Then xy = x : x = y : y = xy xl = x * bt1 - y * bt2 : yl = x * bt2 + y * bt1 x3(i) = xl * sf : y3(i) = yl * sf If z = -50 Then m = m + 1 : pt(m) = i Next z Next l Next g Next bt For cx = -bx To bx Step uv For cy = -by To by Step uv If ((cx > -hf1 And cx < hf1) And (cy > -hf1 And cy < hf1)) Then Goto aa t = 1 For j = 1 To i px = cx + x3(j) * ss : py = cy + y3(j) * ss dx = 200 + px : dy = 180 - py If j = pt(t) Then t = t + 1 : p1.x = dx : p1.y = dy Else p2.x = dx : p2.y = dy 第 11 章 应用程序设计实训 231 gobject1.DrawLine(pen1, p1, p2) p1 = p2 End If Next j aa: Next cy Next cx End Sub 程序运行结果如图 11-23 所示。 图 11-23 单层花边 参 考 文 献 1. 李兰友,李玮,白克壮.Visual Basic .NET 图形图像编程与实例详解.北京:电子工业出版社,2002 2. 李海,龚学钢,李文亮.深入研究 Visual Basic .NET.北京:电子工业出版社,2003 3. 郁红英,冯庚豹.Visual Basic .NET 语句与函数大全.北京:电子工业出版社,2002 4. 葛小东,邓秋媛.VB .NET 编程实例与技巧集锦.北京:中国科学技术出版社;北京希望电子出版社, 2003
还剩241页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

qiaosister

贡献于2016-11-01

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf