大连海事大学 C++面向对象的程序设计胡英Chapter12c++(121)_第1页
大连海事大学 C++面向对象的程序设计胡英Chapter12c++(121)_第2页
大连海事大学 C++面向对象的程序设计胡英Chapter12c++(121)_第3页
大连海事大学 C++面向对象的程序设计胡英Chapter12c++(121)_第4页
大连海事大学 C++面向对象的程序设计胡英Chapter12c++(121)_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

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

文档简介

1、胡英胡英第一部分 MFC导论 第二部分一个简单的MFC程序 第三部分MFC 样式 第四部分消息映射 本章的目的是帮助你理解和掌握 Visual C+ MFC 编程的基本概念和技术。很多人使用 Visual C+,开始于 AppWizard,使用它建立一程序框架,然后就不知道下一步该如何是好了。这主要是因为不理解 AppWizard 所产生的 MFC 代码的含义。所以你必须了解和掌握 MFC 代码结构,才能继续下去。本章从最基础的出发,向你介绍驱动 MFC 程序的基本概念。使你能更好地理解 MFC 和 AppWizard 所产生的代码。第一部分第一部分MFCMFC导论导论 Visual C+ 不

2、仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的 C+ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性,你必须理解 C+ 程序设计语言。掌握了C+,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次结构包容了 Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立 Windows 应用程序。这种层次结构适用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代码是完全可移植的。本章将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。在本节中,你将会输入、编译和运行一个简单

3、的MFC程序。下一节中将向你详细解释这些代码。第三部分讨论了MFC控制和如何定制它们。第四部分将介绍消息映射,你将会处理MFC的事件。什么是什么是MFC?MFC? 如果你要建立一个 Windows 应用程序,应该如何下手? 好的开端是从设计用户界面开始。首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。Windows 用户界面有一些标准的控制,如按钮、菜单、滚动条和列表等,这对那些 Windows 用户已经是很熟悉了。 要记住的是,作为程序员必须选择一组控制并决定如何把它们安排到屏幕上。传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。这对于一些比较小

4、的项目,以及一些大项目的早期原型阶段是可以的。下一步,是要实现代码。为任何 Windows 平台建立应用程序时,程序员都有两种选择:C 或 C+。 使用 C,程序员是在 Windows 应用程序界面 ( API ) 的水平上编写代码。该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。对于Windows NT, API 被称为 “Win32 API”,以区别于其用于Windows 3.1的16位 API。Microsoft 也提供了 C+ 库,它位于任何 Windows API 之上,能够使程序员的工作更容易。它就是Microsoft基本类库 (MFC),该

5、库的主要优点是效率高。它减少了大量在建立 Windows 程序时必须编写的代码。同时它还提供了所有一般 C+ 编程的优点,例如继承和封装。MFC 是可移植的,例如,在 Windows 3.1下编写的代码可以很容易地移植到 Windows NT 或 Windows 95 上。因此,MFC 是很值得推荐的开发Windows 应用程序的方法,在本章自始至终使用的都是 MFC。当是使用 MFC 时,你编写的代码是用来建立必要的用户界面控制并定制其外观。同时你还要编写用来响应用户操作这些控制的代码。例如,如果用户单击一个按钮时,你应该有代码来响应。这就是事件驱动代码,它构成了所有应用程序。一旦应用程序正

6、确的响应了所有允许的控制,它的任务也就完成了。 你可以看出,使用 MFC 进行 Windows 编程时是一件比较容易的的过程。本章的目的是比较详细地教你如何快速建立专业级的应用程序的技术。Visual C+ 应用程序开发环境特别适合于使用 MFC (也有其它开发环境使用MFC),所以一起学习 MFC 和 Visual C+ 能够增强你的开发程序的能力。WindowsWindows词汇词汇 在 Windows 用户界面和软件开发中所要用到的词汇都是基本和唯一的。对于新接触该环境的用户,下面复习几个定义以便使我们的讨论更加容易。 Windows应用程序使用几个标准的控制: 静态文本标签 按钮 列表

7、框 组合框(一种更高级的列表框) 单选按钮 检查按钮 编辑框(单行和多行) 滚动条你可以通过代码或“资源编辑器”来建立这些控制,在资源编辑器中可以建立对话框和这些控制。在本章中,我们将使用代码来建立它们。 Windows支持几种类型的应用程序窗口。一个典型的应用程序应该活动在称为“框架窗口”中。一个框架窗口是一个全功能的主窗口,用户可以改变尺寸、最小化、最大化等。Windows也支持两种类型的对话框:模式和无模式对话框。模式对话框一旦出现在屏幕上,只有当它退出时,屏幕上该应用程序的其余部分才能响应。无模式对话框出现在屏幕上时,程序的其余部分也可以作出响应,它就象浮动在上面一样。最简单的 Win

