高质量C++编程指南:Windows编程指南_第1页
高质量C++编程指南:Windows编程指南_第2页
高质量C++编程指南:Windows编程指南_第3页
高质量C++编程指南:Windows编程指南_第4页
高质量C++编程指南:Windows编程指南_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章、Windows编程指南

9.1Windows编程概念

一、Windows操作系统特点

Windows之所以取得成功,主要在于它具有以下优点:直观、高效的面向对象的图形用户界面,易学易用:从某种意义上说,Windows用户界面和开发环境都是面向对象的。用户采用“选择对象-操作对象”这种方式进行工作。比如要打开一个文档,我们首先用鼠标或键盘选择该文档,然后从右键菜单中选择“打开”操作,打开该文档。这种操作方式模拟了现实世界的行为,易于理解、学习和使用。用户界面统一、友好、漂亮:

Windows应用程序大多符合IBM公司提出的CUA(CommonUserAcess)标准,所有的程序拥有相同的或相似的基本外观,包括窗口、菜单、工具条等。用户只要掌握其中一个,就不难学会其他软件,从而降低了用户培训学习的费用。丰富的设备无关的图形操作:

Windows的图形设备接口(GDI)提供了丰富的图形操作函数,可以绘制出诸如线、圆、框等的几何图形,并支持各种输出设备。设备无关意味着在针式打印机上和高分辨率的显示器上都能显示出相同效果的图形。多任务:

Windows是一个多任务的操作环境,它允许用户同时运行多个应用程序,或在一个程序中同时做几件事情。每个程序在屏幕上占据一块矩形区域,这个区域称为窗口,窗口是可以重叠的。用户可以移动这些窗口,或在不同的应用程序之间进行切换,并可以在程序之间进行手工和自动的数据交换和通信。虽然同一时刻计算机可以运行多个应用程序,但仅有一个是处于活动状态的,其标题栏呈现高亮颜色。一个活动的程序是指当前能够接收用户键盘输入的程序。

二、Windows应用程序设计的特点

Windows编程与DOS环境下编程相比有很大的不同。Windows要求以一种全新的思维方式进行程序设计,主要表现为以下几点:1、事件驱动的程序设计

传统的MS-DOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。一个程序是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方法是面向程序而不是面向用户的,交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。它的基本模型如图1.1所示。事件驱动程序设计是一种全新的程序设计方法,它由事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的的用户用各种合理的顺序来安排程序的流程。

对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的优点。它是一种面向用户的程序设计方法,它在程序设计过程中除了完成所需功能之外,更多的考虑了用户可能的各种输入,并针对性的设计相应的处理程序。它是一种“被动”式程序设计方法,程序开始运行时,处于等待用户输入事件状态,然后取得事件并作出相应反应,处理完毕又返回并处于等待事件状态。它的框图如图1.2所示:

2、消息循环与输入

事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。事件驱动是靠消息循环机制来实现的。消息是一种报告有关事件发生的通知。

Windows应用程序的消息来源有以下四种:

