关闭

关闭

关闭

封号提示

内容

首页 Windows程序设计.pdf

Windows程序设计.pdf

Windows程序设计.pdf

上传者: 179435187 2011-10-10 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《Windows程序设计pdf》,可适用于IT/计算机领域,主题内容包含DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版Windows程序设计原著:CharlesPetzold翻译:余孟符等。

DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版Windows程序设计原著:CharlesPetzold翻译:余孟学PDF整理:涂德华DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版基础篇第一章开始本书介绍了在MicrosoftWindows、MicrosoftWindowsNT和WindowsNT下程序写作的方法。这些程序用C语言编写并使用原始的WindowsApplicationProgrammingInterface(API)。如在本章稍后所讨论的这不是写作Windows程序的唯一方法。然而无论最终您使用什么方式写作程序了解WindowsAPI都是非常重要的。正如您可能知道的Windows已成为使用Intel位微处理器(例如和Pentium)的IBM兼容型个人计算机环境上最新的图形操作系统之代表。WindowsNT是IBMPC兼容机种以及一些RISC(精简指令集计算机)工作站上使用的Windows工业增强型版本。使用本书有三个先决条件。首先您应该从使用者的角度熟悉Windows。不要期望可以在不了解Windows使用者接口的情形下开发其应用程序。因此我建议您在开发程序(或在进行其它工作)时使用执行Windows的机器来跑Windows应用程序。第二您应了解C语言。如果要写Windows程序一开始却不想了解C语言那不是一个好主意。我建议您在文字控制台环境中例如在WindowsMSDOS命令提示窗口下提供的环境中学习C语言。Windows程序设计有时包括一些非文字模式程序设计的C语言部分在这些情况下我将针对这些问题提供讨论。但大多数情况下您应非常熟悉该语言特别是C语言的结构和指针。了解标准C语言执行期链接库的一些相关知识是有帮助的但不是必要的。第三您应该在机器上安装一个适于进行Windows程序设计的位C语言编译器和开发环境。在本书中假定您正在使用MicrosoftVisualC该软件包可独立购买也可作为VisualStudio软件包的一部分购买。到此为止我将不再假设您具有任何图形使用者接口(如Windows)的程序写作经验。WINDOWS环境Windows几乎不需要介绍。然而人们很容易忘记Windows给办公室和家庭桌上型计算机所带来的重大改变。Windows在其早期曾经走过一段坎坷的道路征服桌上型计算机市场的前途一度相当渺茫。Windows简史在年秋天IBMPC推出之后不久MSDOS就已经很明显成为PC上的主流操作系统。MSDOS代表MicrosoftDiskOperatingSystem(磁盘操作系统)。MSDOS是一个小型的操作系统。MSDOS提供给用户一种命令列接口提供如DIR和TYPE的命令也可以将应用程序加载内存执行。对于应用程序写作者它提供了一组函数呼叫进行文件的输入输出(IO)。对于其它的外围处理-尤其是将文字或图形写到显示器上-应用程序可以直接存取PC的硬件。由于内存和硬件的限制成熟的图形环境缓慢地才到来。当苹果计算机公司不幸的Lisa计算机在年月发表时它提供了不同于文字模式环境的另一种选择并在年月成为Macintosh上图形环境的一种标准。尽管Macintosh的市场占有率在下降但是它仍然被认为是衡量所有其它BarryRectangleStartReadingDefoeTutyysoftyahoocomcnWindows程序设计PDF美化版图形环境的标准。包括Macintosh和Windows的所有图形环境其实都要归功于XeroxPaloAltoResearchCenter(PARC)在年代中期所作的开拓性研究工作。Windows是由微软在年月(在Lisa之后Macintosh之前)宣布并在两年后(年月)发行。在此后的两年中紧随着MicrosoftWindows早期版本之后又推出了几种改进版本以支持国际商业市场并提供新型视讯显示器和打印机的驱动程序。Windows版本是在年月正式在市场上推出的。该版本对使用者接口做了一些改进。这些改进中最有效的是使用了可重迭式窗口而Windows中使用的是并排式窗口。Windows还增强了键盘和鼠标接口特别是加入了菜单和对话框。至此Windows还只要求Intel或者等级的微处理器以「实际模式」执行只能存取地址在MB以下的内存。Windows(在Windows之后不久发行的)使用Intel微处理器的「虚拟」模式实现将直接存取硬件的多个MSDOS程序窗口化和多任务化。为了统一起见Windows版本被更名为Windows。Windows是在年月日发表的。它将Windows和Windows结合到同一种产品中。Windows有了一个很大的改变这就是对Intel的、和微处理器保护模式的支持。这能使Windows和Windows应用程序能存取高达MB的内存。Windows用于执行程序和维护文件的「外壳」程序得到了全面的改进。Windows是第一个在家用和办公室市场上取得立足点的版本。任何Windows的历史介绍都必须包括一些OS的说明OS是对DOS和Windows的另一种选择最初是由Microsoft和IBM合作开发的。OS版本(只有文字模式)在Intel(或者后来的)微处理器上运行在年末发布。在年月的OS版本中出现了管理图形使用者接口的PM(PresentationManager)。PM最初的设计构想是成为Windows的一种保护模式版本但是图形API改变程度太大致使软件生产厂商很难提供对这两种平台的支持。到年月IBM和Microsoft之间的冲突达到了高峰导致这两个公司最后分道扬镳。IBM接管了OS而Microsoft明确表示Windows将是他们操作系统策略的中心。虽然OS仍然拥有一些狂热的崇拜者但是它远不及Windows这样的普及程度。MicrosoftWindows版本是年月发布的其中包括的几个重要特性是TrueType字体技术(给Windows带来可缩放的轮廓字体)、多媒体(声音和音乐)、对象连结和嵌入(OLE:ObjectLinkingandEmbedding)和通用对话框。跟OS一样Windows只能在保护模式下运作并且要求至少配置了MB内存的或处理器。在年月发表的WindowsNT是第一个支持Intel、和Pentium微处理器位保护模式的Windows版本。WindowsNT提供位平坦寻址并使用位的指令集。(本章后面我会谈到一些寻址空间的问题)。WindowsNT还可以移植到非Intel处理器上并在几种使用RISC芯片的工作站上执行。Windows是在年月发布的。和WindowsNT一样Windows也支持Intel或更高等级处理器的位保护模式。虽然它缺少WindowsNT中的某些功能诸如高安全性和对RISC机器的可移植性等但是Windows具有需要较少硬件资源的优点。Windows在年月发布具有许多加强功能包括执行效能的提高、更好的硬件支持以及与因特网和全球信息网(WWW)更紧密的结合。Windows方面Windows和WindowsNT都是支持位优先权式多任务(preemptivemultitasking)及多DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版线程的图形操作系统。Windows拥有图形使用者接口(GUI)这种使用者界面也称作「可视化接口」或「图形窗口环境」。有关GUI的概念可追溯至年代中期在Alto和Star等机器上以及SmallTalk等环境中由XeroxPARC所作的研究工作。该项研究的成果后来被AppleComputer和Microsoft引入主流并流行起来。虽然有一些争议但现在已非常清楚GUI是(Microsoft的CharlesSimonyi的说法)一个在个人计算机工业史上集各方面技术大成于一体的最重要产物。所有GUI都在点矩阵对应的视讯显示器上处理图形。图形提供了使用屏幕的最佳方式、传递信息的可视化丰富多彩环境以及能够WYSIWYG(whatyouseeiswhatyouget:所见即所得)的图形视讯显示和为书面文件准备好格式化文字输出内容。在早期视讯显示器仅用于响应使用者通过键盘输入的文字。在图形使用者接口中视讯显示器自身成为使用者输入的一个来源。视讯显示器以图标和输入设备(例如按钮和滚动条)的形式显示多种图形对象。使用者可以使用键盘(或者更直接地使用鼠标等指向设备)直接在屏幕上操纵这些对象拖动图形对象、按下鼠标按钮以及滚动滚动条。因此使用者与程序的交流变得更为亲密。这不再是一种从键盘到程序再到视讯显示器的单向信息流动使用者已经能够与显示器上的对象直接交互作用了。使用者不再需要花费长时间学习如何使用计算机或掌握新程序了。Windows让这一切成真因为所有应用程序都有相同的基本外观和感觉。程序占据一个窗口-屏幕上的一块矩形区域。每个窗口由一个标题栏标识。大多数程序功能由程序的菜单开始。用户可使用滚动条观察那些无法在一个屏幕中装下的信息。某些菜单项目触发对话框用户可在其中输入额外的信息。几乎在每个大的Windows程序中都有一个用于开启文件的特殊对话框。该对话框在所有这些Windows程序中看起来都一样(或接近相同)而且几乎总是从同一菜单选项中启动。一旦您了解使用一个Windows程序的方法您就非常容易学习其它的Windows程序。菜单和对话框允许用户试验一个新程序并探究它的功能。大多数Windows程序同时具有键盘接口和鼠标接口。虽然Windows程序的大多数功能可通过键盘控制但使用鼠标要容易得多。从程序写作者的角度看一致的使用者接口来自于Windows建构菜单和对话框的内置程序。所有菜单都有同样的键盘和鼠标接口因为这项工作是由Windows处理而不是由应用程序处理。为便于多个程序的使用以及这些程序间信息的交换Windows支持多任务。在同一时刻能有多个Windows程序显示并运行。每个程序在屏幕上占据一个窗口。用户可在屏幕上移动窗口改变它们的大小在不同程序间切换并从一个程序向另一个程序传送数据。因为这些窗口看起来有些像桌面上的纸(当然这是计算机还未占据办公桌之前的年代)Windows有时被称作:一个显示多个程序的「具象化桌面」。Windows的早期版本使用一种「非优先权式(nonpreemptive)」的多任务系统。这意味着Windows不使用系统定时器将处理时间分配给系统中运行的多个应用程序程序必须自愿放弃控制以便其它程序运行。在WindowsNT和Windows中多任务是优先权式的而且程序自身可分割成近乎同时执行的多个执行绪。操作系统不对内存进行管理便无法实现多任务。当新程序启动、旧程序终止时内存会出现碎裂空间。系统必须能够将闲置的内存空间组织在一起因此系统必须能够移动内存中的程序代码和数据块。即使是在微处理器上跑的Windows也能进行这类内存管理。在实际模式限制下这种能力被认为是软件工程一个令人惊讶的成就。在Windows中PC硬件结构的KB内存限制在不要求任何额外内存的情况下被有效地扩展了。但Microsoft并未就此停步:Windows允许Windows应用程序存取扩充内存(EMS)Windows在保护模式下允许Windows应用程序存DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版取高达MB的扩展内存。WindowsNT和Windows通过成熟的位操作系统及平坦寻址空间摆脱了这些旧的限制。Windows上执行的程序可共享在称为「动态链接库」的文件中的例程。Windows包括一个机制能够在执行时连结使用动态链接库中例程的程序。Windows自身基本上就是一个动态链接库的集合。Windows是一个图形接口Windows程序能够在视讯显示器和打印机上充分利用图形和格式化文字。图形接口不仅在外观上更有吸引力而且还能够让使用者传递高层次的信息。Windows应用程序不能直接存取屏幕和打印机等图形显示设备硬件。相反Windows提供一种图形程序语言(称作图形设备接口或者GDI)使显示图形和格式化文字更容易。Windows虚拟化了显示硬件使为Windows编写的程序可使用任何具有Windows设备驱动程序的视频卡或打印机而程序无需确定系统相连的设备类型。对Windows开发者来说将与设备无关的图形接口输出到IBMPC上不是件轻松的事。PC的设计是基于开放式架构的原则鼓励第三方硬件制造商为PC开发接口设备而且开发了大量这样的设备。虽然出现了多种标准PC上的传统MSDOS程序仍不得不各自支持许多不同的硬设备。这对MSDOS字处理软件来说非常普遍它们连同到张有许多小文件的磁盘一同销售每个文件支持一种特定的打印机。Windows程序不要求每个应用程序都自行开发这些驱动程序因为这种支持是Windows的一部分。动态链接Windows运作机制的核心是一个称作「动态链接」的概念。Windows提供了应用程序丰富的可呼叫函数大多数用于实作其使用者接口和在视讯显示器上显示文字和图形。这些函数采用动态链接库(DynamicLinkingLibraryDLL)的方式撰写。这些动态链接库是些具有DLL或者有时是EXE扩展名的文件在Windows中通常位于WINDOWSSYSTEM子目录中在WindowsNT中通常位于WINNTSYSTEM和WINNTSYSTEM子目录中。在早期Windows的主要部分仅通过三个动态链接库实作。这代表了Windows的三个主要子系统它们被称作Kernel、User和GDI。当子系统的数目在Windows最近版本中增多时大多数典型的Windows程序产生的函数呼叫仍对应到这三个模块之一。Kernel(日前由位的KRNLEXE和位的KERNELDLL实现)处理所有在传统上由操作系统核心处理的事务-内存管理、文件IO和多任务管理。User(由位的USEREXE和位的USERDLL实作)指使用者接口实作所有窗口运作机制。GDI(由位的GDIEXE和位的GDIDLL实作)是一个图形设备接口允许程序在屏幕和打印机上显示文字和图形。Windows支持应用程序可使用的上千种函数呼叫。每个函数都有一个描述名称例如CreateWindow。该函数(如您所猜想的)为程序建立新窗口。所有应用程序可以使用的Windows函数都在表头文件里预先声明过。在Windows程序中使用Windows函数的方式通常与使用如strlen等C语言链接库函数的方式相同。主要的区别在于C语言链接库函数的机械码连结到您的程序代码中而Windows函数的程序代码在您程序执行文件外的DLL中。当您执行Windows程序时它通过一个称作「动态链接」的过程与Windows相接。一个Windows的EXE文件中有使用到的不同动态链接库的参考数据所使用的函数即在那些动态链接库中。当Windows程序被加载到内存中时程序中的呼叫被指向DLL函数的入口。如果该DLL不在内存中就把它加载到内存中。当您连结Windows程序以产生一个可执行文件时您必须连结程序开发环境提供的特定「引用BarryHighlightBarryHighlightDefoeTutyysoftyahoocomcnWindows程序设计PDF美化版链接库(importlibrary)」。这些引用链接库包含了动态链接库名称和所有Windows函数呼叫的引用信息。连结程序使用该信息在EXE文件中建立一个表格在加载程序时Windows使用它将呼叫转换为Windows函数。WINDOWS程序设计选项为说明Windows程序设计的多种技术本书提供了许多范例程序。这些程序使用C语言撰写并原原本本的使用WindowsAPI来开发程序。我将这种方法称作「古典」Windows程序设计。这是我们在年为Windows写程序的方法它今天仍是写作Windows程序的有效方法。API和内存模式对于程序写作者来说操作系统是由本身的API定义的。API包含了所有应用程序能够使用的操作系统函数呼叫同时包含了相关的数据型态和结构。在Windows中API还意味着一个特殊的程序架构我们将在每章的开头进行研究。一般而言WindowsAPI自Windows以来一直保持一致没什么重大改变。具有Windows程序写作经验的Windows程序写作者会对Windows程序的原始码感觉非常熟悉。API改变的一种方式是进行增强。Windows支持不到个函数呼叫现在已有了上千种函数呼叫。WindowsAPI和它的语法的最大变化来自于从位架构向位架构转化的过程中。Windows从版本到版本使用位Intel、、和微处理器上所谓的分段内存模式由于兼容性的原因从开始的位Intel微处理器也支持该模式。在这种模式下微处理器缓存器的大小为位因此C的int数据型态也是位宽。在分段内存模式下内存地址由两个部分组成-一个位段(segment)指针和一个位偏移量(offset)指标。从程序写作者的角度看这非常凌乱并带来了long或far指针(包括段地址和偏移量地址)和short或near指标(包括带有假定段地址的偏移量地址)的区别。从WindowsNT和Windows开始Windows支持使用Intel、和Pentium处理器位模式下的位平坦寻址内存模式。C语言的int数据型态也扩展为位的值。为位版本Windows编写的程序使用简单的平坦线性空间寻址的位指针值。用于位版本Windows的API(Windows到Windows)现在称作Win。用于位版本Windows的API(Windows、Windows和所有版本的WindowsNT)现在称作Win。许多函数呼叫在从Win到Win的转变中保持相同但有些需要增强。例如图像坐标点由Win中的位值变为Win中的位值。此外某些Win函数呼叫返回一个包含在位整数值中的二维坐标点。这在Win中不可能因此增加的新函数呼叫以不同方式运作。所有位版本的Windows都支持WinAPI(以确保和旧有应用程序兼容)和WinAPI(以运行新应用程序)。非常有趣的是WindowsNT与Windows及Windows的工作方式不同。在WindowsNT中Win函数呼叫通过一个转换层被转化为Win函数呼叫然后被操作系统处理。在Windows和Windows中该操作正相反:Win函数呼叫通过转换层转换为Win函数呼叫再由操作系统处理。在同一时刻有两个不同的WindowsAPI集(至少名称不同)。Wins(「s」代表「subset(子集)」)是一个API允许程序写作者编写在Windows上执行的位应用程序。该API仅支持已被Win支持的位函数版本。此外WindowsAPI一度被称作Winc(「c」代表「compatibility(兼容性)」)但该术语已被抛弃了。现在WindowsNT和Windows都被认为能够支持WinAPI。然而每个操作系统依然都BarryHighlightDefoeTutyysoftyahoocomcnWindows程序设计PDF美化版支持某些不被别的操作系统支持的某些功能特性。因为它们的相同之处是相当可观的所以有可能编写在两个操作系统下都可执行的程序。而且人们普遍认为这两个产品最终会合而为一。语言选项使用C语言和原始的API不是编写Windows程序的唯一方法。然而这种方法却提供给您最佳的性能、最强大的功能和在发掘Windows特性方面最大的灵活性。可执行文件相对较小且运行时不要求外部链接库(自然WindowsDLL自身除外)。最重要的是不管您最终以什么方式开发Windows应用程序熟悉API会使您对Windows内部有更深入的了解。虽然我认为学习古典的Windows程序设计对任何Windows程序写作者都是重要的我没有必要建议使用C和API编写每个Windows应用程序。许多程序写作者特别是那些为公司内部开发程序或在家编写娱乐程序的程序写作者喜欢轻松的开发环境例如MicrosoftVisualBasic或者BorlandDelphi(它结合了对象导向的Pascal版本)。这些环境使程序写作者将精力集中于应用程序的使用者接口和相关使用者接口对象的程序代码上。要学习VisualBasic您也许需要参考MicrosoftPress的一些其它图书例如MichaelHalvorson年着的《LearnVisualBasicNow》。在专业程序写作者中-特别是那些开发商业应用程序的程序写作者-MicrosoftVisualC和MicrosoftFoundationClassLibrary(MFC)是近年来流行的选择。MFC在一组C对象类别中封装了许多Windows程序设计中的琐碎细节。JeffProsise的《ProgrammingWindowswithMFC,第二版》(MicrosoftPress,年)提供了MFC程序的写作指南。最近Internet和WorldWideWeb的流行大力推广着SunMicrosystems的Java这是一个受C启发却与微处理器无关的程序设计语言而且结合了可在几个操作系统平台上执行的图形应用程序开发工具组。MicrosoftPress有一本关于MicrosoftJ(Microsoft的Java)开发工具的好书《ProgrammingVisualJ》(年)由StephenRDavis着。显然很难说哪种方法更有利于开发Windows应用程序。更主要的是也许是应用程序自身的特性决定了所使用的工具。不管您最后实际上使用什么工具写作程序学习WindowsAPI将使您更深入地了解Windows工作的方式。Windows是一个复杂的系统在API上增加一个程序写作层并未减少它的复杂性仅仅是掩盖了它早晚您会碰到它。了解API会给您更好的补救机会。在原始的WindowsAPI之上的任何软件层都必定将您限制在全部功能的一个子集内。您也许发现例如使用VisualBasic编写应用程序非常理想然而它不允许您做一个或两个很简单的基本工作。在这种情况下您将不得不使用原始的API呼叫。API定义了作为Windows程序写作者所需的一切。没有什么方法比直接使用API更万能的了。MFC尤其问题百出。虽然它大幅简化了某些工作(例如OLE)我却经常发现要让它们按我所想的去工作时会在其它特性(例如DocumentView架构)上碰壁。MFC还不是Windows程序设计者所追求的灵丹妙药很少有人认为它是一个好的对象导向设计的模型。MFC程序写作者从他们使用的对象类别定义如何工作中受益颇深并会发现他们经常参考MFC原始码搞懂这些原始码是学习WindowsAPI的好处之一。程序开发环境在本书中假定您正使用MicrosoftVisualC标准版、专业版和企业版都可以。经济的标准版足以应付本书中的程序设计需求。VisualC还是VisualStudio中的一部分。MicrosoftVisualC软件包中包括C编译器和其它编译及连结Windows程序所需的文件和工具等。它还包括VisualCDeveloperStudio一个可编辑原始码、以交谈方式建立资源(如图标和对话框)以及编辑、编译、执行和测试程序的环境。DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版如果您正使用VisualC则需要为Windows和WindowsNT更新表头文件和引用链接库这些东西可从Microsoft的网站上得到。在http:wwwmicrosoftcommsdn选择「Downloads」然后选择「PlatformSDK」(软件开发套件)您就能在选择的目录中下载和安装更新文件。要让MicrosoftDeveloperStudio浏览这些目录可以从「Tool」菜单项选择「Options」然后按下「Directories」标签。Microsoft网站上的msdn部分代表「MicrosoftDeveloperNetwork(Microsoft软件开发者网络)」。这是一个向程序写作者提供了经常更新的CDROM的计划这些CDROM中包含了程序写作者在Windows开发中所需的最新东西。您也可以订阅MSDN这样就避免经常得从Microsoft的网站下载文件。API文件本书不是WindowsAPI权威的正式文件的替代品。那组文件不再以印刷形式出版它仅能从CDROM或Internet上取得。当您安装VisualC时您将得到一个包括API文件的在线求助系统。您可通过订阅MSDN或使用Microsoft网站上的在线求助系统更新该文件。连接到http:wwwmicrosoftcommsdn并选择「MSDNLibraryOnline」。在VisualC中从「Help」菜单项选择「Contents」项目开启MSDN窗口。API文件按树形结构组织寻找标有「PlatformSDK」的部分所有在本书中引用的文件都来自于该部分。我将向您介绍如何从「PlatformSDK」开始寻找以斜线分层分门别类的文件的位置。(我知道「PlatformSDK」是整个MSDN知识库中较为晦涩的部分但我敢保证那是Windows程序设计的基本核心。)例如对于如何在Windows程序中使用鼠标的文件您可参考PlatformSDKUserInterfaceServicesUserInputMouseInput。我在前面提到Windows大致分为Kernel、User和GDI子系统。kernel接口在PlatformSDKWindowsBaseServices中User界面函数在PlatformSDKUserInterfaceServices中GDI位于PlatformSDKGraphicsandMultimediaServicesGDI中。编写第一个WINDOWS程序现在是开始写些程序的时候了。为了便于对比让我们以一个非常短的Windows程序和一个简短的文字模式程序开始。这会帮助我们找到使用开发环境并感受建立和编译程序机制的正确方向。文字模式(CharacterMode)模型程序写作者们喜爱的一本书是《TheCProgrammingLanguage》(PrenticeHall年和年)由BrianWKernighan和DennisMRitchie(亲切地称为KR)编着。该书的第一章以一个显示「hello,world」的C语言程序开始。这里是在《TheCProgrammingLanguage》第一版第页中出现的程序:main(){printf("hello,worldn")}以前C程序写作者在使用printf等C执行期链接库函数时无需先声明它们。但这是年代我们愿意给编译器一个在我们的程序中标出错误的机会。这里是在KR第二版中修正的程序:#include<stdioh>main()DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版{printf("hello,worldn")}该程序仍然是那么短。但它可通过编译并执行得很好但当今许多程序写作者更愿意清楚地说明main函数的返回值在这种情况下ANSIC规定该函数必须返回一个值:#include<stdioh>intmain(){printf("hello,worldn")return}我们还可以包括main的参数把程序弄得更长一些但让我们暂且这样就好了-包括一个include声明、程序的进入点、一个对执行期链接库函数的呼叫和一个return语句。同样效果的Windows程序Windows关于「hello,world」程序的等价程序有和文字模式版本完全相同的组件。它有一个include声明、一个程序进入点、一个函数呼叫和一个return语句。下面便是该程序:*HelloMsgcDisplays"Hello,Windows!"inamessagebox(c)CharlesPetzold,*#include<windowsh>intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow){MessageBox(,TEXT("Hello,Windows!"),TEXT("HelloMsg"),)return}在剖析该程序之前让我们看一下在VisualCDeveloperStudio中建立新程序的方式。首先从File菜单中选New。在New对话框中单击Projects页面标签选择WinApplication。在Location栏中选择一个子目录在ProjectName栏中输入该项目的名称此时该名称是HelloMsg这便是在Location栏中显示的目录的子目录。CreateNewWorkspace复选框应该勾起来Platforms部分应该显示Win选择OK。将会出现一个标题为WinApplicationStepOf的对话框指出要建立一个EmptyProject并按下Finish按钮。从File菜单中再次选择New。在New对话框中选择Files页面标签选择CSourceFile。AddToProject复选框应被选中并应显示HelloMsg。在FileName栏中输入HelloMsgc选中OK。现在您可输入上面所示的HELLOMSGC文件您也可以选择Insert菜单和FileAsText选项从本书附带的CDROM上复制HELLOMSGC的内容。从结构上说HELLOMSGC与KR的「hello,world」程序是相同的。表头文件STDIOH已被WINDOWSH所代替进入点main被WinMain所代替而且C语言执行时期链接库函数printf被WindowsAPI函数MessageBox所代替。然而在程序中有许多新东西包括几个陌生的大写标识符。让我们从头开始。表头文件HELLOMSGC以一个前置处理器指示命令开始实际上在每个用C编写的Windows程序的开头都可看到:DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版#include<windowsh>WINDOWSH是主要的含入文件它包含了其它Windows表头文件这些表头文件的某些也包含了其它表头文件。这些表头文件中最重要的和最基本的是:WINDEFH基本型态定义。WINNTH支持Unicode的型态定义。WINBASEHKernel函数。WINUSERH使用者接口函数。WINGDIH图形设备接口函数。这些表头文件定义了Windows的所有数据型态、函数呼叫、数据结构和常数标识符它们是Windows文件中的一个重要部分。使用VisualCDeveloperStudio的Edit菜单中的FindinFiles搜索这些表头文件非常方便。您还可以在DeveloperStudio中打开这些表头文件并直接阅读它们。程序进入点正如在C程序中的进入点是函数main一样Windows程序的进入点是WinMain总是像这样出现:intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)该进入点在PlatformSDKUserInterfaceServicesWindowingWindowsWindowReferenceWindowFunctions中有说明。它在WINBASEH中声明如下:intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)您会注意到我在HELLOMSGC中做了许多小改动。第三个参数在WINBASEH中定义为LPSTR我将它改为PSTR。这两种数据型态都定义在WINNTH中作为指向字符串的指针。LP前缀代表「长指针」这是位Windows下的产物。我还在WinMain声明中改变了两个参数的名称。许多Windows程序中的变量名使用一种称作「匈牙利表示法」的命名系统该系统在变量名称前面增加了表示变量数据型态的短前缀我将在第三章更详细地讨论这个概念。现在仅需记住前缀i表示int、sz表示「以零结束的字符串」。WinMain函数声明为返回一个int值。WINAPI标识符在WINDEFH定义语句如下:#defineWINAPIstdcall该语句指定了一个呼叫约定包括如何生产机械码以在堆栈中放置函数呼叫的参数。许多Windows函数呼叫声明为WINAPI。WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下该句柄唯一地标识该程序还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中当同时运行同一程序多次时您便创建了该程序的「多个执行实体(multipleinstances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。在位Windows版本中该概念已被抛弃。传给WinMain的第二个参数总是(定义为)。WinMain的第三个参数是用于执行程序的命令列。某些Windows应用程序利用它在程序启动时将文件加载内存。WinMain的第四个参数指出程序最初显示的方式可以是正常的或者是最大化地充满整个画面或者是最小化显示在工作列中。我们将在第三章中介绍使用该参数的方法。BarryHighlightBarryHighlightBarryHighlightBarryHighlightBarryHighlightBarryArrowBarryArrowBarryHighlightDefoeTutyysoftyahoocomcnWindows程序设计PDF美化版MessageBox函数MessageBox函数用于显示短信息。虽然MessageBox显示的小窗口不具有什么功能实际上它被认为是一个对话框。MessageBox的第一个参数通常是窗口句柄我们将在第三章介绍其含义。第二个参数是在消息框主体中显示的字符串第三个参数是出现在消息框标题栏上的字符串。在HELLMSGC中这些文字字符串的每一个都被封装在一个TEXT宏中。通常您不必将所有字符串都封装在TEXT宏中但如果想将您的程序转换为Unicode字符集这确是一个好主意。我将在第二章详细讨论该问题。MessageBox的第四个参数可以是在WINUSERH中定义的一组以前缀MB开始的常数的组合。您可从第一组中选择一个常数指出希望在对话框中显示的按钮:#defineMBOKxL#defineMBOKCANCELxL#defineMBABORTRETRYIGNORExL#defineMBYESNOCANCELxL#defineMBYESNOxL#defineMBRETRYCANCELxL如果在HELLOMSG中将第四个参数设置为则仅显示「OK」按钮。可以使用C语言的OR(|)操作符号将上面显示的一个常数与代表内定按钮的常数组合:#defineMBDEFBUTTONxL#defineMBDEFBUTTONxL#defineMBDEFBUTTONxL#defineMBDEFBUTTONxL还可以使用一个常数指出消息框中图标的外观:#defineMBICONHANDxL#defineMBICONQUESTIONxL#defineMBICONEXCLAMATIONxL#defineMBICONASTERISKxL这些图标中的某些有替代名称:#defineMBICONWARNINGMBICONEXCLAMATION#defineMBICONERRORMBICONHAND#defineMBICONINFORMATIONMBICONASTERISK#defineMBICONSTOPMBICONHAND虽然只有少数其它MB常数但您可以自己参考表头文件或PlatformSDKUserInterfaceServicesWindowingDialogBoxesDialogBoxReferenceDialogBoxFunctions里的文件。在本程序中MessageBox返回数值但更严格地说它返回IDOKIDOK在WINUSERH中定义等于。根据在消息框中显示的其它按钮MessageBox函数还可返回IDYES、IDNO、IDCANCEL、IDABORT、IDRETRY或IDIGNORE。这个小的Windows程序真的与KR的「hello,world」程序有着同等效果吗?您也许认为不是因为MessageBox函数并没有「hello,world」中printf函数所具有的潜在格式化文字能力。但我们将在下一章中看到编写类似printf的MessageBox版本的方法。编译、连结和执行当您准备编译HELLOMSG时您可从「Build」菜单中选择「BuildHellomsgexe」或者按F或者在「Build」工具列中选择「Build」图标。(该图标的外观显示在「Build」菜单中。如果当前没有显示「Build」工具列您可从「Tools」菜单中选择「Customize」并选择「Toolbars」页面标签选中「Build」或者「BuildMiniBar」。)另一种方法您可从「Build」菜单中选择「ExecuteHellomsgexe」或者按「CtrlF」或DefoeTutyysoftyahoocomcnWindows程序设计PDF美化版者在「Build」工具列单击「ExecuteProgram」图标(该图标看上去像一个红的感叹号)就会弹出一个消息框询问是否编译该程序。正常情况下在编译阶段编译器从C原始码文件产生一个OBJ(目标)文件。在连结阶段连结程序结合OBJ文件和LIB(库)文件以建立EXE(可执行)文件。通过在「Project」页面标签上选择「Settings」并单击「Link」页面标签可以查看这些库文件的列表。特别地您会注意到KERNELLIB、USERLIB和GDILIB。这些是三个主要Windows子系统的「引用链接库」。它们包含了动态链接库的名称以及放进EXE文件的引用信息。Windows使用该信息处理程序对KERNELDLL、USERDLL、GDIDLL动态链接库中函数的呼叫。在VisualCDeveloperStudio中您可用不同的设定编译和连结程序。内定情况下它们是「Debug」和「Release」。可执行文件被存放在以这些名称命名的子目录下。在Debug设定下信息被附加到EXE文件中这些信息有助于测试程序和追踪原始码。如果您喜欢在命令列下工作附上的CDROM包含所有范例程序的MAK(make)文件。(可通过「Tools」菜单选择「Options」再选择「Build」页面标签来告诉DeveloperStudio生成make文件。这里有一个复选框需要勾选)。您需要执行在DeveloperStudio的BIN子目录下的VCVARSBAT来设置环境变量。要从命令列执行make文件可以转到HELLOMSG目录并执行:NMAKEfHelloMsgmakCFG="HelloMsgWinDebug"或者NMAKEfHelloMsgmakCFG="HelloMsgWinRelease"然后您可通过输入:DEBUGHELLOMSG或者class=settRELEASEHELLOMSG从命令列执行EXE文件。我已经在本书附上的CDROM中对项目文件中的内定Debug设定做了一个改动。在「ProjectSettings」对话框中选择「CC」页面标签后在「PreprocessorDefinitions」栏中我已定义了标识符UNICODE。我将在下一章中对此有更多的解释。BarryHighlightDefoeTutyysoftyahoocomcnWindows程序设计PDF美化版第二章Unicode简介在第一章中我已经预告C语言中在MicrosoftWindows程序设计中扮演着重要角色的任何部分都会讲述到您也许在传统文字模式程序设计中还尚未遇到过这些问题。宽字符集和Unicode差不多就是这样的问题。简单地说Unicode扩展自ASCII字符集。在严格的ASCII中每个字符用位表示或者计算机上普遍使用的每字符有位宽而Unicode使用全位字符集。这使得Unicode能够表示世界上所有的书写语言中可能用于计算机通讯的字符、象形文字和其它符号。Unicode最初打算作为ASCII的补充可能的话最终将代替它。考虑到ASCII是计算机中最具支

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/49
仅支持在线阅读

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部