8、dows 应用程序是使用单文档界面(SDI),只有一个框架窗口。Windows 的钟表、PIF 编辑器、记事本等都是 SDI 应用程序的例子。Windows 也提供了一种称为多文档界面的组织形式,它可用于更复杂的应用程序。MDI 系统允许用户在同一应用程序中同时可以查看多个文档。例如,一个文本编辑器可以允许用户同时打开多个文本文件。使用 MDI 时,应用程序有一个主窗口,在主窗口中有一些子窗口,每个子窗口中各自包含有各自的文档。在MDI框架中,主窗口有一个主菜单,它对主框架中最顶端窗口有效。各子窗口都可以缩成图标或展开,MDI主窗口也可以变成桌面上的一个图标。MDI界面可能会给你一种第二桌面的

9、感觉,它对窗口的管理和删除混乱的窗口有很大的帮助。你所建立的每一个应用程序都会使用它自己的一套控制、菜单结构以及对话框。应用程序界面的好坏取决于你如何选择和组织这些界面对象。Visual C+ 中的资源编辑器可以使你能容易的建立和定制这些界面对象。WindowsWindows发展历史发展历史WindowsWindows起源可以追溯到起源可以追溯到XeroxXerox公司进行的工作。公司进行的工作。19701970年,美国年,美国XeroxXerox公公司成立了著名的研究机构司成立了著名的研究机构Palo Alto Research Center(PARC)Palo Alto Research

10、Center(PARC),从事局域网、从事局域网、激光打印机、图形用户接口和面向对象技术的研究,并于激光打印机、图形用户接口和面向对象技术的研究,并于19811981年宣布推出年宣布推出世界上第一个商用的世界上第一个商用的GUIGUI(图形用户接口)系统:图形用户接口)系统:Star 8010Star 8010工作站。但如工作站。但如后来许多公司一样,由于种种原因,技术上的先进性并没有给它带来它所后来许多公司一样,由于种种原因,技术上的先进性并没有给它带来它所期望的商业上的成功。期望的商业上的成功。 Apple Computer Apple Computer公司的创始人之一公司的创始人之一St

11、eve JobsSteve Jobs,于于19831983年研制成功第一年研制成功第一个个GUIGUI系统:系统:Apple LisaApple Lisa。随后不久,随后不久,AppleApple又推出第二个又推出第二个GUIGUI系统系统Apple Apple MacintoshMacintosh,这是世界上第一个成功的商用这是世界上第一个成功的商用GUIGUI系统。当时,系统。当时,AppleApple公司在开公司在开发发MacintoshMacintosh时,出于市场战略上的考虑,只开发了时,出于市场战略上的考虑,只开发了AppleApple公司自己的微机公司自己的微机上的上的GUIGU

12、I系统,而此时,基于系统,而此时,基于Intel x86Intel x86微处理器芯片的微处理器芯片的IBMIBM兼容微机已渐露兼容微机已渐露峥嵘。这样,就给峥嵘。这样,就给MicrosoftMicrosoft公司开发公司开发WindowsWindows提供了发展空间和市场。提供了发展空间和市场。 Microsoft公司早就意识到建立行业标准的重要性,在1983年春季就宣布开始研究开发Windows,希望它能够成为基于Intel x86微处理芯片计算机上的标准GUI操作系统。它在1985年和1987年分别推出Windows 1.03版和Windows2.0版。Microsoft于1990年5月

13、份推出Windows3.0并一炮打红。这个“千呼万唤始出来”的操作系统一经面世便在商业上取得惊人的成功:不到6周,Microsoft公司销出50万份Windows3.0拷贝,打破了任何软件产品的销售记录,从而一举奠定了Microsoft在操作系统上的垄断地位。 随后,随后,MicrosoftMicrosoft借借WindowsWindows东风,于东风,于19951995年推出新一代操作年推出新一代操作系统系统Windows 95Windows 95 ,它可以独立运行而无需它可以独立运行而无需DOSDOS支持。支持。Windows95Windows95是操作系统发展史上一个里程碑式的作品,它对

14、是操作系统发展史上一个里程碑式的作品,它对Windows3.1Windows3.1版版作了许多重大改进,包括:更加优秀的、面向对象的图形用户作了许多重大改进,包括:更加优秀的、面向对象的图形用户界面,从而减轻了用户的学习负担;全界面,从而减轻了用户的学习负担;全3232位的高性能的抢先式位的高性能的抢先式多任务和多线程;内置的对多任务和多线程;内置的对InternetInternet的支持;更加高级的多媒的支持;更加高级的多媒体支持(声音、图形、影像等),可以直接写屏并很好的支持体支持(声音、图形、影像等),可以直接写屏并很好的支持游戏;即插即用,简化用户配置硬件操作,并避免了硬件上的游戏;即

