第一章MFC图形编程基础1.1MFC概述MFC(MicrosoftFoundationClasses)库是Microsoft为利用VC++开发Windows应用程序而提供的应用程序框架。在这个框架的支持下,对于不同的应用程序,编程的主要任务是填写各自特殊部分的代码。MFC类库由130多个类组成,封装了两千多个API函数。使用MFC编程具有很多优点:用类编程,将代码和数据封装在类中,大大减少了编程的复杂性;通过继承实现了基本的代码重用,在开发应用程序的过程中,我们可以通过继承来使用MFC中已经定义了的大量类,在保有它们原有的特性的同时,可以根据我们的需要来修改它们,使其具有新的特性;在使用MFC进行编程的过程中,可以利用其提供的各种工具,提高编程的效率;借助MFC类库中设计良好的类资源可以减少代码规模。使用MFC类库,编程者只需要注意应用程序与通用的Windows程序所不同的特性,而几乎所有的应用程序与Windows之间的接口都是由应用程序框架来实现的,这大大降低了编程的难度。Windows区别于DOS的一个重要的特征就是它的图形界面,所以,在Windows的程序中绘图就成为了Windows编程的一个非常重要的内容。为了满足编程者在程序中绘图的需要,MFC提供了许多与绘图相关的类和函数,使用它们用户可以绘制出想要的各种图形。1.2创建MFC项目使用MFC框架编程,首先需要创建一个MFC项目,MFC的应用程序开发都是在一个MFC项目中完成的。在本教程中,我们使用的开发平台是MicrosoftVisualStudio6.0中的VisualC++6.0。1.2.1使用MFCAppWizard创建MFC项目在MicrosoftVisualStudio6.0中,我们可以利用MFCAppWizard(MFC应用程序向导)来建立MFC项目,它提供了一个应用程序所必需的框架文件,如源文件、头文件、资源文件、项目文件等等。创建MFC项目由以下几个步骤完成:(1)启动VisualC++6.0,如图1.1所示。(2)从File菜单中选择New选项,出现New对话框(新建对话框),如图1.2所示。该对话框包括Files、Projects、Workspaces和OtherDocuments四个分页。选中Projects分页,在Projects面板中左侧的项目类型列表框中单击选中要创建的项目类型。这里我们选择MFCAppWizard[exe]项,表示要创建一个MFC应用程序。在Projectname文本输入框中输入要创建的项目的名称。我们在这里输入项目名称为“DrawTest”,本章的演示程序将在该项目中来完成。在Location文本输入框中输入用户希望存放项目的目录名,用户也可以点击输入框右侧的按钮,调用“ChooseDirectory”对话框来选择目录。系统会在用户选择的目录下创建一个与项目名称相同的目录来存放项目文件。系统的默认目录是MicrosoftVisualStudio6.0安装目录下的MyProjects目录。下面的一组单选按钮:Createnewworkspace,代表创建一个新的项目;Addtocurrentworkspace,代表要加入到当前的项目中。这里我们选择创建一个新的项目。因为VisualC++6.0在32位的操作系统平台上运行,所以在Platform编辑框中必须选中Win32复选框。(3)单击OK按钮。出现MFCAppWizard–Step1对话框,如图1.3所示。在这一步中,用户要选择应用程序的类型和资源文件所使用的语言。用户可以创建基于Singledocument(单文档),Multipledocument(多文档)和Dialogbased(对话框)的应用程序。这里我们选择创建基于单文档的应用程序。在“Whattypeofapplicationwouldyouliketocreate?”下拉框中,选择“中文[中国]”作为资源文本语言。选中“Document/Viewarchitecturesupport”复选框,表示应用程序将支持文档/视图体系。关于文档/视图体系,将在后面进行介绍。(4)单击Next按钮,出现MFCAppWizard–Step2of6对话框,如图1.4所示。在“Whatdatabasesupportwouldyouliketoinclude?”中,选择None单选钮,表示不需要数据库支持。(5)单击Next按钮,出现MFCAppWizard–Step3of6对话框,如图1.5所示。在“Whatcompounddocumentsupportwouldyouliketoinclude?”中,选择None单选钮,表示不需要复合文档的支持。同时在“Whatothersupportwouldyouliketoinclude?”中,选择ActiveXControls复选框,表示包括ActiveX。(6)单击Next按钮,出现MFCAppWizard–Step4of6对话框,如图1.6所示。在这一步,用户将对应用程序的界面特征进行设定。在“Whatfeatureswouldyouliketoinclude?”中,选中3Dcontrols(三维图形控件)选项,使控件具有立体感。如果用户选择了Dockingtoolbar选项,那么“Howdoyouwantyourtoolbarstolook?”被激活,这里有两个单选按钮:Normal表示生成传统意义上横跨在窗口顶端的工具条;InternetExplorerReBars表示生成IE4风格的附加工具条。选中Initialstatusbar复选框,表示窗口具有状态条。选中Printingandprintpreview复选框,表示应用程序提供打印和打印预览。在“Howmanyfileswouldyoulikeonyourrecentfilelist?”中使用默认值4,表示生成的应用程序的File菜单中显示4个最近打开过的文件。(7)单击Next按钮,出现MFCAppWizard–Step5of6对话框,如图1.7所示。在“Whatstyleofprojectwouldyoulike?”有两个单选按钮:MFCStandard表示提供一个标准的MFC应用程序架构;WindowsExplorer表示建立一个像WindowsExplorer那样使用分割窗口的应用程序,左边的成列窗口是CTreeView类,右边的成列窗口是CListView类。在“Wouldyouliketogeneratesourcefilecomments?”中,选择Yes,Please,表示在源代码中加上注释。在“HowwouldyouliketousetheMFClibrary?”中,选择AsasharedDLL,表示使用动态链接库,当应用程序仅使用MFC类库时,动态链接有利于减少占用的磁盘空间。(8)单击Next按钮,出现MFCAppWizard–Step6of6对话框,如图1.8所示。在这里可以修改所创建的类的类名和文件名,修改应用程序视类的基类。在列表框中单击选择CDrawTestView类,可以单击Baseclass下拉框的箭头,从中选择要使用的基类。我们这里使用默认的CView作为基类。除了修改应用程序视类的基类外,我们不建议修改这里各个类的类名和文件名。(9)单击Finish按钮,出现NewProjectInformation对话框,如图1.9所示。这里将显示用户前面几步所做的所有设置。如果检查设置无误,可以单击OK按钮,完成MFC项目的创建,系统在指定的目录下生成了应用程序的框架文件。至此,MFC项目创建完毕。实际上我们在第(3)步之后各步的设置中采用的都是系统的默认选项,所以可以在第(3)步选择完单文档应用程序后,直接单击Finish按钮,这时将直接出现第(9)步的NewProjectInformation对话框,这里表示第(3)步之后的各项设置都采用系统的默认设置。在第(3)步之后的各步中随时可以选择Finish按钮来直接完成设置。1.2.2MFC项目工作区窗口MFC创建完成之后,用户可以通过项目工作区窗口进行文件组织,项目管理和项目设置更改。如图1.10所示。在项目工作区窗口中一共有三个分页,分别是ClassView面板、ResourceView面板和FileView面板。在每个面板中都有一个树型结构,用户可以用鼠标单击树型节点左侧的“+”字展开节点或者单击“-”字层叠节点。(1)ClassView面板(类面板)类面板显示了当前项目中所包含的类和类成员的树型结构,如图1.11所示。展开“DrawTestclasses”节点,该节点的下层节点就是当前项目中所包含的所有类;展开每个类节点,所显示的就是该类中的所有类成员,包括成员函数和成员变量。在类的每个成员节点的左边都有一个小图标,该图标给出了成员函数或成员变量的类型以及存取类别:钥匙图标,表示该类成员为保护成员;红色方块,表示该类成员为成员函数;蓝色方块,表示该类成员为成员变量;锁,表示该类成员为私有成员变量;“Globals”节点下是项目中的全局成员。通过使用类面板,用户可以很方便的查看和编辑源代码文件。双击类节点,就会打开对应该类的头文件;双击类成员节点,就会打开相应的源码文件,并定位到相应的位置:双击成员函数,打开类文件(.cpp文件),并定位到函数方法名最左端;双击成员变量,打开头文件(.h文件),并定位到变量声明的最左端。如图1.12,就是双击了CDrawTestView类的OnDraw(CDC*pDC)成员函数节点。开发平台打开DrawTestView.cpp类文件,并将光标定位在OnDraw函数名的最左端。用户可以在源代码编辑窗口中进行代码编写。在类节点或类成员节点上用鼠标右键单击,会弹出快捷菜单,如图1.13所示。利用快捷菜单,用户可以方便的创建新类;给已有类增减成员函数和成员变量;直接跳转到类、成员函数、成员变量的定义和声明处等等。具体的使用方法将在后面进行介绍。(2)ResourceView面板(资源面板)资源面板用于管理项目资源,应用程序中所使用的对话框、图标、菜单、工具条等都属于项目资源。如图1.14所示。根节点“DrawTestresources”的下层节点是各种项目资源文件夹。展开项目资源文件夹,就可以看到项目中包含的资源。双击资源节点,就可以对该资源进行查看和编辑。例如用户想要查看当前应用程序的工具条,就可以先展开Toolbar项目文件夹节点,然后双击IDR_MAINFRAME(我们所创建的应用程序的工具条),就可以对该工具条进行查看和编辑。(3)FileView面板(文件面板)文件面板显示了项目所包含的各种文件及其之间的关系,如图1.15所示。用鼠标双击文件面板中的文件名,源代码编辑窗口会自动以合适的编辑器打开相应的文件。在文件面板中我们看到在“SourceFiles”中有一个DrawTest.rc文件。.rc文件就是项目的资源文件,双击该文件,将自动打开资源面板。虽然我们在文件面板中也可以打开类的源代码文件,对类及其成员进行编辑。但是这里还是强烈建议用户使用类面板对类及其成员进行操作。在面向对象程序设计中,程序员操作的对象是类,代码的设计和编写始终都应该是基于类对象的。通过类面板,用户可以时刻了解当前应用程序的类组成,而且每个类的成员构成一目了然。尽管VisualC++6.0中每个类仍然是由两个源代码文件组成,但是我们在编程过程中应该将这两个文件当成一个整体来看。利用类面板及其提供的快捷菜单,也可以加快开发,减少错误。1.2.3文档/视图体系前面在创建MFC项目的时候,我们曾经设置过要应用程序支持文档/视图体系。这里我们说明一下什么是文档/视图体系。在说明之前,先看看我们创建的这个单文档应用程序都包含了哪些类。通过类面板,我们可以看到在当前项目中包含了五个类:CAboutDlg类,CDrawTestApp类,CDrawTestDoc类,CDrawTestView类和CMainFrame类。其中C