Visual Basic 2010入门经典

978-7-115-25145-9
作者: 【美】James Foxall
译者: 梅兴文
编辑: 傅道坤

图书目录:

详情

Visual Basic是一种非常流行的编程语言,本书通过引导读者创建一个图片查看程序,全面阐述了使用Visual Basic 2010创建应用程序所需的各种基本技能。

图书摘要

计算机技术译林精选系列

Visual Basic 2010入门经典

[美] James Foxall 著

梅兴文 译

人民邮电出版社

北京

Visual Basic是一种非常流行的编程语言,Visual Basic 2010是微软公司推出的 Visual Basic最新版本,其功能比以前任何版本都强大,可与C++等语言相媲美。本书通过引导读者创建一个图片查看程序,全面阐述了使用Visual Basic 2010创建应用程序所需的各种基本技能。

全书分五部分,共 24章。第一部分介绍了Visual Basic 2010学习版开发环境,引导读者熟练使用该 IDE;第二部分探讨如何创建应用程序界面,包含窗体和各种控件的用法;第三部分介绍了编程技术,包括编写和调用方法、处理数值、字符串和日期、决策和循环结构、代码调试、模块和类的创建以及图形绘制等;第四部分阐述了文件和注册表的处理、数据库的使用和自动化其他应用程序等;第五部分介绍了应用程序部署并概述了.NET框架。

本书适合没有任何编程经验的读者和Visual Basic新手阅读,也可作为大中专院校Visual Basic课程的参考资料。

 

James Foxall是Tigerpaw软件公司(www.tigerpawsoftware.com)的总裁。Tigerpaw公司位于 Nebraska 州 Bellevue,是一家微软认证合作伙伴,致力于为技术提供商提供解决方案。Tigerpaw的商业自动化解决方案曾获过奖,该产品将合同管理、市场营销、服务和维修、建议生成、库存控制和采购等自动化。在 2010 年初,有超过 25 000 名用户在使用最新版本的Tigerpaw。Foxall 在创建认证的 Office 兼容软件方面有丰富的经验,这使其成为 Microsoft Windows和Microsoft Office环境的应用程序接口和行为标准方面的权威。

James一直在编写Visual Basic商业产品代码,在这方面的经验超过14年。他编写过很多图书,其中包括《Practical Standards for Microsoft Visual Basic》和《MCSD in a Nutshell: The Visual Basic Exams》,还为杂志《Access-Office-VBA Advisor》和《Visual Basic Programmer’s Journal》撰写文章。James拥有信息管理系统(MIS)学士学位和工商管理硕士学位(MBA),是微软认证解决方案开发人员,还在全球各地就编程技术和业务流程改善方面发表演讲。不编程和撰写编程方面的图书时,他喜欢和家人在一起弹吉他、欣赏优秀乐队的作品以及玩电脑游戏。可通过www.jamesfoxall.com联系James。

Visual Basic是一种非常流行的语言,Visual Basic 2010是Microsoft推出的最新版本。它与以前的版本截然不同,功能更强大,可与C++等高级语言相媲美。伴随强大功能而来的是Visual Basic 2010更为复杂,这使得通过研究Visual Basic在线帮助、自学创建程序所需技能的时代一去不复返。

针对的读者及组织结构

本书面向那些几乎没有编程经验或选择Visual Basic作为第二编程语言的读者,旨在使读者尽快掌握Visual Basic 2010。作者基于使用Visual Basic编写大型商业应用程序和教授Visual Basic的经验编写本书,希望能够化繁为简,帮助读者掌握所需的知识。很多作者过于专注技术而不是其实际应用。本书致力于帮助读者掌握可立即用于开发项目的实践技巧,读者可将建议和成功经验张贴到www.jamesfoxall.com/forums。

本书分为五部分,每个部分关注使用Visual Basic开发应用的不同方面。这些部分遵循使用Visual Basic开始创建程序的任务流程,建议按顺序阅读。

第一部分“Visual Basic 2010环境”介绍Visual Basic环境,包括如何导航和使用各种Visual Basic工具。另外,读者还将学到一些重要的开发概念,如对象、集合和事件。

第二部分“创建用户界面”阐述如何创建功能完善、引人入胜的用户界面。在这部分,读者将学习窗体和控件(即用户界面元素,如文本框和列表框)。

第三部分“编程”探讨Visual Basic 2010编程细节———需要学习的知识很多。读者将学习如何创建模块和过程以及如何在代码中存储数据、执行循环和做出决策。学习核心编程技巧后,读者将学习面向对象编程和应用程序的调试。

第四部分“使用数据”介绍如何使用文本文件和数据库编程以及自动化 Word 和 Excel等外部应用程序。另外,还将介绍如何对用户的文件系统和Windows注册表进行操作。

第五部分“部署解决方案及其他”介绍如何将创建的应用程序分发到最终用户的计算机中。其中第 24章将从非技术角度概述Microsoft .NET Framework。

以前版本的很多读者提出了如何使本书更好的建议。许多人建议提供一些示例,这些示例建立在前几章的基础之上。本书已尽可能这样做。在本书中,读者将创建一个功能丰富的图片查看器程序,而不是学习独立的概念。首先将创建一个基本的应用程序,然后在程序中添加菜单和工具栏、创建一个“选项”对话框、修改程序以使用Windows注册表和文本文件,并创建安装程序用于将应用程序发布给其他用户。希望这种方式对读者有帮助,让读者在创建真实程序的过程中学习知识。

本书使用的约定

本书使用了一些约定,让读者能够充分利用和参考书中的信息。

“注意”提供有用的信息,读者可以马上阅读,也可阅读完当前话题后再阅读。

“提示”突出那些可以使Visual Basic编程更有效的信息。

“警告”提醒读者注意可能在特定情况下出现的问题或副作用。

为突出新术语,使用斜体显示新术语。

另外,本书对代码和其他文字使用不同的字体。代码使用等宽字体;占位符——用于表示需要在代码中输入实际单词或字符——使用斜体等宽字符;需要用户输入的文本用粗体表示。

菜单选项用>分开。例如,指示读者打开菜单“文件”并选择菜单项“新建项目”时,表示为“选择菜单‘文件’>‘新建项目’”。

书中列出的有些语句过长,无法在一行中容纳。在这种情况下,使用续行字符(下划线)指出下一行是当前语句的一部分。

前进和提高

现在到了学习编程的激动时刻,衷心希望读者阅读本书后,能够得心应手地使用众多Visual Basic工具创建、调试和部署中型Visual Basic程序。虽然还不能成为专家,但读者将对学到的东西之多感到惊讶。希望读者沿通往 Visual Basic专家之路前进时,本书能够帮助确定未来的方向。

我喜欢使用Visual Basic进行编程,有时候发现其回报令人难以置信。希望读者和我一样享受Visual Basic编程。

第1章 全身心投入:Visual Basic 2010编程之旅

第2章 Visual Basic 2010导航

第3章 理解对象和集合

第4章 理解事件

在本章中,读者将学习:

创建一个简单但有一定功能的Visual Basic应用程序;

让用户浏览硬盘;

显示硬盘中的图片;

熟悉一些编程术语;

学习Visual Studio 2010 IDE。

学习一门新的编程语言因其难度可能使人望而却步。如果您从来没有编写过程序,那么输入有些神秘的文本就可以产生精美的、功能强大的应用程序,这种行为对您来说可能就像一种魔法,您可能会想知道如何才能学会需要掌握的东西。答案当然是一步一步来。学习语言的第一步是建立自信。编程的一半是艺术一半是科学。虽然它看起来有点像魔术,但它更像是幻象;当您知道一切是如何发生的后,很多迷雾便会散去,让您能够集中关注那些产生所需结果所必需的机制。

大型商业解决方案也是通过一系列小步骤完成的。阅读本章后,读者将对整个开发过程有所认识,并迈出成为有成就的程序员的第一步。实际上,在后续几章中,将继续完善本章的示例。阅读本书后,读者将构建一个健壮的应用程序,包含可调整大小的窗口、直观的界面(包括菜单和工具栏)、Windows注册表的操作和专业的错误处理机制。

在本章中,您将通过逐步创建一个小而完整的Visual Basic程序来快速了解Visual Basic。大多数入门级编程图书都以创建一个简单的“Hello World”程序开始,但我还没见过一个有用的Hello World程序(它们通常什么都不做,只是将“Hello World”打印到屏幕上———真是有趣)。因此,在这里您将创建一个图片查看器(Picture Viewer)应用程序,可查看计算机上的Windows位图和图标。您将学习如何让用户查找文件以及如何在屏幕上显示选中的图片文件。本章介绍的技巧在很多实际应用程序中都将派上用场,但本章的目标是让读者认识到使用Visual Basic 2010 进行编程是多么富有乐趣。

开始创建Visual Basic 2010程序前,应先熟悉下列术语。

可发布的组件:指项目最后编译的版本。组件可发布给其他人和其他计算机,它们不要求在Visual Basic 2010开发环境(用于创建.NET程序的工具)下运行,但要求.NET运行时,这将在第23章讨论。可发布的组件通常称为程序。在第23章,将学习如何把即将创建的图片查看器程序发布给其他计算机。