15、插即用,简化用户配置硬件操作,并避免了硬件上的冲突;冲突;3232位线性寻址的内存管理和良好的向下兼容性等等。位线性寻址的内存管理和良好的向下兼容性等等。Windows95Windows95以后又先后推出了以后又先后推出了Windows98Windows98、20002000、XPXP,性能更加,性能更加强大,强大,20062006年年MicrosoftMicrosoft推出新一代推出新一代6464位操作系统位操作系统V Vistaista,2009,2009年年推出推出Windows7Windows7。 直观、高效的面向对象的图形用户界面,易学易用直观、高效的面向对象的图形用户界面,易学易用

16、从某种意义上说,从某种意义上说,WindowsWindows用户界面和开发环境都是面向对用户界面和开发环境都是面向对象的。用户采用象的。用户采用“选择对象选择对象- -操作对象操作对象”这种方式进行工作。比这种方式进行工作。比如要打开一个文档,我们首先用鼠标或键盘选择该文档,然后从如要打开一个文档,我们首先用鼠标或键盘选择该文档,然后从右键菜单中选择右键菜单中选择“打开打开”操作,打开该文档。这种操作方式模拟操作,打开该文档。这种操作方式模拟了现实世界的行为,易于理解、学习和使用。了现实世界的行为,易于理解、学习和使用。用户界面统一、友好、漂亮用户界面统一、友好、漂亮WindowsWindow

17、s应用程序大多符合应用程序大多符合IBMIBM公司提出的公司提出的CUA (Common User CUA (Common User Access)Access)标准,所有的程序拥有相同的或相似的基本外观,包括标准,所有的程序拥有相同的或相似的基本外观,包括窗口、菜单、工具条等。用户只要掌握其中一个,就不难学会其窗口、菜单、工具条等。用户只要掌握其中一个,就不难学会其他软件,从而降低了用户培训学习的费用。他软件,从而降低了用户培训学习的费用。WindowsWindows之所以取得成功,主要在于它具有以下优点:之所以取得成功,主要在于它具有以下优点:丰富的设备无关的图形操作丰富的设备无关的图形操

18、作 Windows Windows的图形设备接口的图形设备接口( (GDI)GDI)提供了丰富的图形操作函数,可以提供了丰富的图形操作函数,可以绘制出诸如线、圆、框等的几何图形,并支持各种输出设备。设绘制出诸如线、圆、框等的几何图形,并支持各种输出设备。设备无关意味着在针式打印机上和高分辨率的显示器上都能显示出备无关意味着在针式打印机上和高分辨率的显示器上都能显示出相同效果的图形。相同效果的图形。多任务多任务 Windows Windows是一个多任务的操作环境,它允许用户同时运行多个应是一个多任务的操作环境,它允许用户同时运行多个应用程序,或在一个程序中同时做几件事情。每个程序在屏幕上占用程

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

20、盘输入的程序。能够接收用户键盘输入的程序。WindowsWindows要求以一种全新的思维方式进行程序设计要求以一种全新的思维方式进行程序设计, ,主要表现主要表现为:为:1.1.事件驱动的程序设计事件驱动的程序设计 传统的传统的MDOSMDOS程序主要采用顺序的、关联的、过程驱动的程序设计方法。程序主要采用顺序的、关联的、过程驱动的程序设计方法。一个程序是一系列预先定义好的操作序列的组合,它具有一定的开头、中一个程序是一系列预先定义好的操作序列的组合,它具有一定的开头、中间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序设计方间过程和结束。程序直接控制程序事件和过程的顺序。这样的程序

21、设计方法交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模法交互性差,用户界面不够友好,因为它强迫用户按照某种不可更改的模式进行工作。式进行工作。 事件驱动程序设计是一种全新的程序设计方法,它是由事件驱动程序设计是一种全新的程序设计方法,它是由事件的发生来控制事件的发生来控制,而这种事件的发生是随机的、不确定的,并没有预定的顺序,允许程序的,而这种事件的发生是随机的、不确定的,并没有预定的顺序,允许程序的用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来用户用各种合理的顺序来安排程序的流程。对于需要用户交互的应用程序来说,事件驱动的程序设计有着过程驱动方法无法替代的

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

23、入没有固定的顺序,用户可以随机选取,以任何合理的顺序来输入数输入没有固定的顺序,用户可以随机选取,以任何合理的顺序来输入数据。据。 2.2.消息循环与输入消息循环与输入 事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的事件驱动围绕着消息的产生与处理展开,一条消息是关于发生的事件的消息。事件驱动是靠消息循环机制来实现的。消息是一种报告有关事件发生消息。事件驱动是靠消息循环机制来实现的。消息是一种报告有关事件发生的通知。类似于的通知。类似于DOSDOS下的用户输入,但比下的用户输入,但比DOSDOS的输入来源要广,的输入来源要广,WindowsWindows应用应用程序的消息来源有以

