图书前言

前   言

本书的主题是Windows 8应用程序开发。

在阅读本书前,需要一台运行Windows 8的计算机并安装Windows 8开发工具和软件开发包(SDK),最简单的办法是下载免费的微软Visual Studio Express 2012 for Windows 8。下载地址可以从Windows 8开发者中心获得:http://msdn.microsoft.com/windows/apps。简体中文版下载地址:http://dev.windows.com/zh-cn/。

要安装Visual Studio,请单击页面上的“下载工具”连接,然后选择“查找 Visual Studio的其他版本”。开发者中心主页还提供了注册Windows 8开发者账号和向Windows Store提交应用程序的相关帮助。

Windows 8的版本

Windows 8基本上与Windows 7类似,两者都可以运行于同类个人计算机,拥有32位和64位Intel x86微处理器系列的计算机。Windows 8有一个是标准版本Windows 8,另外还有一个版本Windows 8 Pro,功能更多,针对的是技术爱好者和专业人士。

Windows 8和Windows 8 Pro都可以运行两种程序:

桌面应用程序

Windows 8应用程序,往往也称为“Windows 应用商店应用程序”

桌面应用程序是指传统的Windows程序,这些应用程序可以运行于Windows 7,通过Windows应用程序编程接口(Win32 API)与操作系统交互。为运行这些桌面应用程序,Windows 8提供了人们熟悉的Windows桌面界面。

Windows应用程序打破了传统Windows的一贯风格。这种应用程序一般在全屏模式下运行(但两种应用程序可以通过辅屏视图在同一个屏幕上显示),专门为触摸和平板计算机优化。这些应用程序可以从微软运营的应用商店进行购买和安装。(开发者可以直接通过Visual Studio进行部署和测试。)

除了运行在x86处理器上的Windows 8版本,Windows 8还有一个版本运行在ARM处理器上。这种处理器常见于廉价平板计算机和其他移动设备。此版本的Windows 8称为Windows RT,都已经预装在这些设备上。最早运行Windows RT的计算机是微软Surface。

Windows RT除了预装的桌面应用程序只能运行Windows应用程序。我们不能在Windows RT上运行现有的Windows 7应用程序,包括Visual Studio,因而不能在Windows RT上开发Windows 8应用程序。

Windows 8用户界面采用了新的设计范式,与Windows应用程序的风格协调一致。受到都市标志的启发,这种设计范式通过高反差来突出内容,采用朴素的字体,具有简明的风格和基于磁贴(tile)的界面,并伴随过渡动画效果。

许多开发者最初是通过Windows Phone 7认识的Windows 8设计范式,可见微软对小尺寸和大尺寸计算机均做了精心设计。过去的几年中,微软试图使传统Windows桌面更适合小型设备(如手持计算机和手机)。如今,手机的用户界面设计理念已被带至平板和桌面。

这个全新的设计更注重多点触摸(multitouch),这种操作方式在很大程度上改变了人机之间的关系。事实上,多点触摸这个词已经有些过时了,因为几乎所有新的触摸设备都能够响应多手指操作。因此直接用“触摸”便足以表达这个意思了。针对Windows 8应用程序的部分编程接口用一致的方式融合了触摸、鼠标和触笔输入,因而可以轻松通过这三种输入设备来使用应用程序。

本书要点

本书主要介绍Windows 应用商店应用程序的开发。有许多介绍Win32桌面应用程序开发的图书,其中包括《Windows程序设计(第5版)》。本书偶尔会提到Win32 API和桌面应用程序,但会将重点放在Windows 8应用程序的开发上。

为了编写这种应用程序,微软引入了一种全新的面向对象API,称为Windows运行时(Windows Runtime)或WinRT(请勿与运行在ARM处理器上的Windows 8版本Windows RT相混淆)。Windows运行时内部基于组件对象模型(Component Object Model,COM),通过/Windows/System32/WinMetadata目录下扩展名为.winmd的元数据文件向外暴露接口。从外部看,这套API完全是面向对象的。

从应用程序开发者的角度看,Windows运行时集成了Silverlight,但API内部并不是托管的。对于Silverlight开发者而言,最直接的变化或许是命名空间:Silverlight的命名空间以System.Windows开头,新API的命名空间将其替换为Windows.UI.Xaml。

大部分Windows 8应用程序不仅由代码构成,还包含标记。这些标记可能是工业标准化的超文本标记语言(HyperText Markup Language,HTML),也可能是微软的可扩展应用程序标记语言(eXtensible Application Markup Language,XAML)。将代码与标记分离的好处之一是将编码人员与界面设计人员的工作分离。

目前,开发Windows 8应用程序的技术主要有3种编程语言和标记语言的组合可供选择。

C++与XAML

C#/Visual Basic与XAML

JavaScript与HTML 5

