本书是Microsoft.NET Forms程序库的最佳使用指南。\r\n 全书包括15章和4个附录,对WinForms进行了全面而深入的讲解。前半部分讨论了窗体、对话框、GDI+以及打印等相对常见的技术;后半部分则专注于高级主题,内容涵盖设计期集成、资源、应用程序和设置、多线程用户界面以及Web部署等。其中第12、13章专门讲述了ADO.NET和WinForms的结合使用。附录分别介绍了从MFC转移到WinForms、委托和事件、序列化和标准WinForms组件和控件。\r\n 本书适合有.NET背景知识的WinForms学习者阅读,有经验的WinForms程序员则可从中学到大量的高级技巧。\r\n
第1章 Hello, Windows Forms 1\r\n 1.1 WinForms起步 1\r\n 1.2 Visual Studio .NET中的Windows窗体 6\r\n 1.3 布置控件 10\r\n 1.4 控件 13\r\n 1.5 应用程序设置 15\r\n 1.6 资源 17\r\n 1.7 对话框 19\r\n 1.8 绘图与打印 21\r\n 1.9 数据绑定 23\r\n 1.10 多线程用户界面 24\r\n 1.11 部署 25\r\n 1.12 从MFC转移过来 26\r\n 1.13 小结 26\r\n第2章 窗体 27\r\n 2.1 显示窗体 27\r\n 2.2 窗体的生存期 29\r\n 2.3 窗体的大小和位置 32\r\n 2.4 窗体修饰 37\r\n 2.5 窗体的透明度 39\r\n 2.6 窗体菜单 42\r\n 2.7 子控件 46\r\n 2.8 布局 51\r\n 2.9 多文档界面 61\r\n第3章 对话框 68\r\n 3.1 标准对话框 68\r\n 3.2 风格 70\r\n 3.3 数据交换 72\r\n 3.4 数据验证 77\r\n 3.5 实现帮助 82\r\n 3.6 小结 91\r\n第4章 绘图基础 92\r\n 4.1 在屏幕上绘制 92\r\n 4.2 颜色 96\r\n 4.3 画刷 100\r\n 4.4 画笔 107\r\n 4.5 形状 113\r\n 4.6 路径 117\r\n 4.7 图像 120\r\n 4.8 小结 133\r\n第5章 绘制文本 134\r\n 5.1 字体 134\r\n 5.2 字符串 142\r\n 5.3 小结 149\r\n第6章 高级绘图 150\r\n 6.1 页面单位 150\r\n 6.2 变换 154\r\n 6.3 区域 162\r\n 6.4 优化绘图 165\r\n 6.5 小结 169\r\n……\r\n第7章 打印 170\r\n第8章 控件 190\r\n拖放目标和COM 226\r\n第9章 设计期集成 232\r\n使用标准组件 233\r\n第10章 资源 287\r\n利用资源管理器访问资源 296\r\n设计器资源问题 299\r\n第11章 应用程序与设置 310\r\n第12章 数据集和设计器支持 348\r\n第13章 数据绑定和数据网格 375\r\n第14章 多线程用户界面 417\r\n第15章 Web部署 440\r\n附录A\r\n附录B\r\n附录C 序列化基础 493\r\n附录D 标准WinForms组件和控件 503\r\n
作为一个在Windows开发社群中有那么一些名气的人物,时常有人问我.NET是否会腾飞,我总是报以同样的回答:这不是“是否”的问题,而是“何时”的问题。
微软.NET框架好处如此之多,以至于连我这样的鬓发斑白的C++/Win32老人也抵制不了托管开发环境之呼声的诱惑。经济的暂时不景气导致人们不愿再尝试任何新东西,然而.NET却可以显著地缩短产品的上市时间和成本并可以提高代码质量,这真具有讽刺意味。业已采用了.NET的组织意识到自己将会拥有长久而快乐的生活,这反过来又进一步推动了微软关于Windows平台(包括服务端和客户端)的未来计划。
.NET中首要的服务端技术非ASP.NET莫属,它提供了构建Web站点和Web services所需的基础设施。ASP.NET通过瞄准中间一代 Web浏览器提供的特性基线,为开发者提供一种向任何人部署Web站点的途径。为了提供最高级别的功能,ASP.NET在服务端做了大部分工作,使得客户端HTML变成了一个“触发对服务端新数据网页请求”的瘦包装器。服务端几乎包办了一切,包括从数据操纵到呈现菜单和工具栏这样的简单的东西。总而言之,这个模型提供了跨越操作系统和浏览器的最大的可用性。
另一方面,如果你的目标客户是Windows用户,基于HTML的体验将用户局限于“最小公分母”的方式就变得不再必要。实际上,为了力图提供更丰富的客户端体验,许多组织都很清楚其目标Windows用户需要特定版本的微软Internet Explorer(IE)Web浏览器。一旦如此,IE将变得不再像浏览器,更像是基于HTML的应用程序运行时(runtime)。对于这个用途而言,HTML对象模型相当原始,完成很简单的事情(比如跟踪用户会话状态)通常都需要你付出大量的工作。如果你打算以Windows用户为目标,.NET框架为你提供了一套更丰富的对象,用于构建交互式用户界面。
这为我带来了本书的主题:Windows Forms(WinForms)。WinForms是.NET在客户端的脸面,它提供了基于窗体的开发环境,意欲提供最佳UI对象模型。此外,它还提供了一个迄今为止没有哪种基于Windows的开发框架提供过的特性:基于HTML的Web应用程序的部署特性。通过将Windows应用程序的丰富性和Web应用程序的部署特性联合起来,WinForms向Windows开发者展示了一个全新的世界。这个世界使我感到更加愉快,从而乐于放弃非托管代码所招致的混乱。
谁应该阅读这本书
在写作本书过程中,我的脑海中浮现两类目标观众。我希望同时为已经在.NET环境中编程的程序员和尚未在.NET环境中编程的程序员提供真实世界的WinForms知识。为此,必要时我会简介核心.NET主题。然而,.NET框架的领地实在是太大了,本书绝不会佯称已经涵盖了一切。相反,只要我能够想到对读者有用的更多的信息,我都会引用另外提供了完整细节的作品。特别是,我反复提及了Essential .NET(由Don Box和Chris Sells合著),从而使其成为本书很好的搭档。在同样的范畴,我还推荐Pragmatic ADO.NET(Shawn Wildermuth著)、Advanced .NET Remoting(Ingo Rammer著)、.NET Web Services(Keith Ballinger著)以及Applied Microsoft .NET Framework Programming(Jeffrey Richter著)(如欲了解关于这些书籍更多的细节,请查阅“参考文献”)。
有两个核心.NET主题对于WinForms程序员来说特别重要,我在附录B“委托和事件”和附录C“序列化基础”中更详细地描述了它们。如果你是一名.NET新手,“委托和事件”的内容尤为重要,尽管在你获得特定于WinForms的框架参考(从第1章“Hello, Windows Forms”开始大约占全书1/3内容)之前我并不推荐你深入钻研这个主题。
还有一点需要说明一下。许多年前,我写了我的第一本“5天培训课程”,主题是Windows 95,并包括若干课时关于新控件的讨论:它们看起来如何,它们的属性、方法和事件是什么,如何对它们进行编程等。这些课时看起来占用了我和学生们不少时间。实际上,只有当你使用该控件时,特定控件的细节才有意思。这些特定控件的文档和“智能感知”技术做了非凡的工作,它们为你提供了所需的信息。鉴于此,本书没有彻底涵盖任何一个标准控件,相反,每一个控件都处于当前讨论主题的有趣的上下文之中。比如在第13章“数据绑定和数据网格”中,DataGrid控件得到了适当的讨论。还有,第8章“控件”和第9章“设计期集成”中介绍了WinForms提供的广泛的控件,包括.NET中称为非可视控件的组件。
最后,为了给你一个关于全部控件和组件的形象的认识,并向你逐一介绍它们的主要功能,附录D“标准WinForms组件和控件”提供了一个关于标准控件和组件的清单。我不想因企图比.NET框架SDK和Visual Studio .NET携带的参考文档更加详尽而浪费你的时间,相反,这本书专注于别处未详尽讨论的真实世界的场景。
约定
如果你决定尝试这本书,我首先要感谢你的信任并表达我希望达到的愿望。为了帮助你阅读接下来的文字,我希望你熟悉我的作品中使用的一些约定。
首先也是最重要的是,WinForms最奇妙之处在于它的高度可视化,这也是我为什么大量地使用插图来阐明其特性的原因。其中一些插图确实需要做成彩插,这样有助于更好地说明问题。请检查这本书中间的彩页以便查看彩色插图。
同时,我认为代码和插图一样重要。代码采用等宽字体:
System.Console.WriteLine("Hello, WinForms.");
控制台应用程序的启动命令也显示为等宽字体:
C :\> csc.exe hello.cs
如果一部分代码片段或启动命令行特别重要,我会将其标为粗体并且通常提供一个注释:
// 注意对.NET System命名空间的使用
System.Console.WriteLine("Hello, WinForms.");
当我希望将你的注意力指引向更完整的代码时,我会将多余的代码用省略号代替:
Class MyForm: System.Windows.Forms.Form {
... // 字段
Private void MyForm_Load (object sender, System.ComponentModel.EventArgs e) {
MessageBox.Show("Hello from MyForm");
}
}
进一步而言,为了使打印出来的代码可读性更好,我通常会删除掉命名空间和保护性关键字——假如它们没有提供额外信息的话:
// 缩短了的“System.Windows.Forms.Form”基类
Class MyForm: Form {
... // 字段
// 移去“private”修饰符和“System.ComponentModel”命名空间
void MyForm_Load (object sender, EventArgs e) {
MessageBox.Show ("Hello from MyForm");
}
}
而当展示.NET特性时,我会使用其全名:
[SerializableAttribute]
Class MyCustomType {...}
有些语言,比如C#,允许为了方便而将“Attribute”后缀省略掉,但这也使得难于在联机文档中查找特性类的细节。
有时为了清晰,我在打印的代码中略去了错误检查,但我会尽量将其保留于配书示例代码中。
在正文中,如果我打算定义一个新的术语,我常常将一个单词或短语设置为黑体。“霸权是指压倒性的势力或权力(hegemony is a preponderant influence or authority)”就是这类术语及其定义的一个例子,这也是一个行之有效的惯用做法。
最后,我常常提到键盘快捷键因为我发现它们用起来很方便。我提到的是默认Visual Studio开发者键盘绑定设置,如果你使用的不是这种键盘绑定,请将键盘快捷键映射到你自己的设置。
联系
这本书的最新信息,包括源代码和勘误表,均在http://www.sellsbrothers.com/上给出。该站点还为你提供了向我发送本书反馈意见的途径,赞美的和批评的,我都欢迎。
致谢
在此,我要向我的家人致以谢意。尽管我在家中工作,但在本书完成的最后阶段我通常必须花费大量的额外时间。在临近最后期限之际,我的爱妻Melissa给予我极大的理解,并提供按时完成本书所需的宽松环境。我习惯将办公室的门开着,因为,我的儿子John 和Tom经常会进来和我讨论他们的事情。尽管他们分别只有9岁和7岁,但当我需要集中精力“再工作5分钟”时,他们完全能够理解我(当我对他们两个的轻易允诺没有兑现时,痛苦的总是我。以后我再说给你们听)。在我的亲朋好友中,我要感谢我的妹妹Beth和妹夫Joel Howie,他们给予我更充分的空间。在他们的外甥听我说“再给我5分钟”已经感到厌烦时,他们会和外甥们交流。当然,我要感谢我的父母,是他们使我成为一个热情的读者并传给我