版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
附件1:外文资料翻译译文Windows的编程模式不管您使用什么样的开发工具,Windows程序设计同已经过时的面相批命令或面向事务的程序设计已经有了根本的不同。作为开始,您必须了解一些有关Windows的基础知识,我们将参照大家数值的MS-DOS编程模式来进行介绍。尽管读者现在可能已不再编写纯粹的MS-DOS程序了,但相信读者对MS-DOS编程还是比较熟悉的。1.1.1消息处理当用C来编写MS-DOS应用程序时,最起码要又一个mian函数。当用户运行改应用程序时,操作系统会自动条用main,从这一点上讲,您可以使用任何所需要的程序结构。如果程序需要得到用户的键盘输入,或者需要使用操作系统所提供的功能,那么它就可以调用适当的函数,如getchar,或者使用基于字符的窗口库。当Windows操作系统运行程序时,它首先调用程序中的WinMain函数。因此,在Windows应用程序中一定要有WinMain函数,该函数一般用来完成某些特殊的任务,其中最重要的任务就是要创建该应用程序的“主窗口”。“主窗口”中必须包含用来处理Windows所发送的消息的代码。基于Windows的程序和机遇MS-DOS的程序之前的一个最根本的差别,就在于MS-DOS程序师通过调用操作系统的功能来获得用户输入的,而Windows程序则是通过操作系统发送的消息来处理用户输入的。说明:许多Windows开发环境,包括使用MicrosoftMFC库4.21版的MicrosoftVisualC++5.0,都通过隐藏WinMain函数及构造消息―控制机制来简化编程。虽然使用MFC库编程不需要WinMain函数,但是弄清楚操作系统和程序之间的这种联系时最基本的要求。许多Windows消息都经过了严格的定义,并且适用于所有的程序。例如,当窗口被创建时系统就会发送WM_CREATE消息,当用户按下鼠标的左键时就会发送WM_LBUT-TONDOWN消息,当用户敲了一个字符键时系统就会发送WM_CHAR消息,而当用户关闭窗口时系统又会发送WM_CLOSE消息。所有的消息都有32位的参数,可以保存如光标位置、键盘码等这样的信息。当用户进行菜单选择和对话框按钮单击操作时,系统又会相应的发送WM_COMMAND(命令消息)给适当的窗口。命令消息的参数则完全依赖于窗口的菜单设计。您还可以定义一些自己的消息,您的程序可以向桌面上的任何窗口发送这些消息,这些用户自定义的消息实际上使 C++有点像SmallTalk。您完全用不着担心如何使用这些消息与代码联系起来,因为这是应用程序框架的事情。不过需要注意的是,Windows的这种消息处理机制同事也强加给了用户程序许多固定的结构。因此,不要强迫Windows程序看起来像老式的MS-DOS,只要自己研究一下本书中的例子,读者就不难发现这些程序看起来的确与以往的程序有所不同。1.1.2Windows的图形设备接口许多MS-DOS程序都直接往视频存储区或打印机端口输送数据,这种做法的不利之处在于需要对每种显示卡或打印机类型提供相应的驱动程序。Windows则提供了一个抽象的接口,称作图形设备接口(GDI)。Windows已经提供了各种显示卡及打印机的驱动程序,这样我们的程序就可以不必关心与系统相连的显示卡及打印机的类型。我们的程序可以通过调用GDI函数和硬件打交道,而各种GDI函数会自动参考被称为设备环境的数据结构。Windows会自动将设备环境结构映射到相应的物理设备,并且会提供正确的输入/输出指令。GDI在处理速度上几乎和直接进行视频访问一样快,并且它还允许Windows的不同应用程序共享显示器。1.1.3基于资源的程序设计在MS-DOS下,为了实现数据驱动程序设计,必须将数据定义为初始化常量,或者提供单独的数据文件供程序读取。而当进行Windows程序设计时,则可以用一些特殊的格式将这些数据存储在资源文件中,这样,连接器就可以把由C++编译器输出的二进制代码和二进制资源文件结合起来生成可执行程序。资源文件可以包含位图、图标、菜单定义、对话框设计和字符串,甚至可以包含用户自定义的格式。我们可以用文本编辑器来编辑程序,而对各种资源则常用“所见即所得”(wysiwyg)风格的工具来加以编辑。例如,我们在设计对话框时,可以首先从被称为控件箱的图标组中选取适当的元素(按钮、列表框等),然后再通过鼠标来进行定位和尺寸设置。MicrosoftVisualC++6.0对各种标准的资源格式都提供了图形资源编辑器。1.1.4内存管理Windows的每一个新版本中,内存管理都会比过去跟容易,如果您听过关于锁住内存句柄、形式替换程序以及内存申请管理等很繁琐的细节的话,您现在就不必担心了,因为这些都过去了。现在我们可以非常简单地申请到所需要的内存,至于细节问题则完全由Windows来控制。第十章介绍Win32所采取的内存管理技术,包括虚拟内存和内存映射文件。1.1.5动态链接库在MS-DOS环境下,所有程序的目标模块在创建过程中都被静态地连接起来。而Windows则允许动态地连接,即一些特定结构的库可以再运行过程中被装入和连接,并且多个应用程序可以共享一个动态链接库(DLLs),这样可以大大节省内存和磁盘空间。同时,动态连接还可以大大提高程序的模块灵活性,因为我们可将动态连接库单独编译和调试。设计者起初创建DLL时完全是为C语言而设计的,C++则使这一问题变得有些复杂。Microsoft基本类库的开发者们已经将应用程序框架的所有类组合进了几个已经建好的动态链接库中,我们可以把应用程序框架类静态或者动态连接到我们的应用程序中,并且我们还以创建自己的基于MFCDLL的MFC扩展DLL。第二十二章详细介绍了如何创建MFC扩展DLL和常规DLL。1.1.6Win32应用程序编程接口以前的Windows程序员用C语言在Win16应用程序编程接口(API)上开发应用程序。现在,如果想写32位的应用程序的话,则不管是直接还是间接,都必须使用新的Win32API。大多数的Win16函数都有对应的Win32函数,但许多参数却有了变化一一如16位的参数用32位参数来替代。Win32API还提供了许多新的函数,包括磁盘I/O函数,而在以前,磁盘操作函数是通过MS-DOS调用完成的。用16位版本的VisualC++,MFC程序员可以不管这些函数调用,因为他们只要按MFC得标准编写程序即可,而MFC的标准在Win16和Win32下都是适用的。1.2VisualC++的组成VisualC++包含了两套完整的Windows应用程序开发系统。如果读者愿意,仍然可以使用使用Win32API来开发C语言写的Windows应用程序。C语言的Win32编程技术在CharlesPetazold的《ProgammingWindows95》(MicrosoftPress,1996)中进行评述。我们可以利用DevelopStudio和VisualC++所提供的一些新的工具(包括资源编辑器)使底层Win32程序的编写更加方便。VisualC++也包括ActiveX模块库(ActiveXTemplateLibrary,ATL),我们可以用它来开发在Internet上使用的ActiveXX控件。ATL编程既不是Win32的C语言编程,也不是MFC的编程,而是非常复杂的,足够写一本书来讲述。然而本书并不是关于如何使用C语言的Win32来编程,也不是ATL编程,而是关于如何用VisualC++所提供的MFC库应用程序框架来进行C++程序设计。在这里,我们将使用《MicrosoftVisualC++MFCLibraryReferenc》(MicrosoftPress,1997)书中所介绍的C++类,并将会使用应用程序框架的专用VisualC++工具,如AppWizard及ClassWizard等。说明:使用MFC库程序设计接口并不意味着您就不能使用Windows的Win32函数,实际上,您几乎总是需要在MFC库程序中直接调用Win32函数。迅速地浏览一下VisualC++的各组成元素将有助于读者理解应用程序框架。图1-1描述了VisualC++应用程序的大致创建过程。1.2.1MicrosoftVisualC++6.0和创建过程VisualStudio是一个运行于Windows及其上的集成开发环境,它是VisualC++6.0、TheVisualC++IDE、MicrosoftVisualJ++和其他几个产品所公用的开发环境。该IDE来源于原先的VisualWorkbench,而VisualWorkbench又来源于QuickCforWindows。贴边窗口和可配置的工具栏,再加上一个可运行的可定制编辑器,这就是目前的VisualStudio的组成部分。联机帮助系统的工作方式则像一个Web浏览器。图1-2显示了VisualC++6.0工作时的情形。如果您使用过以前的VisualC++版本或者BorlandIDE,那么就已经知道VisualC++6.0是如何工作的了,但如果您对集成开发环境还比较陌生的话,则必须弄清楚什么是项目。“项目”是一些相关联的源文件的集合,这些源文件经过编译、连接,然后被组合在一起形成可执行的Windows应用程序或者是口11。项目源文件一般被存储在一个单独的子目录中,但它也需要依赖于孩子目录之外的许多文件,如包含文件和库文件。熟练地程序员对于make文件不会感到陌生。make文件包岑了编译器和连接器的参数选项,还表述了所有文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等)。创建程序(make程序)首先读取make文件,然后再激活编译器、汇编器、资源编译器和连接器以便产生最好的输出。最好输出并生成的通常是可执行文件。创建程序利用内置的推理规则来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件。在VisualC++6.0的项目中,没有make文件(后缀为MAK),除非我们专门输出一个,但一个文本格式的项目文件(后缀为DSP)有着同样的功能。一个独立的文本格式的工作空间文件(workspace,后缀为DSW)对工作空间中的每一个项目都有一个入口,在一个工作空间中可以有多个项目,不过本书中的所有例子的工作空间只有一个项目。要在一个已经存在的项目上继续工作,只要VisualC++中打开相应的DSW文件,然后就可以编辑和编译该项目了。VisualC++也会建立许多中间文件,下表列出了在VisualC++工作空间里产生的文件:1.2.2资源编辑器-WorkspaceResourceView当单击VisualC++的Workspace窗口中的ResourceView标签时,我们就可以选择一个资源进行编辑,主窗口会自动为该类型的资源选择适当的资源编辑器。该窗口会为菜单选择一个所见即得的编辑器,为对话框选择一个功能很强的图形编辑器,并有一些工具可用于编辑图标、位图和字符串。对话框编辑器可以插入标准Windows空间和新的Windows通用控件,也可以插入ActiveX控件。第三章显示了ResourceView的一幅图及一个资源编辑器(对话框编辑器)。每一个项目通常都有一个文本格式的资源描述(RC)文件,该文件描述了项目的菜单、对话框、字符串和热键资源。RC文件也有#include语句可以将位于其他子目录下的资源包含进来。这些资源包括与该项目相关的项,如位图(BMP)和图标(ICO)文件,以及对所有VisualC++程序通用的资源,如错误信息串等。在资源编辑器以外RC文件进行编辑是不提倡的。资源编辑器也可以EXE喝DLL文件,因此我们可以用剪贴板来“偷”资源,如其他Windows应用程序的位图和图标等。1.2.3C/C++编译器VisualC++的编译器可以处理C和C++源代码,它通过源代码文件名的后缀来识别代码本身所使用的语言。C后缀代表C源代码,CPP或CXX则代表C++源代码。该编译器与所有的ANSI标准兼容,包括C++库工作组的最新建议,还增加了一些Microsoft扩充内容。VisualC++6.0版还支持模版(template)、异常(exception)和运行时类型识别(runtimetypeidentification,RTTI)。新的C++标准模板库(StandardTemplateLibrary,STL)也被包括了进来,但它并没有集成到MFC库中。1.2.4资源编译器VisualC++资源编译器从资源编辑器读取一个ASCII资源描述(RC)文件,并生成一个二进制RES文件提供给连接器。1.2.5连接器连接器读入由C/C++编译器产生的OBJ文件和有资源编译器的RES文件,同时处理MFC的LIB库文件、运行时库代码及Windows代码,然后产生项目的EXE文件。有一个增量连接选项(incrementallinkoption)可以再源程器变化不大的情况下减少执行的时间。由于MFC头文件中包含的#口^8!^语句(特殊的编译指示)已指定了所要求的库文件,所以我们不必再告诉连接器该读哪些库。1.2.6调试器如果程序被第一运行,则用不着使用调试器,可是以后就少不了一次又一次的使用调试器了。VisualC++调试器的稳定性有了很大提高,但当然仍不可能修正所有的错误。调试器和DevelpoerStudio紧密配合以便保证断点可以被保存在磁盘上。通过工具栏按钮可以插入和删除断点,控制单步执行。图1—3显示了正在运行的VisualC++调试器,注意,Variable和Watch窗口可将对象指针展开以便显示出派生类和积累的所有数据成员。如果我们把光标放在简单变量的位置上,则调试器还会在一个小窗口中显示它的值。为了能够对程序进行调试,在创建程序时必须设置相应的编译器和连接器的选项,以便产生相应的可调试信息。1.2.7AppWizardAppWizard是一个代码生成器,它会按照用户通过对话框指定的特性、类名及源代码文件名来产生Windows应用程序的工作构架。我们在学习本书中所提供的例子时需要经常使用AppWizard。不过,不要把AppWizard同以前的那种可以为应用产生所有代码的代码生成器混淆起来。AppWizard所产生的代码只是一些基本代码,它所完成的功能则完全由应用程序框架的基类所决定。AppWizard可以使用户很快地开始一个新的应用程序。高级的用户开发者可以建立定制的AppWizard,Microsoft公司已经公开了用于生成项目的宏系统。如果用户需要建立很多带有远程通讯接口的项目,则可以建立一个特制的向导来自动完成这一过程。1.2.8ClassWizardClassWizard(它是通过DLL来实现的)可以通过DeveloperStudio的View菜单来运行,它极大的方便了VisualC++类代码的编辑工作。想添加新的类或新的虚拟函数,或新的Windows消息控制函数吗?ClassWizard能够给出原型、函数体以及将消息同应用程序框架相联系的相应代码。ClassWizard还可以用来对用户自己编写的类的代码进行修改,这就解决了令一般代码生成器感到头疼的维护问题。有些ClassWizard的特性可以通过DeveloperStudioWizardBar工具栏来实现,见图1-2。2.9源程序浏览器如果某个程序使我们从头到尾编写的,那么我们一定会对其中的源代码文件、类及成员函数了如指掌,但如果遇到了别人编写的程序,我们若想搞清楚就需要一些帮助了。VisualC++的源程序浏览器(简称“浏览器”)能够使我们从类或函数的角度来了解(和编辑)程序,而不是直接从文件入手,这有点像其他的面向对象库(如Smalltalk)的“检查器”。浏览器有如下几种查看状态:DefinitionsandReferences如果选择任何函数、变量、类型、宏定义或者类,都会马上看到它是在项目中的什么地方定义的,并且在哪些地方用到了它。CallGraph/CallerGraph一对于所选择的函数,给出它的调用与被调用函数的图示。DerivedClassGraph/BaseClassGraph—给出类层次关系的图形表示。对于所选择的类,我们可以看到它的派生类或者基类以及成员,并且可以利用鼠标来控制层次结构的扩展。FileOutlin一对于所选择的文件,列出文件中的类、函数和数据成员,同时还同步显示它们定义的位置和在项.目中使用的位置。第三章中给出了一个典型的浏览器窗口。说明:如果我们重新安排了源代码文件中的代码行,则VisualC++6.0会在重新编译连接时更新浏览器数据库。但这会增加编译连接的时间。除了浏览器之外,VisualC++还有一个C1assView的选项,它不依赖于浏览器数据库。我们可以在ClassView窗口中看到项目中所有类的树状视图,可以显示成员函数和数据成员。在每个小单元上双击鼠标,可以立即切换到相应的源代码。然而,ClassView,不能显示层次信息,而浏览器则可以。联机帮助VisualC++6.0包含一个全新的基于HTML的联机帮助系统。每一个主题都用一个独立的HTML文档来表达,而且所有的主题都组织起来,根据索引文件(IVI),形成了InfoViewer标题文件(IVT)oInfoView窗口使用了从MicrosoftInternetExplorer4.0引用过来的地址码,所以看起来有点像人们熟知的Web浏览器。VisualC++可以0从VisualC一的CD-ROM默认安装选项)上访问IVT文件,也可以从硬盘上读取,还可以读取Internet上的HTML文件。VisualC++6.0允许以四种方式启动帮助系统:按书(街book)一当我们从DeveloperStudi。的Help菜单中选择。intents时,Workspace窗口切换到Infoview模式,这里DeveloperStudio,VisualC++和Win32SDK的文档按书和章节的层次被组织在一起。按主题(脚topic)一当我们从DeveloperStudio的Help菜单中选择Search并单击In-dex标签时,只要输入一个关键字,就可以看到包含该关键字的主题和文章。按词(Byword)—当我们从DeveloperStudi。的Help菜单中选择,earch并单击Query标签时,只要输人一组词,就可以查到包含这些词的主题和文章。按Fl(Flhelp)—这是对程序员最友好的方式。只要把光标移到函数、宏或者类名上,然后按下F1键,就会启动帮助系统。如果名字在几个地方被发现一例如在MFC和Win32帮助文件中都有一则我们还可以从列表窗口中选择我们所期望的主题。不管使用什么方式启动联机帮助,我们都可以把帮助中的文本拷贝到剪贴板上,然后插人到我们的程序中去。诊断工具VisualC++6.0一包含一些很有用的的诊断工具。SPY++给出了系统进程、线程和窗口的一个树形视图,通过它可以观察正在运行的应用程序的窗口及消息。 PVIEW(在Windows95下为PVIEW95)对于消除Windows95的任务列表中看不到的错误进程是非常有用的(WindowsNTTaskManager可以替代PVIEW,用右键单击工具栏可以启动.TaskManager).VisualC++还包括一整套ActiveX工具、一个ActiveX控件测试程序、HCRTF帮助编译器、一个库管理器、二进制文件查看器和编辑器、一个源码分析器和其他一些工具。唯一所缺少的是VisualC++6.0的16位版本的DBWIN实用工具。如果我们想查看程序的调试信息,就必须通过调试器来运行程序。源代码控制Microsoft最近买下了一个称为SourceSafe的现成的源代码控制产品的版权,该产品包含在VisualC++的企业版中,并被集成进了VisualC++,因此我们可以用它来管理大的软件项目。项目中源代码的主拷贝保存在网络的中枢地点,程序员可以取出(checkouo部分代码来修改,而这些代码通常保存在程序员的本地硬盘上;在程序员放回(checkin)了修改的文件后,小组的其他成员就可以同步他们的本地硬盘拷贝与主拷贝一致。其他的一些源代码控制系统也可以集成到VisualC++中来。GalleryTheVisualC++Gallery使用户可以在不同的项目之间共享软件组件。Gallery管理下面三种类型的模块:ActiveX控件一当我们安装一个ActiveX控件(OCX—以前的OLE控件)后,在Windows的注册表(Registry)中就多了一个条目,所有被注册的ActiveX控件都会出现在illery的窗口里,因此我们可以在任何项目中使用它们。C++源程序模块一当我们写了一个新类后,我们可以把它的代码加到Gallery中,然后这些代码就可以被选择并拷贝到其他的项目里。我们也可以把资源加到Gallery中。VisualC++6.0组件一Gallery也包含一些工具,我们可以用这些工具为项目加一些特性,这样的工具可能会把新的类、函数、数据成一员和资源插人到一个项目中。Microsoft提供了一些组件模块作为VisualC++的一部分(如空闲时间处理、调色板支持和飞溅屏幕(Splashscreen)等),其他还有一些由第三方软件厂商提供的组件模块。说明:如果您决定使用VisualC++。随带的组件模块,则最好先在一个测试用的项目中测试一下该组件,看它是否真正是您想要的。否则,您将很难完全从正式的项目中把加进来的代码去掉。所有用户产生的Gallery条目都可以从OGX文件中引人,也可以引出到OGX文件中去。这些文件将作为新的产品发布,并可以作为VisualC一组件被共享。Microsoft基本类库6.0版Microsoft基本类库6.0版(简称MFC库)是本书所要讨论的主题,它定义了我们马上就要讲到的应用程序框架。从第二章开始,我们将给读者介绍一些实际的代码及一些重要概念。ActiveX模板库ATL是一个完全独立于MFC的工具,用它可以建立ActiveX控件。用户既可以用MFC建立ActiveX控件,也可以用ATL建立ActiveX控件,但An控件相对来说又小又快,适合于在Internet上使用。附件2:外文原文(复印件)1.1TheWindowsProgrammingModelNomatterwhichdevelopmenttoolsyouuse,programmingforWindowsisdifferentfromold-stylebatch-orientedortransaction-orientedprogramming.Togetstarted,youneedtoknowsomeWindowsfundamentals.Asaframeofreference,we'llusethewell-knownMS-DOSprogrammingmodel.Evenifyoudon'tcurrentlyprogramforplainMS-DOS,you'reprobablyfamiliarwithit.1.1.IMessageProcessingWhenyouwriteanMS-DOS-basedapplicationinC,theonlyabsoluterequirementisafunctionnamedmain.Theoperatingsystemcallsmainwhentheuserrunstheprogram,andfromthatpointon,youcanuseanyprogrammingstructureyouwant.Ifyourprogramneedstogetuserkeystrokesorotherwiseuseoperatingsystemservices,itcallsanappropriatefunction,suchasgetchar,orperhapsusesacharacter-basedwindowinglibrary.WhentheWindowsoperatingsystemlaunchesaprogram,itcallstheprogram'sWinMainfunction.SomewhereyourapplicationmusthaveWinMain,whichperformssomespecifictasks.Itsmostimportanttaskiscreatingtheapplication'smainwindow,whichmusthaveitsowncodetoprocessmessagesthatWindowssendsit.AnessentialdifferencebetweenaprogramwrittenforMS-DOSandaprogramwrittenforWindowsisthatanMS-DOS-basedprogramcallstheoperatingsystemtogetuserinput,butaWindows-basedprogramprocessesuserinputviamessagesfromtheoperatingsystem.Note:ManydevelopmentenvironmentsforWindows,includingMicrosoftVisualC++version6.0withtheMicrosoftFoundationClass(MFC)Libraryversion6.0,simplifyprogrammingbyhidingtheWinMainfunctionandstructuringthemessage-handlingprocess.WhenyouusetheMFClibrary,youneednotwriteaWinMainfunctionbutitisessentialthatyouunderstandthelinkbetweentheoperatingsystemandyourprograms.MostmessagesinWindowsarestrictlydefinedandapplytoallprograms.Forexample,aWM_CREATEmessageissentwhenawindowisbeingcreated,aWM_LBUTTONDOWNmessageissentwhentheuserpressestheleftmousebutton,aWM_CHARmessageissentwhentheusertypesacharacter,andaWM_CLOSEmessageissentwhentheuserclosesawindow.Allmessageshavetwo32-bitparametersthatconveyinformationsuchascursorcoordinates,keycode,andsoforth.WindowssendsWM_COMMANDmessagestotheappropriatewindowinresponsetousermenuchoices,dialogbuttonclicks,andsoon.Commandmessageparametersvarydependingonthewindow'smenulayout.Youcandefineyourownmessages,whichyourprogramcansendtoanywindowonthedesktop.Theseuser-definedmessagesactuallymakeC++lookalittlelikeSmalltalk.Don'tworryyetabouthowthesemessagesareconnectedtoyourcode.That'sthejoboftheapplicationframework.Beaware,though,thattheWindowsmessageprocessingrequirementimposesalotofstructureonyourprogram.Don'ttrytoforceyourWindowsprogramstolooklikeyouroldMS-DOSprograms.Studytheexamplesinthisbook,andthenbepreparedtostartfresh.1.1.2TheWindowsGraphicsDeviceInterfaceManyMS-DOSprogramswrotedirectlytothevideomemoryandtheprinterport.Thedisadvantageofthistechniquewastheneedtosupplydriversoftwareforeveryvideoboardandeveryprintermodel.WindowsintroducedalayerofabstractioncalledtheGraphicsDeviceInterface(GDI).Windowsprovidesthevideoandprinterdrivers,soyourprogramdoesn'tneedtoknowthetypeofvideoboardandprinterattachedtothesystem.Insteadofaddressingthehardware,yourprogramcallsGDIfunctionsthatreferenceadatastructurecalledadevicecontext.Windowsmapsthedevicecontextstructuretoaphysicaldeviceandissuestheappropriateinput/outputinstructions.TheGDIisalmostasfastasdirectvideoaccess,anditallowsdifferentapplicationswrittenforWindowstosharethedisplay.1.1.3Resource-BasedProgrammingTododata-drivenprogramminginMS-DOS,youmusteithercodethedataasinitializationconstantsorprovideseparatedatafilesforyourprogramtoread.WhenyouprogramforWindows,youstoredatainaresourcefileusinganumberofestablishedformats.ThelinkercombinesthisbinaryresourcefilewiththeC++compiler'soutputtogenerateanexecutableprogram.Resourcefilescanincludebitmaps,icons,menudefinitions,dialogboxlayouts,andstrings.Theycanevenincludecustomresourceformatsthatyoudefine.Youuseatexteditortoeditaprogram,butyougenerallyuseWysiwyg(whatyouseeiswhatyouget)toolstoeditresources.Ifyou'relayingoutadialogbox,forexample,youselectelements(buttons,listboxes,andsoforth)fromanarrayoficonscalledacontrolpalette,andyoupositionandsizetheelementswiththemouse.MicrosoftVisualC++6.0hasgraphicsresourceeditorsforallstandardresourceformats.1.1.4MemoryManagementWitheachnewversionofWindows,memorymanagementgetseasier.Ifyou'veheardhorrorstoriesaboutlockingmemoryhandles,thunks,andburgermasters,don'tworry.That'sallinthepast.Todayyousimplyallocatethememoryyouneed,andWindowstakescareofthedetails.Chapter10describescurrentmemorymanagementtechniquesforWin32,includingvirtualmemoryandmemory-mappedfiles.1.1.5DynamicLinkLibrariesIntheMS-DOSenvironment,allofaprogram'sobjectmodulesarestaticallylinkedduringthebuildprocess.Windowsallowsdynamiclinking,whichmeansthatspeciallyconstructedlibrariescanbeloadedandlinkedatruntime.Multipleapplicationscansharedynamiclinklibraries(DLLs),whichsavesmemoryanddiskspace.DynamiclinkingincreasesprogrammodularitybecauseyoucancompileandtestDLLsseparately.DesignersoriginallycreatedDLLsforusewiththeClanguage,andC++hasaddedsomecomplications.TheMFCdeveloperssucceededincombiningalltheapplicationframeworkclassesintoafewready-builtDLLs.Thismeansthatyoucanstaticallyordynamicallylinktheapplicationframeworkclassesintoyourapplication.Inaddition,youcancreateyourownextensionDLLsthatbuildontheMFCDLLs.Chapter22includesinformationaboutcreatingMFCextensionDLLsandregularDLLs.1.1.6TheWin32ApplicationProgrammingInterfaceEarlyWindowsprogrammerswroteapplicationsinCfortheWin16applicationprogramminginterface(API).Today,ifyouwanttowrite32-bitapplications,youmustusethenewWin32API,eitherdirectlyorindirectly.MostWin16functionshaveWin32equivalents,butmanyoftheparametersaredifferent—16-bitparametersareoftenreplacedwith32-bitparameters,forexample.TheWin32APIoffersmanynewfunctions,includingfunctionsfordiskI/O,whichwasformerlyhandledbyMS-DOScalls.Withthe16-bitversionsofVisualC++,MFCprogrammerswerelargelyinsulatedfromtheseAPIdifferencesbecausetheywrotetotheMFCstandard,whichwasdesignedtoworkwitheitherWin16orWin32underneath.1.2TheVisualC++ComponentsMicrosoftVisualC++istwocompleteWindowsapplicationdevelopmentsystemsinoneproduct.Ifyousochoose,youcandevelopC-languageWindowsprogramsusingonlytheWin32API.C-languageWin32programmingisdescribedinCharlesPetzold'sbookProgrammingWindows95(MicrosoftPress,1996).YoucanusemanyVisualC++tools,includingtheresourceeditors,tomakelow-levelWin32programmingeasier.VisualC++alsoincludestheActiveXTemplateLibrary(ATL),whichyoucanusetodevelopActiveXcontrolsfortheInternet.ATLprogrammingisneitherWin32C-languageprogrammingnorMFCprogramming,andit'scomplexenoughtodeserveitsownbook.ThisbookisnotaboutC-languageWin32programmingorATLprogramming.It'saboutC++programmingwithintheMFClibraryapplicationframeworkthat'spartofVisualC++.You'llbeusingtheC++classesdocumentedintheMicrosoftVisualC++MFCLibraryReference(MicrosoftPress,1997),andyou'llalsobeusingapplicationframework-specificVisualC++toolssuchasAppWizardandClassWizard.Note:UseoftheMFClibraryprogramminginterfacedoesn'tcutyouofffromtheWin32functions.Infact,you'llalmostalwaysneedsomedirectWin32callsinyourMFClibraryprograms.Aquickrun-throughoftheVisualC++componentswillhelpyougetyourbearingsbeforeyouzeroinontheapplicationframework.Figure1-1showsanoverviewoftheVisualC++applicationbuildprocess.1.2.IMicrosoftVisualC++6.0andtheBuildProcessVisualStudio6.0isasuiteofdevelopertoolsthatincludesVisualC++6.0.TheVisualC++IDEissharedbyseveraltoolsincludingMicrosoftVisualJ++.TheIDEhascomealongwayfromtheoriginalVisualWorkbench,whichwasbasedonQuickCforWindows.Dockingwindows,configurabletoolbars,plusacustomizableeditorthatrunsmacros,arenowpartofVisualStudio.Theonlinehelpsystem(nowintegratedwiththeMSDNLibraryviewer)workslikeaWebbrowser.Figure1-2showsVisualC++6.0inaction.Ifyou'veusedearlierversionsofVisualC++oranothervendor'sIDE,youalreadyunderstandhowVisualC++6.0operates.Butifyou'renewtoIDEs,you'llneedtoknowwhataprojectis.AprojectisacollectionofinterrelatedsourcefilesthatarecompiledandlinkedtomakeupanexecutableWindows-basedprogramoraDLL.Sourcefilesforeachprojectaregenerallystoredinaseparatesubdirectory.Aprojectdependsonmanyfilesoutsidetheprojectsubdirectorytoo,suchasincludefilesandlibraryfiles.Experiencedprogrammersarefamiliarwithmakefiles.Amakefilestorescompilerandlinkeroptionsandexpressesalltheinterrelationshipsamongsourcefiles.(Asourcecodefileneedsspecificincludefiles,anexecutablefilerequirescertainobjectmodulesandlibraries,andsoforth.)Amakeprogramreadsthemakefileandtheninvokesthecompiler,assembler,resourcecompiler,andlinkertoproducethefinaloutput,whichisgenerallyanexecutablefile.Themakeprogramusesbuilt-ininferencerulesthattellit,forexample,toinvokethecompilertogenerateanOBJfilefromaspecifiedCPPfile.InaVisualC++6.0project,thereisnomakefile(withanMAKextension)unlessyoutellthesystemtoexportone.Atext-formatprojectfile(withaDSPextension)servesthesamepurpose.Aseparatetext-formatworkspacefile(withaDSWextension)hasanentryforeachprojectintheworkspace.It'spossibletohavemultipleprojectsinaworkspace,butalltheexamplesinthisbookhavejustoneprojectperworkspace.Toworkonanexistingproject,youtellVisualC++toopentheDSWfileandthenyoucaneditandbuildtheproject.VisualC++createssomeintermediatefilestoo.ThefollowingtableliststhefilesthatVisualC++generatesintheworkspace.1.2.2TheResourceEditors—WorkspaceResourceViewWhenyouclickontheResourceViewtabintheVisualC++Workspacewindow,youcanselectaresourceforediting.Themainwindowhostsaresourceeditorappropriatefortheresourcetype.Thewindowcanalsohostawysiwygeditorformenusandapowerfulgraphicaleditorfordialogboxes,anditincludestoolsforeditingicons,bitmaps,andstrings.ThedialogeditorallowsyoutoinsertActiveXcontrolsinadditiontostandardWindowscontrolsandthenewWindowscommoncontrols(whichhavebeenfurtherextendedinVisualC++6.0).Chapter3showspicturesoftheResourceViewpageandoneoftheresourceeditors(thedialogeditor).Eachprojectusuallyhasonetext-formatresourcescript(RC)filethatdescribestheproject'smenu,dialog,string,andacceleratorresources.TheRCfilealsohas#includestatementstobringinresourcesfromothersubdirectories.Theseresourcesincludeproject-specificitems,suchasbitmap(BMP)andicon(ICO)files,andresourcescommontoallVisualC++programs,suchaserrormessagestrings.EditingtheRCfileoutsidetheresourceeditorsisnotrecommended.TheresourceeditorscanalsoprocessEXEandDLLfiles,soyoucanusetheclipboardto"steal"resources,suchasbitmapsandicons,fromotherWindowsapplications.1.2.3TheC/C++CompilerTheVisualC++compilercanprocessbothCsourcecodeandC++sourcecode.Itdeterminesthelanguagebylookingatthesourcecode'sfilenameextension.ACextensionindicatesCsourcecode,andCPPorCXXindicatesC++sourcecode.ThecompileriscompliantwithallANSIstandards,includingthelatestrecommendationsofaworkinggrouponC++libraries,andhasadditionalMicrosoftextensions.Templates,exceptions,andruntimetypeidentification(RTTI)arefullysupportedinVisualC++version6.0.TheC++StandardTemplateLibrary(STL)isalsoincluded,althoughitisnotintegratedintotheMFClibrary.1.2.4TheResourceCompilerTheVisualC++resourcecompilerreadsanASCIIresourcescript(RC)filefromtheresourceeditorsandwritesabinaryRESfileforthelinker.1.2.5TheLinkerThelinkerreadstheOBJandRESfilesproducedbytheC/C++compilerandtheresourcecompiler,anditaccessesLIBfilesforMFCcode,runtimelibrarycode,andWindowscode.Itthenwritestheproject'sEXEfile.Anincrementallinkoptionminimizestheexecutiontimewhenonlyminorchangeshavebeenmadetothesourcefiles.TheMFCheaderfilescontain#pragmastatements(specialcompilerdirectives)thatspecifytherequiredlibraryfiles,soyoudon'thavetotellthelinkerexplicitlywhichlibrariestoread.1.2.6TheDebuggerIfyourprogramworksthefirsttime,youdon'tneedthedebugger.Therestofusmightneedonefromtimetotime.TheVisualC++debuggerhasbeensteadilyimproving,butitdoesn'tactuallyfixthebugsyet.ThedebuggerworkscloselywithVisualC++toensurethatbreakpointsaresavedondisk.Toolbarbuttonsinsertandremovebreakpointsandcontrolsingle-stepexecution.Figure1-3illustratestheVisualC++debuggerinaction.NotethattheVariablesandWatchwindowscanexpandanobjectpointertoshowalldatamembersofthederivedclassandbaseclasses.Ifyoupositionthecursoronasimplevariable,thedebuggershowsyouitsvalueinalittlewindow.Todebugaprogram,youmustbuildtheprogramwiththecompilerandlinkeroptionssettogeneratedebugginginformation.1.2.7AppWizardAppWizardisacodegeneratorthatcreatesaworkingskeletonofaWindowsapplicationwithfeatures,classnames,andsourcecodefilenamesthatyouspecifythroughdialogboxes.You'lluseAppWizardextensivelyasyouworkthroughtheexamplesinthisbook.Don'tconfuseAppWizardwitholdercodegeneratorsthatgenerateallthecodeforanapplication.AppWizardcodeisminimalistcode;thefunctionalityisinsidetheapplicationframeworkbaseclasses.AppWizardgetsyoustartedquicklywithanewapplication.AdvanceddeveloperscanbuildcustomAppWizards.MicrosoftCorporationhasexposeditsmacro-basedsystemforgeneratingprojects.Ifyoudiscoverthatyourteamneedstodevelopmultipleprojectswithatelecommunicationsinterface,youcanbuildaspecialwizardthatautomatestheprocess.1.2.8ClassWizardClassWizardisaprogram(implementedasaDLL)that'saccessiblefromVisualC++'sViewmenu.ClassWizardtakesthedrudgeryoutofmaintainingVisualC++classcode.Needanewclass,anewvirtualfunction,oranewmessage-handlerfunction?ClassWizardwritestheprototypes,thefunctionbodies,and(ifnecessary)thecodetolinktheWindowsmessagetothefunction.ClassWizardcanupdateclasscodethatyouwrite,soyouavoidthemaintenanceproblemscommontoordinarycodegenerators.SomeClassWizardfeaturesareavailablefromVisualC++'sWizardBartoolbar,showninFigure1-TheSourceBrowserIfyouwriteanapplicationfromscratch,youprobablyhaveagoodmentalpictureofyoursourcecodefiles,classes,andmemberfunctions.Ifyoutakeoversomeoneelse'sapplication,you'llneedsomeassistance.TheVisualC++SourceBrowser(thebrowser,forshort)letsyouexamine(andedit)anapplicationfromtheclassorfunctionviewpointinsteadoffromthefileviewpoint.It'salittlelikethe"inspector"toolsavailablewithobject-orientedlibrariessuchasSmalltalk.Thebrowserhasthefollowingviewingmodes:DefinitionsandReferences—Youselectanyfunction,variable,type,macro,orclassandthenseewhereit'sdefinedandusedinyourproject.CallGraph/CallersGraph—Foraselectedfunction,you'llseeagraphicalrepresentationofthefunctionsitcallsorthefunctionsthatcallit.DerivedClassesandMembers/BaseClassesandMembers—Thesearegraphicalclasshierarchydiagrams.Foraselectedclass,youseethederivedclassesorthebaseclassesplusmembers.Youcancontrolthehierarchyexpansionwiththemouse.FileOutline—Foraselectedfile,theclasses,functions,anddatamembersappeartogetherwiththeplacesinwhichthey'redefinedandusedinyourproject.AtypicalbrowserwindowisshowninChapter3.Note:Ifyourearrangethelinesinanysourcecodefile,VisualC++regeneratesthebrowserdatabasewhenyourebuildtheproject.Thisincreasesthebuildtime.Inadditiontothebrowser,VisualC++hasaClassViewoptionthatdoesnotdependonthebrowserdatabase.Yougetatreeviewofalltheclassesinyourproject,showingmemberfunctionsa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度网络安全服务及设备采购合同
- 《餐饮与文化》课件
- 2024年度版权许可合同:音乐作品版权使用协议
- 2024年度股权转让协议(含详细股权分配)
- 《黄金培训资料介绍》课件
- 2024年度企业废弃物处理合同
- 2024年度膨润土产品售后服务与技术培训合同
- 大班说课稿课件
- 2023年钢增强塑料复合管资金需求报告
- 2024中国电信湖北襄阳保康分公司招聘18人易考易错模拟试题(共500题)试卷后附参考答案
- 采购订单英文模板适合外企 purchase order
- 中医操作流程图.
- 电子内窥镜图像处理器产品技术要求
- 第一章体能训练概述PPT
- 工程移交单表格1页
- 艾滋病初筛实验室SOP文件
- 《建筑力学》全套课件(完整版)
- 优秀记叙文范文《突围》
- 临时用电申请表.doc
- 建筑防腐蚀工程施工及验收规范(完整版)
- 缠师心法荟萃(摘自悟多整理的缠中说禅博客回复)
评论
0/150
提交评论