对以上三种组合均可以使用Windows运行时,但Windows运行时为不同语言提供了相应的编程接口。虽然我们不能在同一个项目中混用不同的语言,但可以通过创建一种带有.winmd扩展名的库(Windows运行时组件)来实现。这种库可以通过任何Windows 8语言访问。

C++程序员可以使用一种C++的分支C++组件扩展或C++/CX。这种扩展使得该语言能够更好地利用WinRT。C++程序员可以直接访问部分Win32和COM API,也可以访问DirectX。此外,C++程序可以被编译为本地机器代码。

使用托管语言C#或Visual Basic .NET的程序员很容易上手WinRT。使用此类语言编写的Windows 8应用程序不能像C++程序那样轻松地访问Win32、COM或DirectX API,但也是可以的。本书第15章提供了几个相关示例程序。WinRT还提供了一个简化的.NET基础类库,用于完成一些底层任务。

针对JavaScript,Windows运行时提供了Windows Library for JavaScript或简称WinJS,使得用JavaScript编写的Windows 8程序能够调用许多系统级的功能。

经过慎重考虑,我决定在书中主要使用C#和XAML介绍相关技术。托管语言在开发和调试上的优势说服了我,并且我认为C#与Windows运行时最为匹配。希望C++程序员能够快速熟悉C#代码,从本书得到更多收获。

肯定还有其他很多Windows 8图书介绍如何使用其他语言来编写Windows 8应用程序。但我认为,一本书重点介绍一种语言比尝试同时涵盖多种语言更有价值。

不过,鉴于C++和本地代码在高性能应用中的优势,我还是非常很愿意展开新一轮的讨论。没有哪种工具能够解决任何问题。未来,我会在自己的博客和MSDN Magazine进一步讨论针对Windows 8的C++和DirectX开发。本书配套内容中的示例程序都配有对应的C++版本。

循序渐进

在阅读本书之前,需要掌握必要的预备知识。首先要熟悉C#。如果对此知之甚少,建议在阅读本书之前先学习C#。如果在学习C#之前有C或C++背景,可以阅读免费的电子书.NET Book Zero: What the C or C++ Programmer Needs to Know About C# and the .NET Framework。该书有PDF和XPS两种格式可供下载,地址为www.charlespetzold.com/dotnet。

本书假定你了解XML(可扩展标记语言)的基本语法,因为XAML本身也是一种XML。但本书假定你不熟悉XAML和任何基于XAML的编程接口。

本书是一本API参考书,不是编程工具参考书。本人唯一使用的编程工具是Microsoft Visual Studio Express 2012 for Windows 8(本书一般简称为Visual Studio)。

相比程序代码,标记语言一般更受工具的广泛支持。事实上,有些开发者甚至认为XAML这样的标记语言完全应该自动生成。Visual Studio内建可交互的XAML设计器,我们可以将控件拖拽至页面。许多开发者逐渐熟悉并喜欢使用Microsoft Expression Blend来为他们的应用程序生成复杂的XAML。Microsoft Expression Blend包含在前面提到的开发工具和SDK中。

这种设计工具非常适合有经验的开发者,我认为新手最好从手工编写XAML学起。这也正是本书介绍XAML的过程。第8章介绍的XAML Cruncher工具正好印证了一个观点:虽然它能够在你输入XAML的过程中生成相应的对象,但不能为你写XAML代码。

也千万不要走向另一个极端。有的开发者非常善于写XAML,以至于忘记如何在代码中创建和初始化相应的对象!我认为两者都很重要,因此本书将分别介绍如何用代码和标记来完成类似的任务。

在开始写本书之前,我构思了几种介绍Windows运行时的方案。一种方案是从底层图形与用户输入开始,演示控件的构建方法,然后介绍现有的控件。

但我最终选择首先介绍对主流开发者最重要的几种技术:在应用程序中组合预定义的控件,然后通过代码和数据将这些控件联系在一起。这就是本书第Ⅰ部分(也就是前12章)的主要内容。

第Ⅱ部分主要介绍底层及较为具体的功能,其中包括触摸、位图、富文本、打印以及屏幕方向和GPS传感器。

配套内容

学习新的API和学习打篮球与吹奏双簧管非常类似。旁观是很难学会的,必须亲自上手。本书配套的源代码可以通过Companion Content链接下载,网址为https://www.microsoftpressstore.com/ store/programming-windows-9780735671768。

虽然有现成的代码,但最好自己键入代码,效果会更好一些。

计算机配置

为了写这本书,我用的是三星平板电脑700T的一个特殊版本。这款平板是2011年9月的Microsoft在Build大会上为参会人员提供的。因此,这款平板也有时称为Build平板。这款平板计算机配备1.6 GHz的Intel Core i5处理器,拥有64 GB的硬盘,屏幕支持8点触摸,分辨率为1366 × 768像素(本书绝大部分截图采用的是这个分辨率),是辅屏视图模式的最低要求。