24、下四种:程序的消息来源有以下四种: (1 1)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息)输入消息:包括键盘和鼠标的输入。这一类消息首先放在系统消息队列中,然后由队列中,然后由WindowsWindows将它们送入应用程序消息队列中,由应用程序来处将它们送入应用程序消息队列中,由应用程序来处理消息。理消息。 (2 2)控制消息:用来与)控制消息:用来与WindowsWindows的控制对象,如列表框、按钮、检查框的控制对象,如列表框、按钮、检查框等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时等进行双向通信。当用户在列表框中改动当前选择或改变了检查框的状态时发

25、出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控发出此类消息。这类消息一般不经过应用程序消息队列,而是直接发送到控制对象上去。制对象上去。 (3 3)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消)系统消息:对程序化的事件或系统时钟中断作出反应。一些系统消息,象息,象DDEDDE消息(动态数据交换消息)要通过消息(动态数据交换消息)要通过WindowsWindows的系统消息队列,而的系统消息队列,而有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消有的则不通过系统消息队列而直接送入应用程序的消息队列,如创建窗口消息。息。 (4 4)用户消息:这是程

26、序员自己定义并在应用程序中主动发出的,一般)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。由应用程序的某一部分内部处理。3 3 图形输出图形输出 WindowsWindows程序不仅在输入上与程序不仅在输入上与DOSDOS程序不同,而且在程序输出上也与程序不同,而且在程序输出上也与DOSDOS有有着很大不同,主要表现为:着很大不同,主要表现为: DOSDOS程序独占整个显示屏幕,其他程序在后台等待。而程序独占整个显示屏幕,其他程序在后台等待。而WindowsWindows的每一个的每一个应用程序对屏幕的一部分进行处理。应用程序对屏幕的一部分进行处理。D

27、OSDOS程序可以直接往屏幕上输出,而程序可以直接往屏幕上输出,而WindowsWindows是一个多窗口的操作系统,由操作系统来统一管理屏幕输出;是一个多窗口的操作系统,由操作系统来统一管理屏幕输出; WindowsWindows程序的所有输出都是图形。程序的所有输出都是图形。WindowsWindows提供了丰富的图形函数用于提供了丰富的图形函数用于图形输出,这对输出图形是相当方便的,但是由于字符也被作为图形来图形输出,这对输出图形是相当方便的,但是由于字符也被作为图形来处理,输出时的定位要比处理,输出时的定位要比DOSDOS复杂得多。复杂得多。 WindowsWindows下的输出是设备

