CharlesPetzold是全球最权威且知名的Windows程序设计专家,他将其最畅销ProgrammingMicrosoftWindowswithC#一书加以改写,使之能完全适用于VisualBasic.NET的开发人员。这位畅销书的作家示范了如何使用VisualBasic.NET将WindowsForms的功能发挥到极致(WindowsForms是新一代的Windows程序设计类库)。您将学习如何使用VisualBasic的.NET版本替Windows应用程序建立动态的用户界面与图形化输出。通过丰富的用户端应用程序范例清楚示范了最常用的技术与不为人知的技巧,有了本书,您能真正深入到VisualBasic.NET的核心领域。本书是笔者的著作"ProgrammingMicrosoftWindowswithC#"到MicrosoftVisualBasic.NET的转换版本。这两本书除了示例编程代码之外基本上是相同的。两本书皆在展示如何在MicrosoftWindows之下撰写程序。有许多方法来撰写此类程序。在这两本书中,笔者使用一个称为WindowsForms的新类库。WindowsForms类库是Microsoft.NETFramework的一部分,.NETFramework的概念是于2年夏天首次提出并于一年半之后正式问世的。.NETFramework是提供程序员撰写Intemet、Web、与Windows应用程序所需的类扩展集合。.NET的许多媒体范围集中于Web编程。本书则是讨论.NET的其他部分。您可以使用WindowsForms撰写传统独立的WindowsForms应用程序(此类应用程序有时被称为客户端应用程序或分布式应用程序的前端)。WindowsForms几乎提供了撰写全方位Windows应用程序所需的所有功能。其最大疏忽就是多媒体支持,甚至没有任何WindowsForms功能能够让电脑的喇叭发生哔哔的声响。笔者曾经尝试去撰写自己的多媒体类,不过后来还是克制下来,因为笔者心理假设(希望这是合理的假设)下一个版本的WindowsForms会内含灵活、强大且易于使用的多媒体支持。定义于.NETFramework中的类是跨语言的。在发表.NETFramework时,Microsoft也发布了可以使用这些类的VisualBasic与C++新版本以及全新的编程语言C#。其他程序语言的厂商正在修改它们自己的程序语言使其能够使用.NET类。.NET的跨语言特性是由公共语言规范(CLS)所促成的,CLS文档是描述使用.NETFramework的编程语言需要具有哪些特性。针对.NET所设计的编译器一般会将源代码转换成位于.exe文件中的一个中间语言(IntermediateLanguage)。在运行:时,中间语言会被.NET公共语言运行库(CLR)编译成适当的微处理器机器码。因此,NETFramework可以说是跨平台的。WindOWS与BaSiCMicrosoft公司在1985年的秋天首度发表Windows的第一个版本。自此开始,Windows就不断地更新与增强,在WindowsNT(1993年)与Windows95(1995年)中更是做了显著地改进,其中最重要的变革就是使Windows从16位架构迈向32位架构。当Windows首次发布时,实际上只有一种方法来撰写Windows应用程序,也就是通过使用C编程语言来访问Windows应用程序接口(An)。虽然也能够使用MicrosoftPascal来访问WindowsAPl,不过很少使用此方法。几年来,许多其他的程序设计语言也都顺势调整以便能够进行Windows编程。在1991年,Microsoft公司发布用于Windows的VisualBasic1.,此一革命性的产品允许程序员通过将控件拖放至窗体上来交互式地设计应用程序。VisualBasic1.提供了一种比C程序员所使用的API更高级的编程界面。VisualBasic在接下来的数年持续演进直到1998年推出VisualBasic6.为止。VisualBasic.NET代表从VisualBasic6.以来的变革(在语言本身并没有太大改变),大部分仍然继续沿用,但是在程序与Windows交互的编程界面上则有长足进步。在VisualBasic.NET中,此界面是由实现于.NETFramework中的类库所提供的。用户要求欲最有效地使用本书,您需要能够编译与运行VisualBasic.NET程序。欲编译这些程序,您需要一个VisualBasic.NET编译器。欲运行这些程序,您需要.NET运行库(也称为公共语言运行库,CLR),CLR是动态链接库的一个集合。这两个项都已内含于称为MicrosoftVisualBasic.NET的软件产品中,它是一个现代化的集成开发环境。另外,您可以购买更完整广泛也更昂贵的MicrosoftVisualStudio.NET,除了VisualBasic以外,它还能够让您使用C++与C#来撰写程序。如果您喜爱较简单的做法,可以下载免费的.NETFramework软件开发工具包(SDK)。此下载内含一个命令行的VisualBasic.NET编译器与.NET运行库。首先,请到网站http://msdn.microsoft.com/downloads,然后从左侧选取SoftwareDevelopmentKits,并找到.NETFrafneworkSDK。您或许需要选择.NETFrameworkRedistributable页面然后在那里找到一个链接(请牢记,此Web站点与本书所提及的其他所有Web站点一样,都会经常变更、移动甚至完全消失)。笔者撰写本书时系假设您至少了解如何在较早版本的VisualBasic中撰写程序,而且假定您对面向对象语言的概念非常熟悉。笔者在第1章花了许多功夫让您了解VisualBasic.NET的新特性。笔者在本书中有时候会引用WindowsAPI。您可以阅读笔者的另外一本著作"ProgrammingWindows"(微软出版社于1998年出版,第五版)学习更多有关WindowsAPl的知识。正如笔者在前节所提,欲最有效地使用本书,您需要会编译与运行VisualBasic.NET程序。系统要求列示如下:●Microsoft.NETFrameworkSDK(最小需求);MicrosoftVisualBasic.NET或MicrosoftVisualStudio.NET(建议需求)。●MicrosoftWindowsNET4.、Windows2或WindowsXP。欲在其他电脑上运行您的VisualBasic.NET程序,这些电脑必须安装.NET运行库(即.NETFramework可重新发布包)。该包内含于.NETFrameworkSDK、VisualBasic.NET与VisualStudio.NET中。可重新发布包可安装于刚刚所提过的Windows版本以及Windows98与WindowsMe中。正如我们稍后所会讨论的,本书的范例文件可以自微软出版社网站下载。如果您要将它们安装于硬盘中,需要大约3.5MB的额外硬盘空间(如果全部加以编译,这些范例所占用的空间将会超过13MB)。本书的编排当Windows1.首次发布时,整个API是实现于3个名称为KERNEL(核心调用)、USER(用户)与GDI的动态链接库中。虽然这些与Windows关联的DLL已经变得非常庞大,但是若将Windows函数调用(或框架类)区分成这3类仍然是非常有用的。核心调用就是那些实现于操作系统的架构内部中者,而且一般会与任务、内存管理以及文件I/O有关。术语用户是指用户界面。这些是用来建立窗口、使用菜单与对话框以及显示按钮与滚动条等控件的函数。GDI是图形设备接口(GraphicsDevicelnferface),它是Windows用以负责在屏幕与打印机上显示图形输出(包括文本在内)的部分。本书先从4个介绍性的章节开始。从第5章(说明如何绘制直线与曲线)开始并持续至第24章(主要介绍Windows剪贴板),这些章节将会在图形主题(奇数章节)与用户界面主题(偶数章节)之间交替。一般来说像本书这样的书籍并不会花费太多时间与篇幅来介绍非Windows主题,例如:文件I/O、浮点数运算与字符串处理。然而,因为.NETFramework非常新,笔者发现自己期望能在这些类上有前后连贯的说明。因此笔者自己撰写了这样的说明。它们会内含于文件、数学与字符串的3个附录中。您可以在读完第1章之后,在需要了解它们的任何时候参考这些附录。笔者试着去编排这些章节的先后顺序(以及各章中主题的顺序)以使每个主题循序渐进,而让"向前引用"的次数降至最低。笔者将本书撰写成可以很自然地一路读下去,就好比在阅读TheStand或TheDeclineandFallOftheRomanEmpire一样。当然,如果像本书这么多篇幅的书籍能够当作参考书籍来查阅也是很不错的。出于此原因,许多使用于WindowsForms程序设计中的重要方法、属性与枚举皆会在讨论它们时列于表格中。然而,即使是本书这样篇幅的书籍也无法彻底讨论到WindowsForms中的所有技术知识。本书不能取代Microsoft官方的类文档。WindowsForms程序需要费一番功夫学习,为了帮助学习,本书内含丰富且完整的范例程序。您可以自行将这些程序中的代码片断粘贴至程序中(这也正是这些范例程序的主要目的),但是请不要随意分布这些程序或其中的代码。如同在VisualBasic的早期版本中,VisualBasic.NET允许互动式地设计应用程序的外观。您可以将不同的控件(如按钮和滚动条等)放置在窗口的表面上,而,VisualBasic.NET会自动生成代码。虽然这样的技术在设计对话框与前端面板类型的应用程序时非常有用,但是本书将不采用VisualBasic.NET的此项特性。在本书中,我们不会让VisualBasic.NET替我们生成代码,我们将学习如何自行撰写所有的代码。支持本书的范例程序可以从出版社网站http://www.microsoft,com/mspress/books/6259,asp下载(笔者个人的网站http.'//www,charlespetzold,com也有一个该网页的链接)。您可以将解决方案文件(.sln)或项目文件(.vbpr~)下载至VisualBasic.NET中并重新编译这些程序。我们已经竭尽所能来确保本书与源代码内容的正确性,微软出版社会通过如下网址的全球信息网来提供本书的勘误:http://www.microsoft,com/mspress/support/欲直接连接至微软出版社知识库并输入您的问题或结论,请访问:http.'//www,microsoft,com/mspress/support/search,asp如果您对本书有任何建议,问题或想法,请使用下列方式将它们传送至微软出版社:邮寄:MicrosoftPressAttn:ProgrammingMicrosoftWindowswithMicrosoftVisualBasic.NETEditorOneMicrosoftWayRedmond,WA9852-6399电子邮件:MSPINPUT@MICROSOFt.COM请注意以上邮件地址并不提供产品支持。要获得关于VisualBasic.NET,VisualStudio.NET或.NETFramework的支持信息,请访问Microsoft产品支持Web站点:http://www.microsoft.com如何转换一本书笔者在21年的11月完成了ProgrammingMicrosoftWindowswithC#。在22年2月初,微软出版社询问我是否有兴趣将本书转换成VisualBasic.NET。我认为这是个蛮有趣的计划,因此立即同意这么做。本项目的第一个工作是撰写一个程序(以C#撰写)将书中的C#程序转换成VisualBasic.NET。C#这本书含有3个以上的源代码文件,因此我知道不可能将此工作全部自动完成,VisualBasic.NET这本书显然要花很长的时间来完成。我的第1个转换程序是一个片段,草率而且是特别针对我的C#编程风格设计的,忽略了我未曾使用过的程序语言特性。一个星期后,我决定重新撰写它,但是在那之前它已成功地转换了95%的代码,所以我决定通过"查找"与"替换"操作的协助手动转换其余的部分。C#是一个区分大小写的编程语言,而且在范例程序中笔者也确实使用此特性来命名变量。比方说,如果我只拥有一个Font类型的对象,我会将它命名为font。起初我假设VisualBasic.NET(不会区分大小写的编程语言)不容许这样的事情,但是我错了。编译器接受一个名称为font的对象。然而,如果font在一开始没有正确定义,VisualBasic.NET编辑器会通过将第一个字母改成大写来修正它以便使其符合Font类!为了避免造成不习惯程序语言会区分大小写的程序员会混淆,我决定不将类名称复制于对象名称。我的字体对象会成为fnt对象,而且在此过程中,我认为本书在对象命名方面已比C#那本书具有更高程度的一致性。我遇到的VisualBasic.NET是否有功能不足之处呢?其实非常少。在C#中,算术运算符(+、一等等)与比较运算符(等等二可以被结构与类重载。例如,可以使用一般的加号来相加Size对象。但在VisualBasic.NET中,必须使用op_addition方法。有类似的方法用于比较对象与转换它们。VisualBasic.NET中不带正负号整数的缺乏很少影响代码的转换。笔者在第12章的HexCalc程序中使用一个不带正负符号的长整数,但是它可以很容易就修改成带正负号的长整数。HexCalc程序中比较严重的问题是使用C#符号来标示计算机的按钮。进行类似这样的转换很容易就显现出两种程序语言间非常有趣的不同点。例如,在C#中,方法默认是专用的;而在VisualBasic.NET中,默认是公用的。哪一个的做法较好着实让笔者思量了好一会儿,结论是各有利弊。方法应被默认保护的。应该有一个理由(以及一个关键字)来使特定的方法是共用的或专用的。在本书的文本部分。笔者用标签笔动手处理了ProgrammingMicrosoftWindowsWithithC#热销的副本,标出了笔者能发现的每个很小的C#关键字、代码片段和以C#为中心的概念。为了转换本书中许多方法的表格,笔者撰写了一个VBScript。虽然它没有办法完完全全地正确运作,但是也让工作简化了不少。MicrosoftWord文件的其他变更则是手动完成,使用全局搜索只是为了再次检查笔者的人工努力(最常用的单一项需要改变吗?C#的static关键字会成为Shared)。本书有一些需要改变的地方起初并不明显。正如您所见到的,当翻阅本书的各页时,您会发现有许多属性的表格。在笔者最初替C#这本书设计这些表格的格式时,我是将属性的类型摆在第一列并将属性本身摆在第二列。这是C#程序员在源代码中所看到的顺序。但是这并不是VisualBasic.NET程序员所会见到的。因此这些表格的前两列必须对调以便先显示出属性名称,然后才是类型。我的编辑与我是否已从本书去除掉所有C#的痕迹呢?我们不敢完全保证。就在前几天(在我同意本书付梓之前最后一次校对章节与附录时)我就发现了一个分号(C#使用分号作为语句的结尾)与双斜线(C#的注解符号)。希望不会有太多类似之处逃过我的搜索。在.NET发表之前,将一个C或C++Windows编程书籍转换成VisualBasic可说是不可思议的。这都要归功于公共语言规范(CLS)与.NETFramework,它们确实使得此项转换工作更加顺畅。Microsoft公司确实也创造出一个系统,那就是编程语言的选择完全只是个人的喜好而已。