项目:指可以编译以创建可发布组件的文件集合。项目的类型有多种,复杂的应用程序可能包含很多项目,如Windows应用项目和支持它的动态链接库(Dynamic Link Library,DLL)项目。

解决方案:组成应用程序或组件的项目与文件的集合。

注意:以前,Visual Basic是一种独立的语言;现在,情况不同了,Visual Basic是.NET 框架的一部分。.NET 框架包含所有.NET 技术,其中包括 Visual Studio.NET(开发工具套件)和公共语言运行时(Common Language Runtime, CLR),该运行时是组成所有.NET应用核心的文件集。在本书中,读者将学到有关这些术语的更多细节。现在,只要知道Visual Basic是.NET家族中的很多语言之一即可。其他的很多语言(如C#)也是.NET语言,也使用CLR,在Visual Studio内开发。

Visual Studio 2010是一个完整的开发环境,被称为集成开发环境(Integrated Development Environment,IDE)。IDE是用于创建应用程序的设计框架;创建Visual Basic项目所需的所有工具都在Visual Basic IDE中。再强调一次,Visual Studio 2010支持使用不同语言进行开发,其中Visual Basic是最受欢迎的一种。环境本身并不是Visual Basic,但在Visual Studio 2010中使用的语言是Visual Basic。要创建Visual Basic项目,首先需要启动Visual Studio 2010 IDE。

要启动Visual Studio 2010,在“开始”>“所有程序”菜单中选择“Microsoft Visual Basic 2010 Express”。如果运行的是完整的.NET零售版,快捷方式的名称可能不同。在这种情况下,在“开始”菜单中找到该快捷方式并单击它,以启动Visual Studio 2010 IDE。

首次启动Visual Studio 2010时,将在 IDE中看到“起始页”选项卡,如图 1.1所示。在这里可打开之前创建的项目或创建新项目。在这次快速之旅中,将新建一个Windows应用程序,因此打开“文件”菜单,再单击“新建项目”,这将打开图 1.2 所示的“新建项目”对话框。

注意:如果“起始页”看起来与图1.1不同,很有可能已经修改了默认设置。第2章将介绍如何改为默认设置。

图1.1 可从Visual Studio的“起始页”打开现有项目或创建新项目

图1.2 可通过“新建项目”对 话 框 创 建 多种.NET项目

“新建项目”对话框用于指定要创建哪种类型的Visual Basic项目(用Visual Basic和.NET框架支持的其他语言可创建多种类型的项目)。图1.2显示的选项有限,这是由于本书使用的是Visual Basic学习版;如果您使用的是Visual Studio完整版,将有众多其他的选项。

通过下列步骤新建一个Windows窗体应用程序。

1.确保选择的是“Windows窗体应用程序”图标;如果不是,单击该图标选中它。

2.“新建项目”对话框的底部是一个“名称”文本框,用于指定要创建的项目名称。在该文本框中输入“Picture Viewer”。

3.单击“确定”创建项目。

提示:创建项目前总是将“名称”文本框设置为有意义的名称,否则要移动或重命名项目时,将需要做更多的工作。

当Visual Basic新建Windows窗体应用程序项目时,它会为应用程序添加一个窗体(空的灰色窗口),让用户可以开始创建界面,如图1.3所示。

注意:在Visual Studio 2010中,窗体是指可显示给用户的窗口的设计视图。

图1.3 新的 Windows 窗体应用程序以一个空白窗体开始;乐趣刚刚开始!

读者的 Visual Studio 2010环境可能与书中显示的不同,这取决于使用的 Visual Studio 2010版本、是否设置过Visual Studio 2010以及其他因素(如显示器的分辨率)。然而,本章讨论的所有元素都存在于所有Visual Studio 2010版本中,如果图中所示的窗口在读者的 IDE中没有显示出来,请使用“视图”菜单显示它。

注意:要创建可在其他计算机上运行的程序,首先创建一个项目,然后将该项目编译成组件,如可执行程序(Executable,用户可运行的程序)或DLL(可供其他程序和组件使用的组件)。编译过程将在第23章详细讨论。现在要记住的是,听到有人说“创建”或“编写”程序时,就像现在正在创建图片查看器程序一样,他们说的是包括将项目编译成可发布的文件的所有步骤及编译本身。

首次运行Visual Studio 2010时,IDE中包含很多窗口,如右边的“属性”窗口,它用于查看和设置对象的属性。除这些窗口外,IDE中还包含很多选项卡,如IDE左边竖直的“工具箱”选项卡(如图1.3所示)。现在尝试一下:单击“工具箱”选项卡以显示“工具箱”窗口(单击选项卡将显示相应的窗口);将鼠标指向选项卡几秒钟也将显示相应的窗口。要隐藏窗口,只需将鼠标从窗口中移走(如果将鼠标指向选项卡来显示窗口的话)或单击其他窗口。要完全关闭窗口,单击窗口标题栏中的“关闭”按钮。

注意:如果通过单击选项卡而不是将鼠标指向选项卡来打开工具箱,工具箱将不会自动关闭。它会一直打开,直到用户单击另一个窗口。

可以调整任何窗口的大小和位置,还可根据需要隐藏和显示它们。第2章将介绍如何设置设计环境。

警告:除非特别指出,否则不要在Visual Studio 2010设计环境中双击。在大部分对象上双击将产生与单击完全不同的结果。如果错误地双击了窗体中的对象(稍后将讨论),将打开“代码”窗口。代码窗口的顶部是一组选项卡:一个用于窗体设计,一个用于代码。单击用于窗体设计的选项卡,可隐藏“代码”窗口并返回窗体。

设计环境右边的“属性”窗口可能是IDE中最重要的窗口,也是最常用的。如果计算机屏幕分辨率设置为800×600,可能每次只能看到几个属性。这样,在创建项目时将难以查看和设置属性。由于篇幅的约束,本书屏幕截图的分辨率设置为800×600,但应该设置尽可能高的分辨率。用Visual Basic 开发应用程序时,推荐使用 1024×768或更高的分辨率,因为这样可看到更多的工作空间。要修改显示设置,可在桌面上单击鼠标右键并选择“属性”。但要记住,最终用户可能使用比开发时更低的分辨率。

在Visual Basic中,几乎所有您与之打交道的都是对象。例如,窗体是对象,可放在窗体中以构建用户界面的元素(如列表框和按钮)也是对象。有很多种对象,它们是根据类型进行分类的。例如,窗体是Form对象,而窗体上的元素为Control对象(控件),第3章将详细讨论对象。有些对象没有物理外观而只存在于代码中,本书后面将介绍这种对象。

警告:读者将发现,本书经常会提到后续章节介绍的内容。在出版界,这称为前向引用。出于某种原因,这常常导致有些读者失去信心。笔者这样做旨在让读者认识到,首次提到某个主题时,并不要求读者对其有全面认识,后面将更详细地介绍它。笔者将尽可能少地进行前向引用,但不幸的是,讲授编程并非完全的线性过程,有时必须提到读者还未完全掌握的主题。在这种情况下,笔者将通过前向引用让读者知道后面将更详细地介绍该主题。

每个对象都有一组特性,被称为属性,而不管对象是否有物理外观。属性定义了对象的特征;每个人都有一定的属性,如身高和头发颜色。Visual Basic对象也有属性,如高度(Height)和背景颜色(BackColor)。创建新对象时,首先需要设置其属性,使对象按预期的显示和工作。要显示对象的属性,在对象的设计器(IDE的主要工作区域)中单击对象即可。

单击默认窗体的任意地方,看“属性”窗口中是否显示了它的属性。在“属性”窗口的下拉列表中将包含窗体的名称:Form1 System.Windows.Forms.Form,其中Form1是对象的名称,System.Windows.Forms.Form是对象的类型。

对于任何新对象,首先应设置的属性是Name(名称)。如果没有显示“属性”窗口,按F4键显示它。滚动到属性列表顶部,找到(Name)属性,如图1.4所示。如果Name属性没有列在最前面,表明“属性”窗口设置为按分类而不是按字母顺序显示属性。可单击属性网格上方的“字母顺序”按钮,使属性按字母顺序显示。

注意:建议将“属性”窗口设置为按字母顺序显示;这样将更容易找到我所说的属性。注意,Name属性总是在列表的开头,表示为(Name)。之所以用括号,是因为括号使属性处于列表的开头,因为按字母顺序排列时,符号在字母前面。

图1.4 添加新对象到项目中时,应首先修改Name属性

保存项目时,为项目及其文件选择名称和位置。用户创建对象时,Visual Basic将根据对象的类型为它指定唯一的通用名称。虽然这些名称可行,但它们的描述性不够,不实用。例如,Visual Basic将窗体命名为Form1,但项目有几十(甚至几百)个窗体的情况很常见,如果所有窗体都只能通过编号(Form2、Form3等)来区分,项目将很难管理和维护。

注意:用户实际使用的是form类(模板),它用于在运行时创建和显示窗体。在本章中,我简单地将它称为窗体,详情请参见第5章。

为更好地管理窗体,给每个窗体取一个描述性名称。Visual Basic允许用户在项目中新建窗体时对其进行命名。这里的默认窗体是Visual Basic创建的,因此用户没有机会给它命名。不仅要重命名窗体,还要重命名窗体文件。按如下步骤修改名称和文件名。

1.单击Name属性,将Form1改为ViewerForm。注意,这并没有改变窗体的文件名,文件名显示在“解决方案资源管理器”窗口(位于“属性”窗口上方)中。

2.右击“解决方案资源管理器”窗口(位于“属性”窗口上方)中的Form1.vb。

3.在弹出的菜单中选择“重命名”。

4.将Form1.vb改为ViewerForm.vb。

注意:这里使用后缀Form表示文件是一个form类。后缀是可选的,但它们在组织项目时很有帮助。

实际上,重命名文件时,窗体的Name属性将自动修改。在以后的示例中,将要求读者修改窗体文件名,这样Name属性将自动修改。这里让读者在“属性”窗口中修改Name属性,旨在说明该窗口的工作原理。

窗体的标题栏中显示的文本是Form1。这是因为创建窗体时,Visual Basic自动将窗体的标题栏设置为窗体的名称,而用户修改窗体名时它并不会改变。标题栏中的文本由窗体的Text属性决定,通过以下步骤修改标题文本。

1.单击窗体,使其属性显示在“属性”窗口中。

2.使用“属性”窗口中的滚动条找到Text属性。

3.将文本改为 Picture Viewer,再按回车键或单击其他属性,窗体标题栏中的文本将发生变化。

现在用户所做的修改还只保存在内存中;如果这时关闭计算机(不要这样做),将丢弃到目前为止所做的所有工作。要养成经常保存工作(将修改保存到硬盘中)的习惯。

单击工具栏中的“全部保存”按钮(一叠磁盘的图案),保存所做的工作。Visual Basic将打开“保存项目”对话框,如图 1.5 所示。文本框“名称”已填好,因为创建该项目时已对其命名。在“位置”文本框中指定要保存项目的位置,Visual Basic将在该路径下使用“名称”文本框中的值(这里是Picture Viewer)创建一个子文件夹。可使用默认路径,也可将其修改为所需的路径。可让Visual Basic创建一个解决方案文件夹,在这种情况下,Visual Basic将在该文件夹中创建解决方案文件,并创建一个子文件夹用于存储项目和实际文件。对大型项目而言,这是一个很方便的功能;但就现在而言没必要这样做,因此取消选中复选框“创建解决方案的目录”,再单击“保存”按钮保存项目。

图1.5 保存项目时,为项目及其文件选择名称和位置

使用过Windows的用户都熟悉图标———表示程序的小图片。图标最常出现在“开始”菜单中,位于其代表的程序名左边。在Visual Basic中,不但可以给程序指定图标,如果愿意,还可给程序中的每个窗体指定唯一的图标。

注意:下面的内容假定读者能够访问本书示例的源文件。这些文件可从http://www.samspublishing.com 下载。也可从笔者的网站 http://www.james foxall.com/books.aspx 下载这些文件并讨论本书。将示例源文件解压缩时,将为每章创建一个文件夹,每章的文件夹中有示例项目的子文件夹。在文件夹Hour 1\Picture Viewer中可找到该示例使用的图标。

读者并非一定要使用笔者为这个示例提供的图标;可以选择任意图标。如果没有可用的图标(或读者是有逆反心理的人),可跳过本节,这不会影响该示例的结果。

要为窗体指定图标,执行以下步骤。

1.在“属性”窗口中,单击Icon属性以选中它。

2.单击Icon属性后,该属性右边将出现一个带三个点的小按钮,单击该按钮。

3.使用弹出的“打开”对话框找到文件PictureViewer.ico或其他图标文件。找到图标后双击它,或单击选中它再单击“打开”按钮。

选好图标后,它将和单词 Icon 一起出现在 Icon 属性中,窗体的左上角也将出现该图标的缩小版本。当该窗体最小化时,Windows任务栏中显示的即为该图标。

接下来修改窗体的Width和Height属性。Width和Height的值都显示在Size属性下;Width在逗号的左边,Height在右边。可修改Size属性中的数字来修改Width或Height属性。这两个值都以像素为单位,也就是说,Size属性为“200, 350”的窗体为 200像素宽、350像素高。要分别显示和调整Width和Height,可单击Size旁边的小加号,如图1.6所示(单击加号后,它将变成减号)。

图1.6 有些属性可展开以显示更具体的属性

注意:像素是计算机显示的度量单位,是屏幕上可见的最小“点”。显示器的分辨率总是用像素表示,如800像素×600像素或1024像素×768像素。将属性增大或降低1像素是可做的最小可视化修改。

在属性名对应的文本框中输入数值,将Width属性改为400、Height属性改为325。要提交所做的修改,可按Tab键或回车键,也可单击其他属性或窗口。屏幕如图1.7所示。

图1.7 “属性”窗口中所做的修改在提交后将马上反映出来

注意:也可通过拖曳窗体的边框来改变它的大小,这将在第2章介绍;属性也可通过代码来修改,这将在第5章介绍。

现在,选择菜单“文件”>“全部保存”或单击工具栏中的“全部保存”按钮(一叠磁盘的图案)以保存项目。

设置窗体的初始属性后,现在通过在窗体中添加对象来创建用户界面。可置于窗体中的对象被称为控件。有些控件有可见的界面,用户可与之进行交互,而另外一些控件对用户总是不可见的。本示例将使用这两种控件。屏幕的左边是标题为“工具箱”的竖直选项卡,单击“工具箱”选项卡显示“工具箱”窗口以显示最常用的控件;如果有必要,单击“公共控件”,如图1.8所示。工具箱包含可用于项目中的所有控件,如标签(Label)和文本框。

图1.8 “工具箱”用于选择构建用户界面的控件

添加控件到窗体后,如果鼠标指针不在工具箱上,“工具箱”将立即关闭。为使工具箱保持可见,可单击“工具箱”标题栏中的图钉图标。

现在不要求您添加控件,但图片查看器界面将包含以下控件。

两个Button控件:在很多Windows程序中可单击的标准按钮。

一个PictureBox控件:用于向用户显示图像的控件。

一个OpenFileDialog控件:执行Windows“打开文件”对话框功能的隐藏控件。

通常,使界面能执行一定功能的最佳方法是,先设计用户界面,然后添加代码。下面几个小节将创建界面。

首先将一个Button控件添加到窗体中。为此,双击“工具箱”中的Button控件。Visual Basic将创建一个新按钮,并将其放在窗体的左上角,如图1.9所示。

图1.9 双击“工具箱”中的控件时,该控件将添加到窗体的左上角

使用“属性”窗口,按如下设置按钮的属性(译者注:在Visual Basic 2010中文版中,默认字体为 9点的宋体,需要扩大按钮才能容纳下“Select Picture”)。记住,按字母顺序查看属性时,Name属性列在最前面,因此不必再在列表中搜寻。

现在创建一个这样的按钮,即用户可通过单击它来关闭图片查看器程序。虽然可通过双击“工具箱”中的Button控件,再添加一个按钮,但这次将通过复制已创建的按钮来添加一个按钮到窗体中。这让您很容易创建这样的按钮,即其大小和其他属性与所复制的按钮相同。

为此,右击“Select Picture”按钮并从弹出的菜单中选择“复制”命令。接下来,在窗体的任意处右击并从窗体的快捷菜单中选择“粘贴”(也可使用键盘Ctrl+C组合键进行复制,用Ctrl+V组合键进行粘贴)命令。新按钮出现在窗体中央,且默认被选中。注意到其所有属性几乎都与原按钮相同,但名称已重新设置。按如下修改新按钮的属性。

最后需要添加到窗体中的可见控件是一个PictureBox控件。PictureBox有很多功能,但其主要的用途是显示图片,这正是本示例要使用的功能。双击“工具箱”中的 PictureBox,将一个PictureBox控件添加到窗体中,然后按如下设置它的属性。

修改属性后,窗体应如图1.10所示。单击工具栏的“全部保存”按钮来保存所做的工作。

图1.10 有用的用户界面不一定要很复杂

到目前为止,所用的控件都放在窗体中,且在应用程序运行时有物理外观。然而,并不是所有控件都有物理外观,这样的控件称为不可见控件(或运行时不可见的控件)。它们不是为直接的用户交互而设计的,而是为程序员设计的,其功能超出了Visual Basic的标准特性。

为让用户选择要显示的图片,需要让用户能够在其硬盘上查找文件。读者可能已经注意到,在每个Windows程序中打开文件时,显示的对话框几乎都一样。要求每个开发人员为标准文件操作编写代码是没有意义的,因此Microsoft通过控件提供了这样的功能,程序员可在项目中使用它。这个控件名为OpenFileDialog控件,可为开发人员节省大量时间,避免为实现该功能而反复编程。

注意:除OpenFileDialog控件外,还有其他控件也提供文件操作功能。例如, SaveFileDialog控件让用户能够指定文件名和路径以保存文件。

现在显示“工具箱”,使用“工具箱”底部的向下箭头来滚动列表,找到OpenFileDialog控件(它在“对话框”分类中),然后双击它,将它添加到窗体中。注意,该控件并不放在窗体中,而是出现在窗体下方的特定位置,如图1.11所示。这是因为OpenFileDialog控件并没有窗体界面可显示给用户。它在有必要时可显示界面(对话框),但它本身并不直接显示在窗体上。

图1.11没有界面的控件显示在窗体设计器下方

选中OpenFileDialog控件,按如下修改其属性。

警告:不要将FileName属性设置为“使其为空”,笔者的意思是将该属性的默认值删除,使其为空。

Filter属性用于限制(过滤)要在“打开文件”对话框中显示的文件类型。过滤器的格式为:描述|过滤器。在管道符号(“|”)前的文本是对文件类型的描述,管道符号后面的文本是用于过滤文件的格式。可再通过管道符号来分割每个“描述|过滤器”,以指定多个过滤类型。在Title属性中输入的文本将出现在“打开文件”对话框的标题栏中。

图片查看器程序的图形界面现在已经完成了。如果单击了“工具箱”中的图钉图标使其一直显示,现在可单击它以关闭“工具箱”。单击工具栏中的“全部保存”按钮保存所做的工作。

为使程序能够执行操作和响应用户交互,必须为程序编写代码。Visual Basic是一种事件驱动的语言,这意味着代码将响应事件而执行。事件可能来自用户,如用户单击按钮触发其Click事件;也可能来自Windows本身(对事件的完整解释请参见第4章)。目前,该应用程序看起来不错,但并不能做任何事情。用户单击Select Picture按钮直到患上腕管综合症,也不会有什么事情发生,因为没有告诉程序当用户单击按钮时要做什么。现在按 F5 键来运行项目,便可以看到这一点。可以单击按钮,但它们不会做任何事情。完成后,关闭窗口返回设计模式。

下面编写代码来实现两项任务。首先,编写代码让用户浏览其硬盘来查找和选择图片文件,然后将文件显示在图片框中(这听起来比实际难得多)。其次,为 Quit 按钮添加代码,使得用户单击该按钮时关闭程序。

要编写的第一段代码允许用户浏览其硬盘,选择一个图片文件,然后在PictureBox控件中查看选择的图片。这段代码在用户单击Select Picture按钮时执行,因此,它应添加到该按钮的Click事件中。

在设计视图中双击窗体中的控件时,该控件的默认事件将显示在代码窗口中。Button控件的默认事件是Click事件,这是因为单击是用户对按钮执行的最常见操作。现在,双击Select Picture按钮,在代码窗口中访问它的Click事件,如图1.12所示。

图1.12 将在这样的窗口中编写所有的代码

您访问事件时,Visual Basic将创建一个事件处理程序,事件处理程序本质上是一个模板过程,可在其中加入事件发生时要执行的代码。鼠标已放在代码过程中,因此,您所要做的便是添加代码。阅读完本书时,读者可以任意添加自己的代码,使应用程序按照您的意愿执行——大部分时候是这样的。现在,只需输入下面列出的代码。

养成为代码添加注释的习惯很重要。因此,读者要输入的第一条语句是一条注释。以撇号打头的语句表示这是注释;编译器不会处理这样的语句,因此可在撇号后输入任意文本。输入如下文本,然后按回车键:

' Show the open file dialog box.

要输入的下一语句触发窗体中OpenFileDialog控件的一个方法。可将方法理解为一种使控件执行某项功能的机制。ShowDialog()方法命令控件显示其“打开文件”对话框,让用户选择文件。ShowDialog()方法返回一个值,指明操作成功与否,然后可将这个值与预定义的结果(DialogResult.OK)进行比较。这时不必关心发生了什么;本书后面将介绍所有这些细节,本章旨在让读者在实践中学习。简单地说,ShowDialog()方法被调用,让用户浏览文件。如果用户选择了文件,将执行更多代码。当然,使用“打开文件”对话框比这个简单的示例中能做的更多,但这条简单的语句足以完成任务。输入下面的语句,并在行尾按回车键(不用担心大小写,Visaul Basic将为您更改大小写):

If ofdSelectpicture.ShowDialog = DialogResult.OK Then

注意:用户输入以 If打头的语句并按回车键后,Visual Basic将自动创建End If语句。如果用户再输入End If语句,将出现两条End If语句,导致代码无法运行。在这种情况下,应删除一条End If语句。第 13章将全面而详细地介绍If语句。

接下来是另一条注释。当前光标位于以 If打头的语句和End If语句之间,输入下面这一条语句,并在行尾按回车键:

' Load the picture into the picture box.

提示:无需按Tab键或使用空格来缩进代码,Visual Basic将自动缩进代码。

下面这条语句位于 If结构中(If语句和End If语句之间),它是真正将图片显示在图片框中的代码。

输入下面的语句:

picShowPicture.Image = Image.FromFile(ofdSelectPicture.Filename)

除显示选定的图片外,应用程序还在标题栏中显示图片的路径和文件名。创建窗体时,您使用“属性”窗口修改窗体的Text属性。要创建动态的应用程序,需要在运行时不断地调整属性,而这是使用代码实现的。插入下面两条语句(在每行行尾按回车键):

' Show the name of the file in the form's caption.

Me.Text = "Picture Viewer(" & ofdselectpicture.FileName & ")"

输入所有代码后,编辑器应如图1.13所示。

图1.13 确保代码和这里显示的完全一致

最后一小段代码是在用户单击Quit按钮时终止程序。为此,需要访问btnQuit按钮的Click事件处理程序。在代码窗口的顶部有两个选项卡。当前选项卡名为ViewerForm.vb*。这个选项卡包含文件名为 ViewerForm.vb 的窗体的代码窗口;另一个选项卡名为 ViewerForm.vb[设计]*,单击该选项卡将从代码视图切换到窗体设计器。如果单击该选项卡时发生错误,表明输入的代码有错误,需要将其编辑成与图 1.13 所示一致。窗体设计器出现后,双击 Quit 按钮来访问其Click事件。

在Quit按钮的Click事件处理程序中输入下列代码,在每行语句末尾按回车键:

' Close the window and exit the application

Me.Close()

注意:Me.Close()语句关闭当前窗体。当程序中最后一个加载的窗体被关闭后,应用程序将完全终止自身的运行。创建更健壮的应用程序时,可能要在终止应用程序前执行各种清理工作,但在这个示例中,只需直接关闭窗体。

现在应用程序完成了。单击工具栏中的“全部保存”按钮(一叠磁盘的图案),然后按F5键运行。也可单击工具栏中右侧的三角形按钮来运行程序,这个按钮类似于DVD播放器中的“播放”按钮,它称为“启动调试”,也可在“调试”菜单中找到。学习键盘快捷键能够加快开发过程,因此推荐在开发时尽量使用快捷键。

运行程序时,Visual Basic界面会改变,您设计的窗体将浮动在设计环境上,如图 1.14所示。

图1.14 在运行模式下,应用程序像在最终用户的计算机上一样运行

这时程序就像一个独立的程序运行于其他用户的机器上一样;您看到的正是用户运行程序(当然是没有Visual Studio 2010设计环境)时所能看到的。单击Select Picture按钮来显示Select Picture对话框,如图 1.15所示。使用该对话框来查找图片文件。找到文件后双击,或单击选中它,然后单击“打开”按钮。选中的图片将显示在图片框中,如图1.16所示。

注意:单击Select Picture按钮时,显示的默认路径取决于最后一次选择的路径,因此可能与图1.15所示的不同。

图1.15 OpenFileDialog控件处理查找文件的所有细节

图1.16 有什么比 1964 年的Fender Super Reverb音箱更漂亮呢?

注意:如果要从数码相机中选择并显示图片,很可能图片的格式是 JPEG,因此需要从“文件类型”下拉列表中选择这种格式。另外,如果图像很大,将只能看到图像的左上角(大小为图片框的大小)。后面将介绍如何调整图像大小来适应图片框的大小,甚至调整窗体大小来显示完整的大图片。

运行程序后,单击Quit按钮返回设计视图。

就这么简单!您刚创建了一个真正的Visual Basic程序。您使用工具箱来创建让用户能够与程序进行交互的界面,并在事件处理程序中编写代码,使程序可以执行一定的功能。这些是使用 Visual Basic开发应用程序的基本技能。甚至最复杂的程序也是使用这些基本方法创建的;创建界面,然后增加代码使程序可以执行。当然,编写正确的代码来实现所要的功能可能很复杂,但现在您已经踏上进程了。

如果仔细看看本书的课程安排,将发现我首先介绍Visual Basic(Visual Studio .NET)环境,接着介绍如何创建界面,然后是如何编写代码。这种安排是有意的。刚开始编写代码时读者可能会有点不安,但编程只是工作的一部分———不要忘记“Visual Basic”中的“Visual”。完成这24章课程后,读者将为程序开发打下坚实的基础。

很快,您将不再需要幕后教您的人了———您自己就是这样的人。

问:是否可显示除BMP和JPG外的其他类型的图片?

答:可以。PictureBox可以显示扩展名为BMP、JPG、ICO、EMF、WMF和GIF的图像。PictureBox甚至可用它支持的任意一种文件类型将图像保存到文件中。

问:是否能够用其他控件来显示图片?

答:PictureBox 是只显示图像时所用的控件。但是,还有很多其他控件允许您将图片作为控件的一部分来显示。例如,可通过将按钮的Image属性设置为一个有效的图片,在按钮控件中显示它。

1.哪种Visual Basic项目创建标准的Windows程序?

2.IDE中的哪个窗口用于修改窗体或控件的属性(位置和大小等)?

3.如何访问控件的默认事件(代码)?

4.应设置图片框的哪个属性来显示图像?

5.按钮控件的默认事件是什么?

1.Windows窗体应用程序。

2.“属性”窗口。

3.双击设计器中的控件。

4.Image属性。

5.Click事件。

1.修改图片查看器程序,使用户也能查找和选择GIF文件(提示:修改OpenFileDialog控件的Filter属性)。

2.创建一个新项目,并添加两个按钮,让它们垂直排列。然后调整它们的位置,使其水平排列。

第5章 创建窗体:基础知识

第6章 创建窗体:高级技能

第7章 使用传统控件

第8章 使用高级控件

第9章 给窗体添加菜单和工具栏

在本章中,读者将学习:

将控件添加到窗体中;

调整控件的位置、大小和间距以及对齐和锚定控件;

创建智能的Tab顺序;

调整控件的z-顺序;

创建总是在最前面的窗体;

创建透明窗体;

创建多文档界面。

窗体就像一块画布,虽然可以设置窗体的属性来定制它,但还需要添加控件来执行功能。在前一章,读者学习了如何将窗体添加到项目中、设置窗体的基本属性以及显示和隐藏窗体。在本章,读者将学习如何将控件添加到窗体中,包括排列和对齐控件,以创建美观和有用的界面;还将学习如何创建高级的多文档界面(Multiple Document Interface,MDI),就像Photoshop等应用程序所使用的那样。学习本章的内容后,读者将能够学习Visual Basic中各种控件的细节。

控件是放在窗体中供用户交互的对象。如果读者完成了前几章的示例,则已经为窗体添加过控件。然而,下面将把很多控件添加到窗体中,理解这个过程的各个方面很重要。

所有可添加到窗体中的控件都位于工具箱中。默认情况下,工具箱停靠在设计环境的左边。如果只是偶尔将控件添加到窗体中,这个位置很方便;然而,如果要执行大量的窗体设计工作,最好将它停靠在设计环境的右边,这样它就不会覆盖当前的工作窗体。

注意:要让工具箱不再停靠并移到其他位置,必须确保它没有被设置为自动隐藏。

工具箱中有可以展开和折叠的分类标题。在大多数设计中,使用的都是“公共控件”中的控件。然而,随着技能的提高,可能需要使用其他分类中更复杂和专用的控件。

在窗体中添加控件有4种方法,读者学习了其中一种,即复制控件并将其粘贴到窗体中,而本章将使用其他3种方法。打开前一章创建的Picture Viewer项目(或打开我的网站提供的起始项目),然后在“解决方案资源管理器”中双击OptionsForm.vb,在设计器中显示Options窗体。

1.在工具箱中双击来添加控件

添加控件的最简单方法是在工具箱中双击控件。现在试一下:显示工具箱,并双击TextBox工具。Visual Basic将在窗体的左上角创建一个新的文本框(必须将鼠标移出工具箱使工具箱关闭,才能看到新添加的控件)。用户双击工具箱中的控件(运行时不可见的控件除外)时,Visual Basic 在当前获得焦点的控件上创建新控件,其大小是添加的控件类型的默认大小。如果窗体上没有其他控件,新控件将放在左上角。将控件添加到窗体中后,可以任意地移动或调整其大小。

2.通过从工具箱中拖曳来添加控件

如果要控制新控件的放置位置,可以将控件拖到窗体中。现在试一下:显示工具箱,单击Button控件,将它拖到窗体中。当鼠标大概位于希望的位置时,松开鼠标按钮。

3.通过绘制来添加控件

将控件放到窗体中的最后一种也是最精确的方法是,在窗体上绘制控件。执行下列步骤。

1.显示工具箱,并单击ListBox工具选中它。

2.将鼠标移到希望列表框左上角出现的位置,然后单击并按住鼠标。

3.拖曳鼠标到希望列表框右下角出现的位置,然后松开鼠标按钮。

这样,创建的列表框将与绘制的矩形重叠。这是将控件添加到窗体中的最精确方法。

提示:如果读者喜欢通过单击并拖曳鼠标来绘制控件,强烈建议使工具箱浮动或将其停靠在设计环境的右边或下边。如果将工具箱停靠在左边,将干扰控件的绘制,因为它覆盖了窗体的很大一部分。

注意,每个工具分类中的第一项都是“指针”。指针实际上并非控件。当“指针”项被选中时,设计环境处于选择模式而不是可创建新控件的模式。当“指针”被选中时,可在设计器中单击控件以选中它并查看其属性。这是开发环境的默认行为。

将控件添加到窗体中很容易;难的是如何排列控件以创建直观和吸引人的界面。可创建的界面是无穷无尽的,因此这里不介绍如何设计特定的界面(但强烈建议创建外观和行为与类似的商业应用程序接近的窗体)。然而,将介绍如何移动和排列控件以及调整其大小的技巧,使它们按希望的那样显示。掌握这些技巧后,就能更高效地创建界面,将节省的时间用于编写代码。

1.使用网格(大小和对齐)

读者可能已经注意到,到现在为止,读者使用的控件似乎都自动对齐到看不见的网格———没错,确实如此。在启用了网格的项目中,在窗体上绘制或移动控件时,控件将自动与最近的网格对齐。这使得调整控件的大小和位置更精确。实际上,我经常发现网格的作用有限,因为希望的大小和位置通常与网格的位置不符。然而,可以控制网格的粒度和可见性,建议对两者都进行控制。

在Visual Basic 2010中,网格设置是全局的:不能分别为项目或窗体设置网格。要显示网格设置,选择菜单“工具”>“选项”,打开“选项”对话框,然后单击左侧目录树中的“Window窗体设计器”以显示设计器设置,如图6.1所示。

图6.1 网格设置在 Visual Basic 2010中是全局的

这里我们感兴趣的设置如下。

GridSize:这决定了网格在水平方向和垂直方向上的粒度,单位为像素。更小的网格意味着可以更细致地控制控件的大小和位置。

LayoutMode:这决定了设计器将用户移动的控件对齐到网格还是其他控件。

ShowGrid:这决定了在设计器的窗体上是否显示网格点。

SnapToGrid:这决定了是否使用网格。如果设置为False,网格大小设置将被忽略,控件将不会自动与网格对齐。

当前,读者没有使用网格来绘制控件,但在移动控件时使用了对齐线,因为LayoutMode设置为 SnapLines。本节稍后将更详细介绍这一点。现在要介绍网格的工作原理,请将LayoutMode设置为SnapToGrid。

下面为网格指定更细的粒度(网格点之间的间距更小)。这有助于设计,因为边缘不容易对齐到不希望的位置。

要调整网格的粒度,可修改GridSize的设置。将网格的Width和Height设置得越小,网格就越精确,用户就能够更细致地控制大小和位置;反过来,使用的值越大,网格就越粗糙,用户的控制能力就越小。使用较大的网格时,控件边缘更容易与网格对齐,用户更难细致地控制控件的大小或位置。执行下列步骤。

1.将GridSize属性改为6,6。

2.将ShowGrid属性改为True。

3.单击“确定”按钮保存修改,并返回窗体设计器。注意到现在出现了网格点,如图6.2所示。如果没有出现网格点,需要先关闭设计器中的选项卡,然后双击“解决方案资源管理器”中的OptionsForm.vb进行刷新。

图6.2 网格不一定要可见才是活动的

试着拖曳窗体中的控件,或者拖曳它们的边缘以调整大小。注意到使用更细的网格将能够更好地控制位置。将GridSize改为一组更高的值,如25,25,再看看此时的情况。完成后,将GridSize值改回为4,4。

不幸的是,小网格有一个副作用,那就是网格可能分散注意力。读者可以决定最喜欢的方式,但通常我都关闭窗体上的网格。事实上,我更喜欢下面将讨论的新特性“Snap To Line”。

注意: ShowGrid属性只决定是否显示网格,而不决定它是否处于活动状态;网格是否活动由窗体的SnapToGrid属性决定。

2.使用对齐线(snap line)

“对齐线”是一种有用的新布局模式。现在执行下列步骤,让Visual Basic 2010使用“对齐线”。

1.选择菜单“工具”>“选项”,打开“选项”对话框。

2.单击“Window窗体设计器”以显示布局设置。

3.将LayoutMode改为SnapLines。

4.将ShowGrid属性设置为False以隐藏网格。

5.单击“确定”保存设置。

对齐线使控件边缘和其他控件的边缘对齐,帮助用户更快地创建更好的界面。要掌握它,最好的方法是使用。执行下列步骤。

1.拖曳控件,使它们大概处于图6.3所示的位置。

2.单击ListBox选中它。

3.单击控件左边缘上的白色正方形,将它向左拖曳。当其边缘靠近上面按钮的竖直边缘时,将出现对齐线,且边缘将与该线对齐,如图6.4所示。

图6.3 从这种布局开始

图6.4 对齐线使对齐控件边缘更容易

可以继续拖曳控件边缘,当其垂直与其他控件对齐时,Visual Basic将创建更多的对齐线。控件也支持水平对齐线,拖曳控件时所有对齐线都管用。当前,这种特性对读者来说可能微不足道,但它的确是Visual Basic增加的一项重要功能,将为您节省很多时间。

3.选择一组控件

随着技能的提高,读者创建的窗体将越来越复杂。有些窗体可能包含几十个甚至几百个控件。Visual Basic提供了使得可以很容易地对齐一组控件的功能。

默认情况下,单击窗体上的控件将选中它,同时取消选中原来选中的控件。要对多个控件进行操作,需要选中一组控件。这有两种方法。第一种方法使用选框。要选择一组控件,首先在窗体的任何位置单击并拖曳鼠标,这时窗体上将出现一个矩形。松开鼠标后,与矩形交叉的所有控件都将被选中。注意,不必使用选框将整个控件都包围起来,只需与控件部分交叉就能选中它。下面试一下:在窗体的左下角单击,然后将鼠标拖向窗体的右上角。交叉或包围除OK按钮外的所有控件,如图6.5所示。当矩形包围或交叉所有控件后,松开鼠标按钮,这些控件将被选中,如图6.6所示。

图6.5 单击并拖曳来创建选框

图6.6 所有选中的控件都有虚线边框和大小调整手柄

控件被选中时,将有虚线边框和几个大小调整手柄(位于虚线边框的四个角和四边中央的正方形)。注意这些大小调整手柄。在被选中的控件组中,大小调整手柄为白色的控件是活动控件。使用Visual Basic工具(如对齐和格式工具)对一组控件进行操作时,将使用活动控件的值。例如,如果将图6.6所示的选中控件左对齐,每个控件的Left属性值都将设置为活动控件(带白色手柄的控件)的Left属性值。实际上,使用选框选择一组控件时,用户并不能控制Visual Basic将选择哪个控件作为活动控件。在这里,希望所有控件都与按钮对齐,因此必须采用另一种选择控件的方法。现在,在窗体的任何位置单击(不要单击控件),取消选中所有控件。

注意:并非所有的大小调整手柄都是可移动的。例如,Visual Basic不允许修改文本框的高度,除非将文本框的Multiline属性设置为True,因此,当文本框控件被选中时,只有左右两边会出现白色的大小调整手柄。

选择多个控件的第二种方法是,在单击控件时按住Shift键或Ctrl键(两者的效果相同)。这类似于在资源管理器中选择多个文件。执行下列步骤。

1.单击列表框选中它。只有一个控件被选中时,它将被视为活动控件。

2.按住Shift键并单击左上角的文本框;现在列表框和文本框都被选中。列表框是活动控件,因为最先被选中。同样,选中多个控件后,活动控件有白色的大小调整手柄,以便用户识别。

3.按住Shift键,单击按钮控件(不是OK按钮),将它添加到选中的控件组中。现在,所有控件都选中,列表框仍是活动控件。

注意:按住Shift键并单击选中的控件,将取消选中该控件。

必要时可以结合使用这两种选择方法。例如,首先使用选框选中所有控件。如果选中了不想选中的控件,只要按住Shift键并单击该控件,就可以取消选中它。

提示:如果必须单击相同的控件两次,如取消选中然后重新选中,这时速度要慢。如果单击的速度太快,Visual Basic会将您的动作解释为双击,进而为控件创建一个新的事件处理程序。

4.对齐控件

Visual Basic包含很多格式工具,可用于设计美观的界面,它们大多数都在图 6.7所示的布局工具栏中。现在,右击 Visual Basic顶部的工具栏,并在弹出菜单中选择“布局”以显示布局工具栏。布局工具栏包含水平和垂直对齐控件边缘或中心的选项。

图6.7 布局工具栏可使对齐控件简单快捷

将鼠标在布局工具栏上自左向右缓慢地移动,可查看工具提示。使用布局工具栏,可以:

使选中的控件左对齐、居中对齐或右对齐;

使选中的控件顶部对齐、中间对齐或底部对齐;

使选中的控件等宽或等高;

使选中的控件在水平方向或垂直方向的间距相等;

将选中的控件的前移或后移;

为控件设置Tab顺序,以方便使用键盘导航。

第一项将选中的控件与网格对齐———不是很有趣。然而,其余的按钮都很有用。记住, Visual Basic基于活动控件来对齐控件,这很重要。现在,单击“顶端对齐”按钮,可以看到选中的控件都与活动控件对齐了,如图6.8所示。

图6.8 基于活动控件来对齐选中的控件

5.使控件的大小相同

除对齐控件外,还可使所有选中控件的大小都相同———高度、宽度或两者。为此,可使用工具栏上的“使大小相同”按钮。现在,单击“使大小相同”按钮使所有控件大小相同。这样,所有选中控件的大小都与列表框的大小相同(相当大)。现在试一下:在“属性”窗口的Size属性中输入“75,25”,然后按Tab键提交输入。注意到这种修改影响了所有选中的控件。像这样用“属性”窗口来影响所有选中的控件,能够快速地修改很多需要使用相同属性值的控件。稍后将更详细地介绍这一点。

6.使一组控件的间距相等

正如很多销售人员说的,“…不仅仅是这些”。使用布局工具栏,还可使控件的间距相等。现在试一下:单击工具栏中的“使水平间距相等”,所有控件将均匀分布。接下来,单击工具栏中的“减少水平间距”按钮几次,注意到每次单击时控件的间距都将缩小。使用布局工具栏上的按钮,还可以增大控件的水平间距或垂直间距,或完全删除控件间的间距。现在单击工具栏上的“全部保存”按钮来保存项目。

7.为一组控件设置属性值

下面是很多有经验的Visual Basic开发人员可能忽略的一个技巧:选中多个控件后,可在“属性”窗口中修改属性值。这使得所有选中控件的对应属性都将发生改变。

确保3个控件仍被选中并显示“属性”窗口(如果它还没有显示)。选中一组控件后,“属性”窗口看起来有点不同,如图6.9所示。

没有显示Name属性。这是因为不允许两个控件的名称相同,因此Visual Basic不允许用户输入该属性值。

只显示了所有控件都有的属性。因为选中不同类型的控件后,只有一小部分相同的属性可以访问。如果选中了相同类型的控件,将看到更多的属性。

对于选中控件具有不同值的属性(如这里的Location),该该属性为空。

图6.9 可同时查看多个控件的属性值

如果在属性中输入值,将修改所有选中控件的对应属性。为理解这一点,将 BackColor属性改为黄色,可以看到,所有控件的BackColor属性都变成了黄色。

在本章中,实际上并会不使用这3个控件,因此现在按Delete键将选中的控件删除。

8.锚定控件和自动调整控件的大小

在Visual Basic 新窗体引擎的功能中,我最喜欢的是能够将控件锚定到窗体的一边或多边,以及当用户调整窗体的大小时控件能够自动地调整其大小。以前,必须使用第三方组件(通常很麻烦)或通过在窗体的Resize事件中编写代码来实现这一点,但在Visual Basic 2010的窗体引擎中,这是一项内置的功能。

所有新控件默认的行为是停靠在其容器的左上角。如果希望控件总是显示在窗体的右上角或左下角,该如何办呢?下面介绍如何锚定控件使其在窗体被调整大小时相应地自动进行调整。

执行下列步骤。

1.双击“解决方案资源管理器”窗口中的ViewerForm.vb,这是接下来要修改的窗体。

2.按F5键运行项目。

3.拖曳窗体的右下角放大窗体。注意到控件并没有随着窗体的边缘移动,如图6.10所示。

图6.10 默认情况下,控件锚定在窗体的左上角

4.现在,选择菜单“调试”>“停止调试”终止项目的运行。

5.单击Select Picture按钮选中它,同时取消对窗体的选中。

6.按住Shift键并单击下列按钮:Quit、Draw Border、Options、^和 v。

7.单击“属性”窗口中的 Anchor 属性,然后单击出现的下拉箭头,打开 Anchor 属性特有的下拉框,如图6.11所示。

图6.11 可通过这个独特的下拉框设置控件的Anchor属性

下拉框中央的灰色矩形表示正在设置其属性的控件。上下左右四个瘦长的矩形表示控件可停靠的边;如果矩形被填充,表示控件的边缘已停靠在窗体的这个边缘。执行下列步骤,观察Anchor属性是如何工作的。

1.单击控件左边的矩形,使它变为未填充的,然后单击控件右边的矩形使它变为填充的,如图6.12所示。

图6.12 这种设置将使控件锚定到窗体的顶部和右边

2.单击其他任何属性来关闭该下拉框。Anchor属性的值现在应为“Top,Right”。

3.按F5键运行程序,然后拖曳窗体的一边将其放大。

是不是相当有趣?Visual Basic已经将按钮的右边锚定到窗体的右边,如图6.13所示。实际上,锚定指的是确保控件边缘与窗体边缘的相对距离为常量,这是构建界面的一个极其强大的工具。

图6.13 锚定是一种用于创建自适应窗体的有用功能

注意到,当窗体调整大小时,图片框和坐标标签仍保持原来的位置。这不成问题,也可用Anchor属性来解决。执行下列步骤修改X和Y标签的锚定属性(如果没有停止运行项目,先停止它)。

1.单击X标签选中它。

2.按住Shift键并单击Y标签选中它。

3.与设置按钮一样地设置Anchor属性———取消选中左边,并选中右边(如图6.12所示)。

4.单击其他属性来关闭Anchor属性的下拉框。

图片框与其他控件有点不同,除要锚定它的顶部和左边外,还要锚定它的右边和底部使它能够随窗体放大或缩小。这其实很容易实现。执行下列步骤。

1.单击图片框选中它。

2.打开 Anchor 属性,选中 4 个锚定点(所有 4 个矩形都应以灰色填充,如图 6.14所示)。

图6.14 这种设置使控件随窗体的四边而调整

现在按 F5 键运行项目,拖曳窗体的右下角使它放大。注意到图片框将调整其大小以适应窗体的大小,如图6.15所示。这在查看大图像时很有用。

图6.15 适当地使用Anchor属性可创建灵活的窗体

知道如何使用 Anchor 属性后,不需编写代码就可构建用户可以调整大小的窗体。需要注意的是,当窗体缩到很小时控件可能消失,这取决于Anchor属性的设置。

即使是熟练的Visual Basic编程人员也经常忽略Tab顺序。作为用户,您可能很熟悉Ta b顺序,但可能没有意识到它。在窗体上按Ta b键时,焦点将从当前控件移到Ta b顺序中的下一个控件。这让用户能够快捷地使用键盘导航窗体。控件的 Tab 顺序由 TabIndex属性决定。TabIndex 值为 0 的控件是窗体显示时获得焦点的控件;按 Tab 键,TabIndex值为 1的控件将获得焦点,依此类推。添加控件到窗体中时,Visual Basic为新控件分配下一个可用的TabIndex值(在Tab顺序的最后)。每个控件都有唯一的TabIndex值,TabIndex值总是使用升序。

如果窗体的Tab顺序设置不正确,按Tab键将导致焦点以意外的顺序从一个控件跳到另一个控件,这将给用户带来不便。以前,修改控件的Tab顺序的唯一方法是,通过“属性”窗口来修改TabIndex属性。例如,要使控件成为Tab顺序中的第一个控件,应将其TabIndex属性设置为 0;Visual Basic会相应地调整其他所有控件的TabIndex值。这通常是一个痛苦的过程。虽然手工设置TabIndex属性很方便,如在已有的Tab序列中插入一个控件时,但还有一种更好的方法来设置窗体的Tab顺序。

现在按F5键来运行项目,注意到Select Picture按钮获得了焦点(以蓝色边框加亮)。如果按回车键,将相当于单击该按钮,因为它获得了焦点。现在按Tab键,则Quit按钮将获得焦点,这是因为您在添加 Select Picture按钮后添加了Quit按钮。再按 Tab键,您是否以为Draw Border按钮将获得焦点呢?用户也会这样以为。然而,获得焦点的是^按钮,因为它是下一个添加到窗体中的控件。下面修正这种错误,请单击工具栏中的“停止调试”按钮或关闭该窗口以停止运行项目。

下面通过Visual Basic提供的可视化方法来设置窗体的Tab顺序。

1.布局工具栏上的最后一个按钮是“Tab键顺序”按钮。单击它,Visual Basic将在控件上显示一组数字,如图 6.16 所示。控件上的数字表示它的 TabIndex 属性值,很明显 Tab顺序是错误的。

图6.16 每个控件上的数字表 示 该 控 件 的TabIndex值

2.单击 Select Picture按钮,数字的背景从蓝色变为白色,表示这个控件被选中。如果这个控件的TabIndex值不为0,单击它时这个数字将变为0。

3.单击Quit按钮,将它指定为Tab顺序的下一个按钮。

4.现在,Draw Border按钮的Tab顺序是 5。单击它,它上面的数字将变为 2。

5.按下列顺序单击其余控件:X标签、Y标签、Options按钮、^按钮和v按钮。

6.单击最后一个按钮时,所有数字都变回蓝色背景;现在Tab顺序已经设置好。单击布局工具栏上的“Tab键顺序”按钮,使设计器退出Tab顺序模式。

7.按F5键运行项目,可以看到按Tab键时焦点的移动是合理的。

提示:可在程序代码中调用控件或窗体的 SelectNextControl()方法,使焦点按Tab顺序移动。

要将控件从Tab顺序中删除,将其TabStop属性设置为False。控件的TabStop属性设置为 False 时,用户仍可用鼠标选中该控件,但使用 Tab 键不能进入该控件。应合理地设置该控件的TabIndex属性,以便控件获得焦点(如被单击)时,按Tab键将使焦点移到下一个合理的控件中。

Tab顺序和对齐是有效地在窗体上放置控件的重要因素。然而,它们只是在二维空间(x轴和y轴)内解决了控件的排列。有时需要让控件重叠,虽然这样的情况很少。两个控件重叠时,最后添加到窗体上的控件显示在上面。可使用布局工具栏右边的“置于顶层”和“置于底层”按钮来控制控件的堆叠顺序。

提示:使用代码调用控件的BringToFront()和BringToBack()方法,可将控件前移或后移。

读者可能知道,单击窗口时它将显示在最前面,其他所有窗口都显示在其后(模态窗口除外)。有时,可能希望窗口始终显示在最前面,而不管它是不是当前窗口(即是否获得焦点)。一个这样的例子是Visual Basic和Word等应用程序的“查找”窗口。不管“查找”窗口是否获得焦点,它总是显示在最前面。要创建这样的窗口,可将其 TopMost 属性设置为True。虽然不像航天领域那样,但这也表明,简单的属性修改或方法调用就能完成看似很难的任务。

窗体另一个很酷的属性是 Opacity。该属性控制窗体及其所有控件的不透明度。默认的Opacity属性值是100%,意味着窗体及其控件是完全不透明的(实心的),0%创建完全透明的窗体(这没有实际意义)。50%创建一个透明度在实心和不可见之间的窗体,如图 6.17 所示。Microsoft Outlook 2003及更新的版本在弹出警告,指出用户有电子邮件时很好地利用了透明性。这些警告的透明度从0增加到100,并在100%停留一段时间,然后再逐渐降低到0,最后消失。在程序中可使用第14章讨论的简单循环实现这一点。

图6.17 魔幻窗体

可滚动窗体是指无法容纳全部内容时可显示滚动条的窗体。这是一个很好的功能,也很容易在应用程序中实现。

窗体的滚动行为由下面三个属性决定。

按 F5 键运行项目,将窗体的右下角朝左上方拖曳以缩小窗体。注意到当窗体缩小时,虽然控件尽可能适当地调整了大小,但还是有些控件完全看不见。除非窗体是可滚动的,否则访问这些控件的唯一途径就是放大窗体。

执行下列步骤。

1.如果项目还在运行,停止它。

2.将ViewerForm.vb窗体的AutoScroll属性设置为True。

3.按F5键运行项目。

4.将窗体的右下角朝左上方拖曳,使窗体缩小。注意到这样做时,窗体右边将出现滚动条,如图6.18所示。可用滚动条来滚动窗体中的内容,以访问原本不可见的控件。

图6.18 没有滚动条就不能访问看不到的控件

停止运行项目并保存所做的工作。

到目前为止,创建的所有项目都是单文档界面(Single Document Interface,SDI)的。在SDI程序中,每个窗体都与其他窗体平等;窗体间不存在层次关系。Visual Basic也允许创建多文档界面(MDI)程序。MDI程序包含一个父窗口(也称为容器)以及一个或多个子窗口。MDI程序的一个经典例子是Adobe PhotoShop。启动 PhotoShop时,出现一个父窗口。在这个父窗口中,可以打开任意数量的文档,每个文档都在一个子窗口中。在MDI程序中,所有子窗口都共享父窗口的工具栏和菜单栏。对子窗口的一种限制是,它们被限定在父窗口的边界内。

图6.19所示的PhotoShop打开了多个子文档窗口。

图6.19 MDI程序由一个父窗口以及一个或多个子窗口组成

注意:除子窗口外,MDI 应用程序还可以有任意数量的常规窗口(如对话框)。

下面创建一个简单的MDI项目。执行以下步骤来创建该项目。

1.选择菜单“文件”>“新建项目”打开“新建项目”对话框(这是一个模态窗口)。如果出现提示,请保存对Picture Viewer项目所做的修改。

2.在“名称”中输入“MDI Example”,然后单击“确定”创建项目。

3.在“解决方案资源管理器”中右击 Form1.vb,在弹出菜单中选择“重命名”,然后将窗体的名称改为 MDIParentForm.vb。接下来将窗体的 Text 属性该为 MDI Parent,并将其IsMdiContainer属性设置为True(如果不将IsMdiContainer属性设置为True,这个例子将不可行)。

注意到Visual Basic已经将客户区域改为暗灰色,并呈现下陷效果,这是MDI父窗口的标准外观。所有可见的子窗口都出现在该区域中。

4.选择菜单“项目” >“添加Windows窗体”创建一个新窗体,将该窗体命名为Child1Form,并将其Text属性改为Child 1。

5.用同样的方法添加第三个窗体到项目中。将该窗体命名为 Child2Form,并将其 Text属性改为Child 2。

6.单击工具栏上的“全部保存”按钮,并将该项目命名为MDI Example。

7.在“解决方案资源管理器”中双击MDIParentForm.vb,以便在设计器中显示父窗口。

8.双击该窗体以访问其默认事件:Load事件。输入下列代码:

Child1Form.MdiParent = Me

Child1Form.Show()

现在,读者应该知道最后一条语句的作用:以非模态方式显示窗体。这里要介绍的是第一条语句,它将窗体的MdiParent属性设置为当前窗体(Me指的总是当前对象),当前窗体是一个MDI父窗体,因为它的IsMdiContainer属性被设置为True。显示新窗体时,它将作为MDI的子窗体。

现在按 F5 键运行项目,注意到子窗体显示在父窗体的客户区域中。如果调整父窗体的大小,使一个或多个子窗体不能完全显示时,将出现滚动条,如图6.20所示。如果删除设置MdiParent属性的语句,窗体将浮动在父窗体上(因为它不再是子窗体),不再被限定在父窗体的边界内。

图6.20 子窗体只能显示在父窗体的边框内

选择菜单“调试”>“停止调试”停止运行项目,并执行下列步骤。

1.在“解决方案资源管理器”中双击Child1Form窗体,使其显示在设计器中。

2.在窗体中添加一个按钮,并按如下设置该按钮的属性:

3.双击按钮访问它的Click事件,然后添加下列代码:

Child2Form.MdiParent = Me.MdiParent

Child2Form.Show()

这段代码显示第二个子窗体。注意这段代码与前一段代码之间的区别。不能将第二个子窗体的MdiParent设置为Me,因为Me引用当前窗体(Child1Form,它并不是MDI容器)。然而,Me.MdiParent引用当前子窗体的父窗体,这正是最初将窗体设置为子窗体时设置的属性。因此,只需将第一个子窗体的父窗体传递给第二个子窗体,这样它们就成为同一个窗体的子窗体。

注意:任何窗体都可作为子窗体(当然,MDI父窗体除外)。要使窗体成为子窗体,将其MdiParent属性设置为一个已定义为MDI容器的窗体。

4.按F5键运行项目。可以看到子窗体中的按钮,单击这个按钮(如果看不到这个按钮,可能是误将它添加到第二个子窗体中了)。单击按钮时,将显示第二个子窗体,如图 6.21 所示。注意到该窗体也被限定在父窗体的边界内。

图6.21 子窗体之间是平等的

提示:MDI 父窗体有 ActiveMdiChild 属性,通过它可获得对当前活动子窗口的引用。

注意:要使父窗口在项目启动时更大,可在设计时或窗体的Load事件中设置窗体的属性Size.Height和Size.Width。

关于窗体有一点要记住:可以创建任意数量的窗体实例。然而,管理同一窗体的多个实例很复杂,这超出了本书的范围。

在“Windows应用程序”项目中,默认情况下,启动窗体是加入到项目中的第一个窗体。这是用户创建新的“Windows应用程序”项目时,Visual Basic自动创建的窗体。

每个“Windows窗体应用程序”项目都必须有启动窗体作为程序的入口。要更换启动窗体,可在“解决方案资源管理器”中右击项目名,然后选择“属性”。属性“启动窗体”位于第一个属性面板中,如图6.22所示。

如果将“启动窗体”设置为某个子窗体,项目运行时其行为可能与预期的不同:将出现指定的启动窗体,但它不会是子窗体,因为将该窗体的 MdiParent 属性设置为有效父窗体的代码没有执行。

如果读者还对MDI窗体感到迷惑,不要担心。作为Visual Basic新手,您编写的大多数应用程序都将是SDI程序。更熟悉Visual Basic项目的创建后,再尝试创建MDI项目。记住,不要只是因为可以创建MDI程序就使用MDI;仅当项目要求时才使用MDI。

图6.22 应用程序的入口由“属性”中的“启动窗体”来确定

理解窗体很重要,因为窗体是动态的画布,可以在上面构建用户界面。如果不知道如何使用窗体,整个应用程序将受损。使用窗体不仅是设置属性,特别是考虑到终端用户时。随着经验的增长,您对窗体设计得心应手,只需凭感觉就能完成。

在本章中,读者学习了如何做一些有趣的事情(如创建透明窗体)以及一些高端技巧(如创建MDI应用程序);还学习了如何创建可滚动的窗体(不可忽略的界面元素),还花了很多时间学习窗体上的控件,这很重要,因为窗体的主要功能就是用来放置控件。在接下来的两章中,读者将学习Visual Basic的很多功能强大的控件,这些控件将成为开发武器库中的重要武器。

问:是否对于创建每个的窗体都需要考虑锚定和滚动?

答:绝对不是。在大部分应用程序中,多数窗体都是对话框。对话框是用于从用户那里收集数据的模态窗口。对话框的大小通常都是固定的,也就是说其边框样式被设置为不可调整的。对于大小固定的窗体,不必考虑锚定或滚动。

问:如何确定项目是否应使用MDI界面?

答:如果程序将打开同一种窗体的很多实例,就应该使用MDI界面。举个例子,如果要创建图像编辑程序,允许用户同时打开很多图像,使用MDI将是合理的。此外,如果有多个窗体共享相同的工具栏和菜单,也应考虑使用MDI。

1.判断对错:在一系列选中的控件中,第一个选中的控件总是活动控件。

2.从工具箱中将控件添加到窗体中的方法有几种?

3.如果双击工具箱中的工具,它将放在窗体的什么位置?

4.哪个属性将控件边缘锚定到窗体边缘?

5.需要修改什么来隐藏窗体上的网格?

6.哪个工具栏包含均匀排列控件和对齐控件的功能?

7.要使窗体成为MDI父窗体应设置哪个属性?

1.对。

2.有三种主要的方法:双击工具箱中的工具;拖曳工具箱中的工具;单击工具箱的工具然后在窗体中绘制它。

3.放在当前选中的控件上;如果没有选中控件,则放在窗体的左上角。

4.Anchor属性。

5.“选项”对话框中的ShowGrid属性。

6.布局工具栏。

7.将窗体的IsMdiContainer属性设置为True。

1.创建一个新的Windows应用程序项目,并在窗体中央添加一个按钮。将按钮的Anchor属性设置为不同的值,在不同的属性设置下运行程序。

2.修改本章的 MDI Example 项目,使得首先显示子窗体 Child2Form,它再显示Child1Form。

感谢Sams出版社所有工作人员为本书所做的工作,没有他们的付出,本书不可能付梓。

图书在版编目(CIP)数据

Visual Basic 2010入门经典/(美)福克奥斯(Foxall,J.)著;梅兴文译.--北京:人民邮电出版社,2011.4

ISBN 978-7-115-25145-9

Ⅰ.①V… Ⅱ.①福…②梅… Ⅲ.①BASIC语言—程序设计 Ⅳ.①TP312

中国版本图书馆CIP数据核字(2011)第048616号

版权声明

James Foxall: sams Teach Yourself Visual Basic 2010 in 24 Hours

ISBN: 0672331136

Copyright © 2010 by Sams Publishing.

Authorized translation from the English languages edition published by Sams.

All rights reserved.

本书中文简体字版由美国Sams出版公司授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。

Visual Basic 2010入门经典

♦著 [美] James Foxall

译 梅兴文

责任编辑 傅道坤

♦人民邮电出版社出版发行  北京市崇文区夕照寺街14号

邮编 100061  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

北京  印刷

♦开本:787×1092 1/16

印张:23.25

字数:578千字  2011年5月第1版

印数:1-000册  2011年5月北京第1次印刷

著作权合同登记号 图字:01-2011-0736号

ISBN 978-7-115-25145-9/TP

定价: 元

读者服务热线:(010)67132705 印装质量热线:(010)67129223

反盗版热线:(010)67171154

广告经营许可证:京崇工商广字第0021号

相关图书

Rust游戏开发实战
Rust游戏开发实战
仓颉编程快速上手
仓颉编程快速上手
深入浅出Go语言编程从原理解析到实战进阶
深入浅出Go语言编程从原理解析到实战进阶
JUnit实战(第3版)
JUnit实战(第3版)
Go语言编程指南
Go语言编程指南
Scala速学版(第3版)
Scala速学版(第3版)

相关文章

相关课程