虽然这个Build平板预装的是Windows 8的开发者预览版(Developer Preview),但随着时间的推移,我依次安装了2012年3月公布的消费者预览版(Consumer Preview,build 8250)、2012年6月的发行预览版(Release Preview,build 8400),最终安装的是Windows 8 Pro的正式发行版。除了测试方向传感器外,我一般都通过底座的HDMI接口将这台平板连到1920×1080分辨率的外部显示器,并使用外接键盘和鼠标。

微软的Surface平板电脑一上市,我就购买拉一台,用于程序测试。为了在Surface上部署和调试应用程序,我采用了Tim Heuer在博客中介绍的一种技术,网址为http://timheuer.com/blog/archive/2012/10/26/remote-debugging-windows-store-apps-on-surface-arm-devices.aspx。这种技术在文档中的正式描述为:“在远程计算机上从 Visual Studio 运行 Windows 应用商店应用”(http://msdn.microsoft.com/zh-cn/library/hh441469.aspx)。

在测试用到方向传感器的程序来时,采用Surface这样的物理平板设备是很有必要的。

大部分情况下,我使用的都是插在底座上的Build平板。通过外部的键盘、鼠标和显示器,我可以像以往那样使用微软Visual Studio和Word,而让Windows 8程序在带有触摸屏的平板上运行。这样的开发环境我感到非常满意,尤其是和我当年写《Windows程序设计(第1版)》时使用的配置相比。

不过,那已经是25年前的事了。

本书的前世今生

本书是《Windows程序设计》的第6版。第1版是1986年受微软出版社的委托写的。之所以收到这个邀请,是因为我当时在为Microsoft Systems Journal(MSDN Magazine的前身)写Windows编程系列文章。

那份合同我至今记忆犹新。

最值得一提的是它首页下部的一段。

typescript(打字稿)这个词意味着,稿件至少要用打字机打印。要求规定了手稿使用双倍行距、固定字宽,每页大概有250个字。页数在400左右,也就是说微软出版社不希望内容太多。

为了写这本书,我采用了一台IBM PC/AT计算机,它采用8 MHz的80286微处理器、512 KB的内存和30 MB的硬盘。显示器为16色的IBM Enhanced Graphics Adapter,最大分辨率为640×350。写前面几章时用的是Windows 1(1985年11月发行的),后来用上了Windows 2的beta版本。

当时,编辑和编译Windows程序要在Windows以外的MS-DOS环境下进行。为了编辑源代码,我采用了WordStar 3.3,也是我写书时所用的工具。MS-DOS命令行下可以运行微软的C编译器,然后在Windows上进行运行和测试。为了再次进行编辑和编译,需要退出Windows,回到MS-DOS下。

1987年有一段时间,我为了写书几乎废寝忘食,越熬越晚,甚至黑白颠倒。当时我家里还没有电视,但会收听地方广播电台WNYC-FM不间断播放的古典音乐和美国国家公共电台的节目。在那段时间里,我在Morning Edition结束后睡觉,刚好在All Things Considered开始前起床。 

根据合同约定,我要以磁带和纸质形式将书稿提交给微软出版社。虽然当时我们都有电子邮件,但那时的电子邮件还不支持附件。编辑好的书稿通过邮政包裹发回给我,上面带有许多修改标记和即时贴。我记得有一页上有人画了一个温度标记来倾诉我不断提交的书稿,上面写着“温度上升”!

随着时间的推移,这本书的重点发生了一些变化。事实证明,原定针对程序员和其他高级用户的写书计划是错误的。也不知道是何原因,最终书名就定为《Windows程序设计》。

合同截止日期为四月底,但我直到八月才完成。本书最终出版于1988年,页数达到了850页。如果这是普通的书稿(即没有程序清单和图表),字数将不止合同约定的10万字,而会达到40万字。

《Windows程序设计》第1版的封面上写着“The Microsoft Guide to Programming for the MS-DOS Presentation Manager: Windows 2.0 and Windows/386”, Presentation Manager 这个名称让我想起针对Windows和OS/2的Presentation Manager和平共存于两个操作系统环境下的那段时光。

《Windows程序设计》的第1版在编程社区中并没有引起太多关注。当MS-DOS程序员意识到有必要学习全新的Windows时,第2版(1990年,Windows 3)和第3版(1992年,Windows 3.1)也相继出版了。

Windows API从16位升级到32位后,《Windows程序设计》的第4版(1996年,Windows 95)和第5版(1998年,Windows 98)陆续出版。第5版目前还在出版发行,根据我收到的读者来信分析,该书在印度和中国最受欢迎。