(1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。

(2)控制消息:用来与Windows的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。

(3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,象DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。

(4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。

Windows操作系统包括三个内核基本元件:GDI,KERNEL,USER。其中GDI(图形设备接口)负责在屏幕上绘制像素、打印硬拷贝输出,绘制用户界面包括窗口、菜单、对话框等。系统内核KERNEL支持与操作系统密切相关的功能:如进程加载,文本切换、文件I/O,以及内存管理、线程管理等。USER为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、系统消息并把它们发给相应的窗口的消息队列。消息队列是一个系统定义的内存块,用于临时存储消息;或是把消息直接发给窗口过程。每个窗口维护自己的消息队列,并从中取出消息,利用窗口函数进行处理。框图如下:

3、图形输出

Windows程序不仅在输入上与DOS程序不同,而且在程序输出上也与DOS有着很大不同,主要表现为:(1).DOS程序独占整个显示屏幕,其他程序在后台等待。而Windows的每一个应用程序对屏幕的一部分进行处理。

DOS程序可以直接往屏幕上输出,而Windows是一个多窗口的操作系统,由操作系统来统一管理屏幕输出;每个窗口要输出内容时,必须首先向操作系统发出请求(GDI请求),由操作系统完成实际的屏幕输出工作。

(2).Windows程序的所有输出都是图形。Windows提供了丰富的图形函数用于图形输出,这对输出图形是相当方便的,但是由于字符也被作为图形来处理,输出时的定位要比DOS复杂的多。

比如,在DOS字符方式下,我们可以写出如下程序用于输出两行文字:

printf(“Hello,\n”);

printf(“ThisisDOSprogram.\n”);

而在Windows下要输出这两行文字所做的工作要复杂的多。因为Windows输出是基于图形的,它输出文本时不会象DOS那样自动换行,而必须以像素为单位精确定位每一行的输出位置。另外,由于Windows提供了丰富的字体,所以在计算坐标偏移量时还必须知道当前所用字体的高度和宽度。(3).Windows下的输出是设备无关的。Windows下的应用程序使用图形设备接口(GDI)来进行图形输出。GDI屏蔽了不同设备的差异,提供了设备无关的图形输出能力,Windows应用程序只要发出设备无关的GDI请求(如调用Rectangle画一个矩形),由GDI去完成实际的图形输出操作。对于一台具有打印矩形功能的PostScript打印机来说,GDI可能只需要将矩形数据传给驱动程序就可以了,然后由驱动程序产生PostScript命令绘制出相应的矩形;而对于一台没有矩形输出功能的点阵打印机来说,GDI可能需要将矩形转化为四条线,然后向驱动程序发出画线的指令,在打印机上输出矩形。当然,这两种输出在用户看来并没有什么区别。

Windows的图形输出是由图形设备接口(GDI)来完成的,GDI是系统原始的图形输出库,它用于在屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面。

GDI提供两种基本服务:创建图形输出和存储图象。GDI提供了大量用于图形输出的函数,这些函数接收应用程序发出来的绘图请求、处理绘图数据并根据当前使用设备调用相应的设备驱动程序产生绘图输出。这些绘图函数分为三类:一是文字输出,二是矢量图形函数,用于画线、圆等几何图形,三是光栅(位图)图形函数,用于绘制位图。

GDI识别四种类型的设备:显示屏幕、硬拷贝设备(打印机、绘图机)、位图和图元文件。前两者是物理设备,后两者是伪设备。一个伪设备提供了一种在RAM里或磁盘里存储图象的方法。位图存放的是图形的点位信息,占用较多的内存,但速度很快。图元文件保存的是GDI函数的调用和调用参数,占用内存较少,但依赖于GDI,因此不可能用某个设备来创建图元文件,而且速度比位图要慢。

4、用户界面对象

Windows支持丰富的用户接口对象,包括:窗口、图标、菜单、对话框等等。程序员只需简单的几十行代码,就可以设计出一个非常漂亮的图形用户界面。而在DOS环境下,则需要大量的代码来完成同样的工作,而且效果也没有Windows提供的那么好。下面我们介绍一下用户界面对象中的一些术语和相关概念。

窗口

窗口是用户界面中最重要的部分。它是屏幕上与一个应用程序相对应的矩形区域,是用户与产生该窗口的应用程序之间的可视界面。每当用户开始运行一个应用程序时,应用程序就创建并显示一个窗口;当用户操作窗口中的对象时,程序会作出相应反应。用户通过关闭一个窗口来终止一个程序的运行;通过选择相应的应用程序窗口来选择相应的应用程序。一个典型的窗口外观如图1.4所示。边框

绝大多数窗口都有一个边框,用于指示窗口的边界。同时也用来指明该窗口是否为活动窗口,当窗口活动时,边框的标题栏部分呈高亮显示。用户可以用鼠标拖动边框来调整窗口的大小。系统菜单框

系统菜单框位于窗口左上角,以当前窗口的图标方式显示,用鼠标点一下该图标(或按ALT+空格键)就弹出系统菜单。系统菜单提供标准的应用程序选项,包括:Restore(还原窗口原有的大小),Move(使窗口可以通过键盘上的光标键来移动其位置),Size(使用光标键调整窗口大小),Minimize(将窗口缩成图标),Maximize(最大化:使窗口充满整个屏幕)和Close(关闭窗口)。标题栏

标题栏位于窗口的顶部,其中显示的文本信息用于标注应用程序,一般是应用程序的名字,以便让用户了解哪个应用程序正在运行。标题栏颜色反映该窗口是否是一个活动窗口,当为活动窗口时,标题栏呈现醒目颜色。鼠标双击标题栏可以使窗口在正常大小和最大化状态之间切换。在标题栏上按下鼠标器左键可以拖动并移动该窗口,按右键弹出窗口系统菜单。菜单栏

菜单栏位于标题栏下方,横跨屏幕,在它上面列出了应用程序所支持的命令,菜单栏中的项是命令的主要分类,如文件操作、编辑操作。从菜单栏中选中某一项通常会显示一个弹出菜单,其中的项是对应于指定分类中的某个任务。通过选择菜单中的一个项(菜单项),用户可以向程序发出命令,以执行某一功能。如选择“文件->打开...”菜单项会弹出一个打开文件对话框,让用户选择一个文件,然后打开这个文件。

一般的,以“...”结尾的菜单项文本表明选择该项时会弹出一个对话框,让用户输入信息,然后执行操作,如“文件->打开...”。若不以“...”结尾,则表明选择该菜单项直接执行一个动作,如“编辑”菜单下的“粘贴”菜单项。若一个菜单项呈现灰色,则表明该菜单当前不可用。有时菜单项上还有加速键,加速键是一种键盘组合,它是菜单项的一种替代方式,可以让用户通过键盘直接发出命令;在键盘上按下这一键盘组合,就等效于选择了相应的菜单。如“粘贴(P)CTRL+V”,就表示粘贴操作的加速键是CTRL+V,按下CTRL+V就执行粘贴操作。工具条

工具条一般位于菜单栏下方,在它上面有一组位图按钮,代表一些最常用的命令。工具条可以显示或隐藏。让鼠标在某个按钮上停一会儿,在按钮下方会出现一个黄色的小窗口,里面显示关于该按钮的简短说明,叫做工具条提示(ToolTip)。用户还可以用鼠标拖动工具条将其放在窗口的任何一侧。客户区

客户区是窗口中最大的一块空白矩形区域,用于显示应用程序的输出。例如,字处理程序在客户区中显示文档的当前页面。应用程序负责客户区的绘制工作,而且只有和该窗口相对应的应用程序才能向该用户区输出。垂直滚动条和水平滚动条

垂直滚动条和水平滚动条分别位于客户区的左侧和底部,它们各有两个方向相反的箭头和一个深色的长度可变的滚动块。可以用鼠标选中滚动条的箭头上下卷滚(选中垂直滚动条时)或水平卷滚(选中水平滚动条时)客户区的内容。滚动块的位置表示客户区中显示的内容相对于要显示的全部内容的位置,滚动块的长度表示客户区中显示的内容大小相对于全部内容大小的比例。状态栏

状态栏是一般位于窗口底部,用于输出菜单的说明和其他一些提示信息(如鼠标器位置、当前时间、某种状态等)。图标

图标是一个用于提醒用户的符号,它是一个小小的图象,用于代表一个应用程序。当一个应用程序的主窗口缩至最小时,就呈现为一个图标。光标

Windows的光标是显示屏上的一个位图,而不是DOS下的一条下划线。光标用于响应鼠标或其他定位设备的移动。程序可以通过改变光标的形状来指出系统中的变化。例如,程序常显示一个计时的光标,用于指示用户一些漫长的操作正在进行之中。程序也可以通过改变光标让用户知道程序进入了一种特殊模式,例如,绘图程序经常改变光标来反映被绘制对象的类型,是直线还是圆或其他。插入符

插入符(caret)是一个微小并闪烁的位图,作为一个键盘控制的指针。控制键盘输入的窗口可以创建一个插入符去通知用户:窗口现在可以进行键盘输入。在DOS环境下,一般使用“光标”作为键盘指针,而在Windows中,“光标”被作为鼠标指针。

应用程序必须维护这个插入符。在Windows中,在一个时间只允许有一个插入符存在。因此,要使用插入符号作为键盘指针的应用程序必须在取得焦点时创建一个插入符号,并在失去焦点后删除它。对话框

对话框是一种特殊的窗口,它提供了一种接收用户输入、处理数据的标准方法。特别的,当用户输入了一个需要附加信息

的命令时,对话框是接收输入的标准方法。比如,假设用户要求系统打开一个文件,对话框就可以提供一个让用户从一组文件中选择一个文件的标准方法。如前所述,在一般情况下,在选择菜单名字后面跟着省略号(...)的菜单项通常会弹出一个对话框。图1.5给出了查找对话框的一个例子。控件

在图1.5中,查找对话框是一个独立的窗口,它显示信息并接收用户的输入。在对话框中,还包含了许多小的窗口,这些窗口被称为控件。控件是应用程序用来获得用户特定信息的窗口,比如要打开文件的名字或自动换行的设置等。应用程序也会通过控件获取所需的信息,以便控制程序的某种属性,如自动换行特性的开关。

控件总是与其他窗口连用,典型的是对话框,但也可以用在普通窗口之中。常见的控件有:按钮、编辑框、列表框、组合框、静态文本等等。消息框

消息框是用于给用户一些提示或警告的窗口。例如,消息框能够在应用程序执行某项任务过程中出现问题时通知用户。图1-6所示的对话框警告用户输入了一个不合法的文件名。5、资源共享Windows是一个多任务的操作系统,各个应用程序共享系统提供的资源,常见的资源包括:设备上下文,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插入符号,通信端口,电话线等。

Windows要求应用程序必须以一种能允许它共享Windows资源的方式进行设计,它的基本模式是这样的:

1.向Windows系统请求资源;

2.使用该资源;

3.释放该资源给Windows以供别的程序使用。

如果忽略了第三步,轻则当时不出错,但过一会儿出现程序运行出现异常情况,或干扰别的程序正常运行;重则立即死机,比如设备上下文没有释放时。

在Windows应用程序设计中,CPU也是一种非常重要的资源,因此应用程序应当避免长时间的占用CPU资源(如一个特别长的循环);如果确实需要这样做,也应当采取一些措施,以让程序能够响应用户的输入。主存也是一个共享资源,要防止同时运行的多个应用程序因协调不好而耗尽内存资源。

应用程序一般不要直接访问内存或其他硬件设备,如键盘、鼠标、计数器、屏幕或串口、并口等。Windows系统要求绝对控制这些资源,以保证向所有的应用程序提供公平的不中断的运行。如果确实要访问串并口,应当使用通过Windows提供的函数来安全的访问。6、Windows应用程序组成

前面介绍了Windows应用程序的特点,现在让我们看看编写一个Windows程序需要做哪些工作。编写一个典型的Windows应用程序,一般需要:

(1).C,CPP源程序文件:源程序文件包含了应用程序的数据、类、功能逻辑模块(包括事件处理、用户界面对象初始化以及一些辅助例程)的定义。

(2).H,HPP头文件:头文件包含了CPP、C源文件中所有数据、模块、类的声明。当一个CPP、C源文件要调用另一个CPP、C中所定义的模块功能时,需要包含那个CPP、C文件对应的头文件。

(3).资源文件:包含了应用程序所使用的全部资源定义,通常以.RC为后缀名。注意这里说的资源不同与前面提到的资源,这里的资源是应用程序所能够使用的一类预定义工具中的一个对象,包括:字符串资源、加速键表、对话框、菜单、位图、光标、工具条、图标、版本信息和用户自定义资源等。

程序员在资源文件中定义应用程序所需使用的资源,资源编译程序编译这些资源并将它们存储于应用程序的可执行文件或动态连接库中。在Windows应用程序中引入资源有以下一些好处:

(1).降低内存需求:当应用程序运行时,资源并不随应用程序一起装入内存,而是在应用程序实际用到这些资源时才装入内存。在资源装入内存时,它们拥有自己的数据段,而不驻留于应用程序数据段中;当内存紧张时,可以废弃这些资源,使其占用的内存空间供他用,而当应用程序用到这些资源时才自动装入,这种方式降低了应用程序的内存需求,使一次可运行更多的程序,这也是Windows内存管理的优点之一。

(2).便于统一管理和重复利用:将位图、图标、字符串等按资源文件方式组织便于统一管理和重用。比如,将所有的错误信息放到资源文件里,利用一个函数就可以负责错误提示输出,非常方便。如果在应用程序中要多次用到一个代表公司的徽标位图,就可以将它存放在资源文件中,每次用到时再从资源文件中装入。这种方式比将位图放在一个外部文件更加简单有效。(3).应用程序与界面有一定的独立性,有利于软件的国际化:由于资源文件独立于应用程序设计,使得在修改资源文件时(如调整对话框大小、对话框控制位置),可以不修改源程序,从而简化了用户界面的设计。另外,目前所提供的资源设计工具一般都是采用“所见即所得”方式,这样就可以更加直观、可视的设计应用程序界面。由于资源文件的独立性,软件国际化工作也非常容易。比如,现在开发了一个英文版的应用程序,要想把它汉化,只需要修改资源文件,将其中的对话框、菜单、字符串资源等汉化即可,而无需直接修改源程序。

但是,应用程序资源只是定义了资源的外观和组织,而不是其功能特性。例如,编辑一个对话框资源,可以改变对话框的安排和外观,但是却没有也不可能改变应用程序响应对话框控制的方式。外观的改变可以通过编辑资源来实现,而功能的改变却只能通过改变应用程序的源代码,然后重新编译来实现。

Windows应用程序的生成也要经过编译、链接两个阶段,只是增加了资源编译过程,基本流程如下图:C、CPP编译器将C源程序编译成目标程序,然后使用连接程序将所有的目标程序(包括各种库)连接在一起,生成可执行程序。在制作Windows应用程序时,编译器还要为引出函数生成正确的入口和出口代码。

连接程序生成的可执行文件还不能在Windows环境下运行,必须使用资源编译器对其进行处理。资源编译器对可执行文件的处理是这样的:如果该程序有资源描述文件,它就把已编译为二进制数据的资源加入到可执行文件中;否则,仅对该可执行文件进行相容性标识。应用程序必需经过资源编译器处理才可以在Windows环境下运行。

三、Windows应用程序的开发工具

由于Windows是Microsoft的产品,因而在早期阶段,开发工具只有MicrosoftC和SDK(SoftwareDeveloperKit:软件开发工具包)可供使用。利用SDK进行Windows程序的设计开发非常繁琐、复杂,代码可重用性差,工作量大,即便一个简单的窗口也需要几百行程序,令开发人员望而生畏。

随着Windows的逐渐普及,各大软件公司纷纷推出自己的Windows软件开发工具。国内用户比较熟悉的有BorlandC++2.0以上版本以及用于数据库开发的Foxpro等等。其中BorlandC++支持面向对象的开发,在我国具有广大的用户群。

可视化技术和CASE技术研究的深入为我们带来了支持可视化编程特性的第三代开发工具,这一代开发工具有:VisualBasic,Visual

C++,BorlandC++Builder,Delphi和用于数据库开发的PowerBuilder、VisualFoxpro等等。

其中,VisualC++是美国Microsoft公司推出的4GL软件开发工具,目前已成为国内应用最广泛的高级程序设计语言之一,最新版本为8.0版。同其他软件开发工具相比,VisualC++具有以下优点:面向对象、可视化开发:提供了面向对象的应用程序框架MFC(MicrosoftFoundationClass:微软基础类库),大大简化了程序员的编程工作,提高了模块的可重用性。VisualC++还提供了基于CASE技术的可视化软件自动生成和维护工具AppWizard、ClassWizard、VisualStudio、WizardBar等,帮助用户直观的、可视地设计程序的用户界面,可以方便的编写和管理各种类,维护程序源代码,从而提高了开发效率。用户可以简单而容易地使用C/C++编程。众多的开发商支持以及业已成为工业标准的MFC类库:MFC类库已经成为事实上的工业标准类库,得到了众多开发商和软件开发工具的支持;另外,由于众多的开发商都采用VisualC++进行软件开发,这样用VisualC++开发的程序就与别的应用软件有许多相似之处,易于学习和使用。VisualC++封装了Windows的API(应用程序接口)函数、USER、KERNEL、GDI函数,帮助我们弄清了许多函数的组织方法,隐去了创建、维护窗口的许多复杂的例行工作,简化了编程。

但是,由于C/C++本身的复杂性,VisualC/C++对编程人员要求还是相当高的。它首先要求编程者要具有丰富的C/C++语言编程经验,了解面向对象编程的基本概念,同时还必须掌握复杂的MFC类库。9.2使用VisualC++6.0一、VisualC++可视化集成开发环境

VisualC++提供了一个支持可视化编程的集成开发环境,它不仅支持VisualC++,还支持VisualBasic,Visual

J++,VisualInterDev等Microsoft系列开发工具。DeveloperStudio包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用DeveloperStudio,可以完成创建、调试、修改应用程序等的各种操作。

DeveloperStudio采用标准的多窗口Windows用户界面,并增加了一些新特性,使得开发环境更易于使用,用户很容易学会它的使用方法。一个典型的DeveloperStudio用户界面如图2.1所示。

所谓可视化编程,就是指:在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。这种可视化的编程方法易学易用,而且大大提高了工作效率。

VisualC++的集成开发环境提供了大量的实用工具以支持可视化编程特性,它们包括:项目工作区、ClassWizard、AppWizard、WizardBar、ComponentGallery等。1、项目工作区

程序员的大部分工作都在集成开发环境中完成。集成开发环境使用项目工作区来组织项目、元素以及项目信息在屏幕上出现的方式。在一个项目工作区中,可以处理:一个工程和它所包含的文件一个工程的子工程多个相互独立的工程多个相互依赖的工程

一个项目工作区可包含由不同的开发工具包生成的工程,如VisualC++和VisualJ++。在桌面上,项目工作区以窗口方式组织项目、文件和项目设置。项目工作区窗口一般位于屏幕左侧,如图2.2所示。项目工作区窗口底部有一组标签,用于从不同的角度(视图)察看项目中包含的工程和联机文档。每个项目视图都有一个相应的文件夹,包含了关于该项目的各种元素。展开该文件夹可以显示该视图方式下工作区的详细信息。项目工作区包含四种视图:

FileView(文件视图):显示所创建的工程。展开文件夹可以察看工程中所包含的文件。

ClassView(类视图):显示项目中定义的C++类,展开文件夹显示工程中所定义的所有类,展开类可察看类的数据成员和成员函数以及全局变量、函数和类型定义。

ResourceView(资源视图):显示项目中所包含的资源文件。展开文件夹可显示所有的资源类型。

InfoView(文档视图):显示联机文档目录表。展开目录表可以显示所有的帮助主题,双击主题将弹出InfoViewerTopic窗口,显示关于该主题的详细信息。要显示关于源程序窗口的关键字的相关信息,可以将光标移动到该关键字上,然后按下F1键。还可以使用InfoViewer显示来自InternetWWW(万维网)的页面。

单击项目工作区底部的标签可以从一个视图切换到另一个视图。每个视图都是按层次方式组织的。可以展开文件夹和其中的项察看其内容,或折叠起来察看其组织结构。

在项目视图中,如果一项不可以再展开,那么它是可编辑的。双击这一项便可以打开相应的文档编辑器进行编辑:对类和源程序文件来说,是打开文本编辑器。对于对话框来说是打开对话框编辑器每个视图还支持右键快捷菜单。

使用文件视图(FileView)

FileView窗格显示了工程文件和项目工作区中所包含的文件的逻辑关系。一个工作区可以包含多个工程,其中活动工程以黑体显示。活动配置决定了编译活动工程时的编译选项。活动工程是使用Build或RebuildAll时要编译的那一个工程。可以用Build菜单上的SetActiveConfiguration选择不同的活动配置;也可以在Project菜单上用SetActiveProject选择不同的活动工程。

使用FileView可以:察看文件;管理文件:包括增加、删除、移动、重命名、拷贝文件等。

要增加一个文件到过程中,可以选择Project->AddtoProject->Files菜单,弹出文件对话框,选择相应文件即可;要从工程中删除一个文件,可打开工程文件夹,选择相应文件,然后按DEL键。使用类视图(ClassView)

ClassView显示所有已定义的类以及这些类中的数据成员、成员变量。VisualC++自动从项目工作区中所包含的源程序文件中分离出类。

在ClassView中,文件夹代表工程文件名。展开ClassView顶层的文件夹后,显示工程中所包含的所有的类,如图2.3。双击一个类的图标(或单击图标旁的+号)时,ClassView展开该类并显示其类成员。ClassView使用图标标识类、类成员和工程中的其他项,图2.4显示了所有的图标和含义。

利用ClassView不仅可以浏览应用程序所包含的类以及类中的成员,还可以快速跳到一个类或成员的定义,步骤如下:

(1).选择要查找的定义或声明的符号

(2).双击所选的符号名。

要打开关于某一个类声明的头文件,只需双击类名即可。

要想查找某一个变量的参考:

(1).将光标定位在该符号处

(2).按鼠标右键,弹出快捷菜单,选择Reference(此时应确保已经生成了Browse(浏览)文件,关于Browse文件的选项,可以在Project-Settings中设置)。2、

AppWizard(应用程序向导)

AppWizard是VisualC++提供的一个高级编程工具,它可以产生应用的C++源代码框架。通过与另一个工具ClassWizard一起配合使用,可大大节省开发应用程序的时间和精力。

AppWizard是一个标准的C++源代码生成器。它通过一系列的对话框来提示用户输入所需创建的程序的信息,如它的名字和位置。用户还可以指定它是否具有一些特性,如多文档接口或工具条,对数据库、OLE的支持等。然后AppWizard生成一些文件,这些文件构成程序的框架。由AppWizard生成的程序是一个基本的Windows程序,用户可以编译并运行——它实际什么也不做。它只是准备好增加那些为程序提供功能性的资源和代码。这样就节省了用户设计应用程序框架的时间和精力,用户所要做的工作只是直接往框架中添加自己的处理代码。3、

ClassWizard(类向导)

ClassWizard是一个交互式工具,用来建立新的类,定制类,把消息映射成类成员函数,或者把控制框映射为类变量成员。在开发程序时,可用ClassWizard建立程序所需要的类,包括消息处理和消息映射例程(用于定位处理消息的代码)。

使用ClassWizard,可以将成员函数或变量加入到一个类中,或修改已经存在的函数和变量。Wizard使函数或变量放在何处,如何称呼它们以及其他一些细节问题大大简化。

ClassWizard所能识别的类必须在ClassView数据库文件(.CLW)中登记。使用ClassWizard可以:创建新类:从许多框架基类中派生出新类映射消息到函数新建、删除消息处理函数察看已被处理的消息并跳到消息处理代码处定义成员变量:这些变量会被自动初始化,释放,执行对话框数据检验创建新类时,自动加入方法和属性处理现有的类和类库4、

WizardBar(向导工具条)

WizardBar是一个可停泊的工具条,用于快速访问一些DeveloperStudio最实用的功能,比如ClassWizard或ClassView的一些功能。WizardBar会自动跟踪用户程序的上下文——比如,当文本编辑器中的光标从一个函数移动到另一个函数时,Wizard的显示会自动更新。

WizardBar工具条包含了三个相关的下拉列表框:类(Class)、过滤器(Filter)和成员(Member),如图2.5所示。类列表框包含了应用程序定义的所有类。当前所选择的类决定可用的过滤器;所选的过滤器决定Member列表中显示的内容。选择Member中的一项,可以跳到相应的成员定义。WizardBar最右边是一个ActionControl,单击ActionControl的向下箭头符号会弹出一个菜单,用于执行跳到函数定义、增加消息处理函数等操作。9.3

WIN32开发VisualC++6.0是一个全32位的软件开发工具,它完全支持32位的Win32平台开发。Win32平台包括32位的Windows操作系统和软件开发系统Win32API。所谓API(应用程序接口)指的是一组由操作系统提供的函数。Win32API是Windows平台上的一个32位的软件开发系统,它使应用程序可以充分利用32位Windows操作系统的能力。使用Win32API写成的应用程序可以在Windows95或更高版本以及WindowsNT上运行。Win32可以应用于特定的操作系统,这种系统可以直接控制和处理PC硬件资源,它支持:高性能的抢先式多任务和多线程连续的32位地址空间和先进的内存管理对所有的可为进程共享的对象,解决了它的安全性问题内存映射文件

一、抢先式多任务和多线程

我们知道Windows是一个多任务操作系统,它提供了一次运行多个应用程序的能力。

Windows95的多任务是一种抢先式多任务。比如,我们在用资源管理器复制一个文件的同时,还可以启动另外一个应用程序,如纸牌游戏,而且随时都可以切换回资源管理器,察看文件复制进度,系统始终保持较好的响应和灵活性。要了解抢先式多任务,我们需要首先了解一下进程和线程的概念。调入内存准备执行的应用程序叫做进程(process)。每个进程至少有一条线程,叫做主线程(primarythread)。一个进程包含代码、数据和其他属于应用程序的资源。一条线程包含一组指令,相关的CPU寄存器值和一个堆栈。

在抢先式多任务操作系统中,系统在所有运行的所有进程之间对CPU时间进行共享,从而保证每个进程都能频繁的访问处理器,并且实现指令的连续执行。这样,每个Win32进程都需要分配一个优先级,系统调度程序利用这种优先级来决定哪一时刻该运行哪一个进程。具有高优先级的进程(严格的说应当是线程)就是当前运行的哪一个。更高优先级的线程可以中断当前进程的执行。同一优先级的线程通过时间片来调度。一个线程处于以下三种状态之一:正在执行,挂起,准备运行。在单处理器环境下(如Windows95),同一时刻只能运行一个线程。在Win32中支持多线程进程结构,主要有:对进程以及线程创建、操纵的支持对一个进程内线程之间的同步和同步对象的支持一个统一的共享机制。二、连续的地址空间和先进的内存管理

对于各种操作系统和平台来说,内存管理都是一个非常重要的问题。在Windows3.1下,有两种形式的内存管理函数调用:局部的和全局的。全局内存管理函数从物理内存中分配一段,然后返回一个句柄值。该句柄可以转换为一个GlobalLock函数所使用的远指针。基本处理过程如下:

(1)申请一块可移动的内存块(2)锁定该内存块。因为Windows引入了虚拟内存管理,可以把内存块移动到硬盘交换文件中,所以在使用内存块之前,必须将它锁定在真正的内存RAM之中,也就是告诉操作系统,现在这块内存暂时由应用程序来管理。(3)对该内存块进行各种操作:如复制数据到内存块。(4)解锁内存,应用程序将对该内存的控制交与Windows。下面给出一个程序片段,来说明内存管理函数的用法。HGLOBALmemHandle;//内存句柄charfar*lpMem;//假设长度为memLenmemHandle=GlobalAlloc(GHND,memLen+1);//申请内存块,此处未做返回结果检查,//事实上,申请内存有时会失败memcpy(lpMem,string,textLen);//拷贝数据,//其中string为一字符串变量,//textLen是这个字符串的长度GlobalUnlock(memHandle);//解锁内存...GlobalFree((HGLOBAL)memHandle);//释放内存在Win32下,所有的进程都有自己独立的地址空间(在进程内部的线程仍然共享进程的内存变量),全局内存不再对所有的Windows应用程序都可见。由于每个应用程序都有自己的地址空间,一个进程分配的内存在该进程的地址之外就不再可见。DDE会话中使用的内存对接收者进程来说是透明的。这样,进程的安全性就得到大大提高,程序更加强壮。一个进程崩溃一般不会影响另外一个进程的执行。但是,这也给多个应用程序共享内存带来了困难。四、Win32编程基础

Win32数据类型这里的数据类型指的是一些关键字,这些关键字定义了Win32中的函数中的有关参数和返回值的大小和意义。Win32常用的数据类型见上表句柄是Windows编程的一个关键性的概念,编写Windows应用程序总是要和各种句柄打交道。所谓句柄,就是一个唯一的数,用以标识许多不同的对象类型,如窗口、菜单、内存、画笔、画刷、电话线路等。在Win32里,句柄是指向一个“无类型对象”(void*)的指针,也就是一个4字节长的数据。无论它的本质是什么,句柄并不是一个真正意义上的指针。从构造上看,句柄是一个指针,尽管它没有指向用于存储某个对象的内存位置。事实上,句柄指向一个包含了对该对象进行的引用的位置。句柄的声明是这样的:typedefvoid*HANDLE由于Windows是一个多任务操作系统,它可以同时运行多个程序或一个程序的多个副本。这些运行的程序称为一个实例。为了对同一程序的多个副本进行管理,Windows引入了实例句柄。Windows为每个应用程序建立一张表,实例句柄就好象是这张表的一个索引。

Windows不仅使用句柄来管理实例,也用它来管理窗口、位图、字体、元文件、图标等系统资源。9.4

MFC编程

微软基础类库(MFC:MicrosoftFoundationClass)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。MFC库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到你自己开发的应用程序中去。

对用户来说,用MFC开发的最终应用程序具有标准的、熟悉的Windows界面,这样的应用程序易学易用;另外,新的应用程序还能立即支持所有标准Windows特性,而且是用普通的、明确定义的形式。事实上,也就是在Windows应用程序界面基础上定义了一种新的标准——MFC标准。

一、MFC类库概念和组成

Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的WindowsAPI。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。

MFC可分为两个主要部分:(1)基础类(2)宏和全程函数。MFC基础类

MFC中的类按功能来分可划分为以下几类:基类应用程序框架类应用程序类命令相关类文档/视类线程类可视对象类窗口类视类对话框类属性表控制类菜单类设备描述表绘画对象类通用类文件诊断异常收集模板收集其他支持类OLE2类OLE基类OLE可视编辑包装程序类OLE可视编辑服务器程序类OLE数据传输类OLE对话框类其他OLE类数据库类宏和全局函数

若某个函数或变量不是某个类的一个成员,那么它是一个全程函数或变量。

Microsoft基本宏和全程函数提供以下功能:数据类型运行时刻对象类型服务诊断服务异常处理CString格式化及信息框显示消息映射应用消息和管理对象连接和嵌入(OLE)服务标准命令和WindowsIDs约定:全程函数以“Afx”为前缀,所有全程变量都是以“afx”为前缀,宏不带任何特别前缀,但是全部大写。

常见的全局函数和宏有:AfxGetApp,AfxGetMainWnd,AfxMessageBox,DEBUG_NEW等。

从继承关系来看,又可将MFC中的类分成两大类:大多数的MFC类是从CObject继承下来;另外一些类则不是从CObject类继承下来,这些类包括:字符串类CString,日期时间类CTime,矩形类CRect,点CPoint等,它们提供程序辅助功能。

由于MFC中大部分类是从CObject继承下来的,CObject类描述了几乎所有的MFC中其他类的一些公共特性,因此我们有必要理解CObject类。

CObject类为派生类提供了下述服务:对象诊断MFC提供了许多诊断特性,它可以:输出对象内部信息:CDumpContext类与CObject的成员函数Dump配合,用于在调试程序时输出对象内部数据。对象有效性检查:重载基类的AssertValid成员函数,可以为派生类的对象提供有效性检查。运行时访问类的信息:MFC提供了一个非常有用的特性,它可以进行运行时的类型检查。如果从CObject派生出一个类,并使用了以下三个宏(IMPLEMENT_DYNAMIC,IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL)之一,就可以:运行时访问类名安全可靠的把通用的CObject指针转化为派生类的指针二、MFC的优点

MicrosoftMFC具有以下不同于其它类库的优势:完全支持Windows所有的函数、控件、消息、GDI基本图形函数,菜单及对话框。类的设计以及同API函数的结合相当合理。使用与传统的WindowsAPI同样的命名规则,即匈牙利命名法。进行消息处理时,不使用易产生错误的switch/case语句,所有消息映射到类的成员函数,这种直接消息到方法的映射对所有的消息都适用。它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。通过发送有关对象信息到文件的能力提供更好的判定支持,也可确认成员变量。支持异常错误的处理,减少了程序出错的机会运行时确定数据对象的类型。这允许实例化时动态操作各域有较少的代码和较快的速度。MFC库只增加了少于40k的目标代码,效率只比传统的CWindows程序低5%。可以利用与MFC紧密结合的AppWizard和ClassWizard等工具快速开发出功能强大的应用程序。

另外,在使用MFC时还允许混合使用传统的函数调用。三、MFC对消息的管理

Windows消息的管理包括消息发送和处理。为了支持消息发送机制,MFC提供了三个函数:SendMessage、PostMessage和SendDlgItemMessage。而消息处理则相对来说显得复杂一些。MFC采用了一种新的机制取代C语言编程时对Windows消息的Switch/Case分支,简化了Windows编程,使程序可读性、可维护性大大提高。这种消息映射机制包括一组宏,用于标识消息处理函数、映射类成员函数和对应的消息等。其中,用afx_msg放在函数返回类型前面,用以标记它是一个消息处理成员函数。类若至少包含了一个消息处理函数,那么还需要加上一个DECLARE_MESSAGE_MAP()宏,该宏对程序执行部分所定义的消息映射进行初始化。

消息处理函数例子classCMainFrame:CFrameWnd{public:CMainFrame();protected://{{AFX_MSG(CMainFrame)afx_msg

int

OnCreate(LPCREATESTRUCT

lpCreateStruct);afx_msgvoidOnEditCopy();afx_msgvoidOnClose();//}}AFX_MSGDECLARE_MESSAGE_MAP()};

成员函数OnCreate,OnEditCopy,OnClose分别用来处理消息WM_CREATE、ID_EDIT_COPY和WM_CLOSE。其中,WM_CREATE和WM_CLOSE是系统预定义消息,包含在Windows.h中。而ID_EDIT_COPY是菜单Edit->Copy的标识,也就是用户选择Edit->Copy菜单项时产生的消息,一般在资源文件头文件中定义。在类的实现部分给出这三个成员函数的定义,以及特殊的消息映射宏。上面的例子的消息映射宏定义如下:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_COMMAND(ID_EDIT_COPY,OnEditCopy)ON_WM_CLOSE()END_MESSAGE_MAP()

消息映射宏由BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()。其中,BEGIN_MESSAGE_MAP宏包含两个参数CMainFrame类和CFrameWnd,分别代表当前定义的类和它的父类。在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间,包含了主窗口要处理的各个Windows消息的入口。在本例中,包含三个消息。其中ON_WM_CREATE被用来指定缺省的成员函数OnCreate与WM_CREATE相对应。在MFC中,包含了大量的预定义消息映射宏,用来指定各种成员函数与各种形如WM_XXXX消息相对应。如ON_WM_CLOSE宏指定了WM_CLOSE消息的处理成员函数为OnClose。这时侯,只需要写出要处理的消息就够了,不必再写出处理函数。消息映射宏ON_COMMAND则被用来将菜单项和用户自定义的命令同它们的处理成员函数联系起来。在上例中,用户选择Edit->Copy菜单项时,系统执行OnEdit

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论