28、无关的。下的输出是设备无关的。WindowsWindows下的应用程序使用图形设备接下的应用程序使用图形设备接口(口(GDIGDI)来进行图形输出。来进行图形输出。4 4 用户界面对象用户界面对象 WindowsWindows支持丰富的用户接口对象,包括:窗口、图标、菜单、对话支持丰富的用户接口对象,包括:窗口、图标、菜单、对话框等等。程序员只需简单的几十行代码,就可以设计出一个非常漂亮的图框等等。程序员只需简单的几十行代码,就可以设计出一个非常漂亮的图形用户界面。而在形用户界面。而在DOSDOS环境下,则需要大量的代码来完成同样的工作,而且环境下,则需要大量的代码来完成同样的工作,而且效果也

29、没有效果也没有WindowsWindows提供的那么好。下面我们介绍一下用户界面对象中的一提供的那么好。下面我们介绍一下用户界面对象中的一些术语和相关概念。些术语和相关概念。5 5 资源共享资源共享 对于对于DOSDOS程序来说,它运行时独占系统的全部资源。而程序来说,它运行时独占系统的全部资源。而WindowsWindows是一个多是一个多任务的操作系统,各个应用程序共享系统提供的资源,常见的资源包括:任务的操作系统,各个应用程序共享系统提供的资源,常见的资源包括:设备上下文,画刷,画笔,字体,对话框控制,对话框,图标,定时器,设备上下文,画刷,画笔,字体,对话框控制,对话框,图标,定时器,

30、插入符号,通信端口,电话线等。插入符号,通信端口,电话线等。 WindowsWindows要求应用程序必须以一种能允许它共享要求应用程序必须以一种能允许它共享WindowsWindows资源的方式进行资源的方式进行设计,它的基本模式是这样的:向设计,它的基本模式是这样的:向WindowsWindows系统请求资源系统请求资源-使用该资源使用该资源-释释放该资源给放该资源给WindowsWindows以供别的程序使用。以供别的程序使用。例子例子 理解一个典型的 MFC 程序的结构和样式的最好方法是输入一段小程序,然后编译和运行它。下面的程序是一段简单的“hello world”程序。这对很多C程

31、序员都是很熟悉了,让我们看一下如何用MFC方法来实现。如果你是第一次看到这类程序,也许比较难理解。这没关系,我们后面会详细介绍。现在你只要用Visual C+ 环境中建立、编译和运行它就可以了。/hello.cpp #include / 说明应用程序类 class CHelloApp : public CWinApp public: virtual BOOL InitInstance(); ; / 建立应用程序类的实例 CHelloApp HelloApp; / 说明主窗口类 class CHelloWindow : public CFrameWnd CStatic* cs; public:

32、CHelloWindow(); ; / 每当应用程序首次执行时都要调用的初始化函数 BOOL CHelloApp:InitInstance() m_pMainWnd = new CHelloWindow(); m_pMainWnd-ShowWindow(m_nCmdShow); m_pMainWnd-UpdateWindow(); return TRUE; / 窗口类的构造函数 CHelloWindow:CHelloWindow() / 建立窗口本身 Create(NULL, Hello World!, WS_OVERLAPPEDWINDOW, CRect(0,0,200,200); / 建立

33、静态标签 cs = new CStatic(); cs-Create(hello world, WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150), this); 上面的这段程序如果用C来实现,得需要几页的代码。这个简单的例子做了三件事。第一,它建立了一个应用程序对象。你所编写的每个 MFC 程序都有一个单一的程序对象,它是处理 MFC 和 Windows 的初始细节的。第二,应用程序建立了一个窗口来作为应用程序的主窗口。最后,在应用程序的窗口中建立了一个静态文本标签,它包含有“hello world”几个字。在第二部分中我们会仔细研究这段程

34、序,以理解其结构。启动 VC+,如果你是刚刚安装好,则你会在屏幕上看到一个带有工具栏的空窗口。如果 VC+ 已经在该机器上使用过了,则所显示的窗口可能有些不同,因为 VC+ 会记忆和自动重新打开上次使用后退出时的项目和文件。我们需要的是它没有装如任何项目和代码。如果程序启动后弹出对话框指示不能打开某些文件,你只要单击“No”即可。在“WindowWindow”菜单中选取“Close All”Close All”选项关闭所有窗口。在“FileFile”菜单中选取“Close”Close”选项来关闭其它窗口。现在,你就处于开始状态了。如果你以后不希望看到“InfoViewer Topic”窗口,你

35、可以把它关掉。如果以后需要的话,你还可以打开该窗口。 现在一切都正常了。正如你所看到的,顶部是菜单和几个工具栏。左边的窗口所显示的是在线帮助内容,你可以双击某项标题来浏览其内容。在线帮助的内容是十分丰富的。 现在该做什么了?你所要做的是输入上面的程序,然后编译并运行它。开始之前,要检查以下你的硬盘上至少要留有5MB的剩余空间。建立项目和编译代码建立项目和编译代码 为了在 Visual C+ 中编译代码,你必须要建立一个项目。为了这么小的程序来建立一个项目可能有点小题大作,但是,在任何实际的程序中,项目的概念是非常有用的。一个项目主要保存着下面三种不同类型的信息: 1. 它可以记住建立一个可执行

36、程序所需要的所有源程序代码文件。在这个简单的例子中,文件 HELLO.CPP 是唯一的源文件,但是在一个大型的应用程序中,为了便于管理和维护,你可以会有许多个不同的源文件。项目会维护这些不同文件的列表,并当你要建立下一个新的可执行程序时,在必要时编译它们。2.它会记住针对你的应用程序所使用的编译器和连接器选项。例如,它会记住把哪个库连接到了执行程序中,你是否预编译了头文件等等。3.它会记住你想要建立的项目类型: 一个控制台应用程序,或一个窗口应用程序等等。 如果你已经对项目文件有所了解,则会很容易明白作为机器产生的项目文件的作用。现在,我们来建立一个简单的项目,并用它来编译 HELLO.CPP

37、。为此,首先从“FileFile”菜单中选择“NewNew”选项。在“ProjectsProjects”标签中,加单击“Win32 Win32 ApplicationApplication”。在“LocationLocation”域中输入一个合适的路径名或单击“BrowseBrowse”按钮来选择一个。在“Project nameProject name”中输入“hello”作为项目名称。这时候你会看到“hello”也会出现在“LocationLocation”域中。单击“OKOK”按钮。Visual C+ 会建立一个新的称为HELLO的目录,并把所有的项目文件 HELLO.OPT、HELLO

38、.NCB、HELLO.DSP 和 HELLO.DSW 都放到该目录中。如果你退出,以后再重新打开该项目,则可选择 HELLO.DSW。 现在,在屏幕的左边,出现了三个标签。InfoView 标签仍然在,又新出现了 ClassView 和 FileView 标签。ClassView 标签会把你程序中所有的类都列出来,FileView 标签给出了项目中文件的列表。现在可以输入程序的代码了。在“FileFile”菜单中选择“NewNew”选项来建立一个编辑窗口。在出现的对话框中,选择“FilesFiles”标签和“Text File”。则会出现 Visual C+ 的智能编辑器,你可以用它来输入上面

39、的程序代码。输入代码时,你会发现编辑器会自动把不同类型的文本变成不同的颜色,如注释、关键字字符串等的颜色都不同。如果你要改变其颜色或关闭颜色功能,可选择“ToolsTools”菜单中“OptionsOptions”选项,然后选择“FormatFormat”标签和“Source WindowsSource Windows”选项就可以修改。 输入完代码后,选择“FileFile”菜单中的“SaveSave”选项来保存。在 Visual C+ 新建立的目录中,把它存成 HELLO.CPP 文件。现在选择在“ProjectProject”菜单中选择“Add To Add To ProjectProje

40、ct”选项,再选“Files.Files.”。你会看到一个对话框供你选择要添加的文件。在本例子中,选择 HELLO.CPP 文件。 在屏幕的左边,单击 FileView 标签,并双击标有 HELLO 的图标。你会看到名为 HELLO.CPP 的文件。单击 ClassView 标签,并双击文件夹图标,你会看到程序中所有的类。任何时候你都可以使用 FileView 来删除项目的文件,你只要单击该文件,然后按键盘上的 delete 键。最后,此时你必须告诉项目要使用此时你必须告诉项目要使用MFCMFC库。库。如果你忽略了这一步,则项目在连接时会出错,而出错信息对你毫无帮助。选择“ProjectPro

41、ject”菜单的“SettingsSettings”。在出现的对话框中选择“GeneralGeneral”标签。在“Microsoft Foundation Microsoft Foundation ClassesClasses”组合框中,选择“Use MFC in a Shared DLL”。然后关闭对话框。 我们已经建立了项目文件,并调整了设置,你现在可以准备编译 HELLO.CPP 程序了。在“BuildBuild”菜单中,你会发现有三个不同的编译选项: Compile HELLO.CPPCompile HELLO.CPP (只有当含有 HELLO.CPP 的窗口处于激活状态时才可) B

42、uild HELLO.EXEBuild HELLO.EXE 1.1. Rebuild All Rebuild All 第一个选项只是编译源文件并形成它们的目标文件。该选项不能完成连接任务,所以它只对快速编译一些源文件以检查错误有用。第二个选项编译自上次编译后所修改的所有源文件,并连接形成可执行文件。第三个选项要重新编译和连接所有的源文件。 我们可以选择“Build HELLO.EXEBuild HELLO.EXE”来编译和连接代码。Visual C+ 会建立一个名为“Debug”的新子目录,并把 HELLO.EXE 放在该目录中。该子目录的文件都是可以再产生的,所以你可以任意删除它们。如果你发

43、现了编译错误,双击输出窗口中的错误信息。这时编辑器会把你带到出错的位置处。检查你的代码是否有问题,如果有,就修改之。如果你看到大量的连接错误,则可能你在建立项目对话框中所指定的项目类型不对。你可以把该项目所在的子目录删除,然后再重新按上面的步骤来建立。 为了执行该程序,你可选则“BuildBuild”菜单中的“Execute HELLO.EXEExecute HELLO.EXE”选项。你就可以看到你的第一个MFC程序了 - 出现一个带有“hello world”的窗口。该窗口本身带有:标题栏、尺寸缩放区、最大和最小按钮等等。在窗口上,有一个标有“hello world”。请注意,该程序是完整的

44、。你可以移动窗口、缩放窗口、最小化等。你只使用了很少的代码就完成了一个完整的 Window 应用程序。这就是使用 MFC 的优点。所有的细节问题都有MFC来处理。结论结论 在本节中,我们已经成功地编译和执行了第一个 MFC 程序。你将来会用类似的步骤来建立的应用程序。你可以为每个项目建立单独的目录,或建立一个单独的项目文件,然后再添加或删除不同的源文件。 在下一节中,我们将仔细研究该程序,你会更完整的理解它的结构。第二部分第二部分一个简单的一个简单的MFCMFC程序程序 在本将中,我们将一段一段地来研究上一将中提到的 MFC 应用程序,以便能理解它的结构和概念框架。我们将先介绍 MFC,然后在

45、介绍如何用 MFC 来建立应用程序。MFCMFC简介简介 MFC 是一个很大的、扩展了的 C+ 类层次结构,它能使开发 Windows 应用程序变得更加容易。MFC 是在整个 Windows 家族中都是兼容的,也就是说,无论是 Windows3.x、Windows95 还是 Windows NT,所使用的 MFC 是兼容的。每当新的 Windows 版本出现时,MFC也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC也会得到扩展,添加新的特性,变得更加容易建立应用程序。与传统上使用 C 语言直接访问 Windows API相反,使用 MFC 和 C+ 的优点是 MFC 已经包含和压缩

46、了所有标准的“样板文件”代码,这些代码是所有用 C 编写的 Windows 程序所必需的。因此用 MFC 编写的程序要比用C语言编写的程序小得多。另外,MFC 所编写的程序的性能也毫无损失。必要时,你也可以直接调用标准 C 函数,因为 MFC 不修改也不隐藏 Windows 程序的基本结构。 使用 MFC 的最大优点是它为你做了所有最难做的事。MFC 中包含了上成千上万行正确、优化和功能强大的 Windows 代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上讲,MFC 极大地加快了你的程序开发速度。MFC 是很庞大的。例如,版本4.0中包含了大约200个不同的类。万幸的是,

47、你在典型的程序中不需要使用所有的函数。事实上,你可能只需要使用其中的十多个 MFC 中的不同类就可以建立一个非常漂亮的程序。该层次结构大约可分为几种不同的类型的类: 应用程序框架 图形绘制的绘制对象 文件服务 异常处理 结构 - List、Array 和 Map Internet 服务 OLE 2 数据库 通用类在本章中,我们将集中讨论可视对象。下面的列表给出了部分类: CObject CCmdTarget CWinThread CWinApp CWnd CFrameWnd CDialog CView CStatic CButton CListBox CComboBox CEdit CScro

48、llBar 在上面的列表中,有几点需要注意。第一,MFC 中的大部分类都是从基类 CObjectCObject 中继承下来的。该类包含有大部分MFC类所通用的数据成员和成员函数。第二,是该列表的简单性。CWinAppCWinApp 类是在你建立应用程序是要用到的,并且任何程序中都只用一次。CWndCWnd 类汇集了 Windows 中的所有通用特性、对话框和控制。CFrameWndCFrameWnd 类是从 CWndCWnd 继承来的,并实现了标准的框架应用程序。CDialogCDialog 可分别处理无模式和有模式两种类型的对话框。CViewCView 是用于让用户通过窗口来访问文档。最后,

49、Windows 支持六种控制类型: 静态文本框、可编辑文本框、按钮、滚动条、列表框和组合框(一种扩展的列表框)。一旦你理解了这些,你也就能更好的理解 MFC 了。MFC 中的其它类实现了其它特性,如内存管理、文档控制等。为了建立一个MFC应用程序,你既要会直接使用这些类,而通常你需要从这些类中继承新的类。在继承的类中,你可以建立新的成员函数,这能更适用你自己的需要。前面的简单例子中已经看到了这种继承过程,下面会详细介绍。CHelloAppCHelloApp 和 CHelloWindowCHelloWindow 都是从已有的 MFC 类中继承的。设计一个程序设计一个程序 在讨论代码本身之前,我们

50、需要花些工夫来简单介绍一下 MFC 中程序设计的过程。例如,假如你要编一个程序来向用户显示“Hello World”信息。这当然是很简单的,但仍需要一些考虑。 “hello world”应用程序首先需要在屏幕上建立一个窗口来显示“hello world”。然后需要实际把“hello world”放到窗口上。我们需要但个对象来完成这项任务: 一个应用程序对象,用来初始化应用程序并把它挂到 Windows 上。该应用程序对象处理所有的低级事件。 一个窗口对象来作为主窗口。 1. 一个静态文本对象,用来显示“hello world”。 你用 MFC 所建立的每个程序都会包含头两个对象。第三个对象是针

51、对该应用程序的。每个应用程序都会定义它自己的一组用户界面对象,以显示应用程序的输出和收集应用的输入信息。 一旦你完成了界面的设计,并决定实现该界面所需要的控制,你就需要编写代码来在屏幕上建立这些控制。你还会编写代码来处理用户操作这些控制所产生的信息。在“hello world”应用程序中,只有一个控制。它用来输出“hello world”。复杂的程序可能在其主窗口和对话框中需要上百个控制。应该注意,在应用程序中有两种不同的方法来建立用户控制。这里所介绍的是用 C+ 代码方式来建立控制。但是,在比较大的应用程序中,这种方法是不可行的。因此,在通常情况下要使用资源文件的图形编辑器来建立控制。这种方

52、法要方便得多。理解理解“hello world”hello world”的代码的代码 下面列出了你在上一讲中已经输入、编译和运行的“hello world”程序的代码。添加行号是为了讨论方便。我们来一行行地研究它,你会更好的理解 MFC 建立应用程序的方式。 如果你还没有编译和运行该代码,应该按上一讲的方法去做。 1 /hello.cpp 2 #include 3 / Declare the application class 4 class CHelloApp : public CWinApp 5 6 public: 7 virtual BOOL InitInstance(); 8 ; 9

53、/ Create an instance of the application class 10 CHelloApp HelloApp; 11 / Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 ; 18 / The InitInstance function is called each 19 / time the application first executes. 20 BOOL CHell

54、oApp:InitInstance() 21 22 m_pMainWnd = new CHelloWindow(); 23 m_pMainWnd-ShowWindow(m_nCmdShow); 24 m_pMainWnd-UpdateWindow(); 25 return TRUE; 26 27 / The constructor for the window class 28 CHelloWindow:CHelloWindow() 29 30 / Create the window itself 31 Create(NULL, 32 Hello World!, 33 WS_OVERLAPPE

55、DWINDOW, 34 CRect(0,0,200,200); 35 / Create a static label 36 cs = new CStatic(); 37 cs-Create(hello world, 38 WS_CHILD|WS_VISIBLE|SS_CENTER, 39 CRect(50,80,150,150), 40 this); 41 把上面的代码看一遍,以得到一整体印象。该程序由六小部分组成,每一部分都起到很重要的作用。 首先,该程序包含了头文件 afxwin.h (第 2 行)。该头文件包含有 MFC 中所使用的所有的类型、类、函数和变量。它也包含了其它头文件,如 W

56、indows API 库等。 第 3 至 8 行从 MFC 说明的标准应用程序类 CWinAppCWinApp 派生出了新的应用程序类 CHelloAppCHelloApp。该新类是为了要重载 CWinAppCWinApp 中的 InitInstanceInitInstance 成员函数。InitInstance InitInstance 是一个应用程序开始执行时要调用的可重载函数。在第10行中,说明了应用程序作为全局变量的一个事例。该实例是很重要的,因为它要影响到程序的执行。当应用程序被装入内存并开始执行时,全局变量的建立会执行 CWinAppCWinApp 类的缺省构造函数。该构造函数会自

57、动调用在18至26行定义的 InitInstanceInitInstance 函数。 在第11至17中,CHelloWindowCHelloWindow 类是从 MFC 中的 CFrameWndCFrameWnd 类继承来的。CHelloWindow CHelloWindow 是作为应用程序在屏幕上的窗口。建立新的类以便实现构造函数、析构函数和数据成员。 第18至26行实现了 InitInstanceInitInstance 函数。该函数产生一个 CHelloWindowCHelloWindow 类的事例,因此会执行第27行至41行中类的构造函数。它也会把新窗口放到屏幕上。 第27至41实现了

58、窗口的构造函数。该构造函数实际是建立了窗口,然后在其中建立一个静态文本控制。要注意的是,在该程序中没有 mainmain 或 WinMainWinMain 函数,也没有事件循环。然而我们从上一讲在执行中知道它也处理了事件。窗口可以最大或最小化、移动窗口等等。所有这些操作都隐藏在主应用程序类 CWinAppCWinApp 中,并且我们不必为它的事件处理而操心,它都是自动执行、在 MFC 中不可见的。 下一节中,将详细介绍程序的各部分。你可能不能马上全都理解得很好: 但你最好先读完它以获得第一印象。在下一讲中,会介绍一些特殊的例子,并偶把各片段组合在一起,有助于你能更好的理解。程序对象程序对象 用

59、 MFC 建立的每个应用程序都要包括一个单一从 CWinAppCWinApp 类继承来的应用程序对象。该对象必须被说明成全局的(第10行),并且在你的程序中只能出现一次。 从 CWinAppCWinApp 类继承的对象主要是处理应用程序的初始化,同时也处理应用程序主事件循环。CWinAppCWinApp 类有几个数据成员和几个成员函数。在上面的程序中,我们只重载了一个 CWinAppCWinApp 中的虚拟函数 InitInstanceInitInstance。应用程序对象的目的是初始化和控制你的程序。因为 Windows 允许同一个应用程序的多个实例在同时执行,因此 MFC 把初始化过程分成

60、两部分并使用两个函数 InitApplication InitApplication 和 InitInstanceInitInstance 来处理它。此处,我们只使用了一个 InitInstanceInitInstance 函数,因为我们的程序很简单。当每次调用应用程序时都会调用一个新的事例。第3至8行的代码建立了一个称为 CHelloAppCHelloApp 的类,它是从 CWinAppCWinApp 继承来的。它包含一个新的 InitInstanceInitInstance 函数,是从 CWinAppCWinApp 中已存在的函数(不做任何事情)重载来的: 3 / Declare the

温馨提示

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

评论

0/150

提交评论