在前面5个版本中,我们用的都是C语言。在第3版问世后,第4版出版之前,我的好友Jeff Prosise说他想写《Windows程序设计与MFC》,我表示支持。我当时并不太在意Microsoft Foundation Classes(MFC),因为我那时认为它只不过是Windows API的轻型包装程序,而且我当时也没有深入钻研C++。

有些程序员希望了解核心机制而不关心程序代码与操作系统之间的细枝末节。随着时间的推移,《Windows程序设计》在这些程序员当中赢得了广泛的赞誉。

《Windows程序设计》的早期版本并非如此。当时,为接触到核心需要使用汇编语言将字符直接输出到图形显示内存区域,而只能借助于MS-DOS来进行文件I/O。相对而言,Windows程序员使用的是高级语言,图形完全没有加速,访问硬件只能通过层层API和设备驱动程序来完成。

从MS-DOS到Windows的变迁意味着用一定的速度和效率来换取某些优势。何种优势?很多经验丰富程序员也说不准。是图形、图片、颜色、漂亮的字体,还是鼠标?这些都不是计算机的全部!一些怀疑论者称其为WIMP(window-icon-menu-pointer,窗口-图标-菜单-指针)界面。其实,这些特点并不是人们选择这个环境并为其编写代码的动机。

随着时间的推移,高级语言会变成低级语言,多层次接口最终会简化为本地API(至少在某种语言当中)。如今,有些C/C++程序员因为效率问题抵触C#这样的托管语言,而Windows也一再成为人们争论的焦点。Windows 8是Windows自1985年问世以来革命性地一次升级,但为主流桌面系统引入针对智能电话和平板电脑设计的触摸界面,这种做法备受老版本Windows的用户质疑,有的用户甚至会为无法找到熟悉的功能发牢骚。

伴随着Windows令人激动和饱受争议的新用户界面,以及现代风格的API和编程语言的问世,《Windows程序设计》也开始掀开新的篇章。

未来计划

在我的编程生涯中,Windows 8可能会占据一段时间。也就是说我会发表一系列Windows 8编程的博文。可以从该网址访问我的博客和订阅RSS源:www.charlespetzold.com。

我喜欢解决编程方面的疑难杂症并在博客中与大家分享。如果您有关于Windows 8编程方面的疑问希望与我共同探讨并让我尝试解决,可以发送电子邮件给我:cp@charlespetzold.com。

从MSDN Magazine的 2013年1月刊开始,我每月为DirectX Factor栏目写一篇文章,主要讨论在Windows 8和Windows Phone 8应用程序中使用DirectX的相关议题。MSDN Magazine可以通过这个网址免费阅读:http://msdn.microsoft.com/magazine。

鸣谢

微软出版社的Ben Ryan和Devon Musgrave设计了一种出版方式,先将书稿部分章节发表到开发者社区,同时也为最终版本的销售做准备。本书也是以这种方式与大家见面的。

Devon和我的技术编辑Marc Young的部分职责是尽量多发现本书中文字和代码中的错误,以免我陷入尴尬境地。他们确实找到了不少,非常感谢!

感谢Andrew Whitechapel对C++示例代码的反馈。感谢Brent Rector通过电子邮件在对某个触摸相关问题为我提供了关键的解决方案,也感谢他为我介绍IBuffer的背景知识。感谢Robert Levy在触摸技术方面为我提供的反馈。感谢Prosise在我遇到疑难问题时给予我关键的支持。感谢Larry Smith发现我文字中的诸多错误。感谢Admiral鼓励我使C++开发者也能够从本书中受益。

当然,书中遗留的错误是我的问题。欢迎读者通过本书前面给出的地址将发现的问题发送到出版商,如果是大问题,我也会在www.charlespetzold.com/pw6列出。

最后,感谢我的妻子Deirdre Sinnott对我的爱与支持。感谢她在生活上做出必要的调整,只为了让我好好写这本书。

Charles Petzold

美国纽约州罗斯科镇与纽约市

2012年12月31日 

勘误与支持

我们尽力避免本书及其配套内容中出现错误,但错误在所难免。本书出版后报告的错误将在微软出版社的网站上公布。可以通过https://www.microsoftpressstore.com搜索本书,然后单击Errata & Updates链接。如果发现有未报告的错误,请通过Submit Errata链接提交。

如果需要额外的支持,可以发电子邮件到微软出版社的客服,邮箱地址为mspinput@microsoft.com。

注意,以上地址不提供对微软产品的支持。

意见反馈

在微软出版社,您的满意是对我们最大支持,您的反馈是我们最宝贵的财富。欢迎通过以下网址告诉我们您对本书的看法。

http://aka.ms/tellpress

反馈请尽量简短,我们会阅读您的每一条意见和建议。再次感谢您对我们的支持!

保持联系

让我们保持联系!我们的Twitter地址为http://twitter.com/MicrosoftPress。