VisualC面向对象编程教程第4章创建应用程序框架课件

PPT
  • 阅读 27 次
  • 下载 0 次
  • 页数 93 页
  • 大小 1.600 MB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
VisualC面向对象编程教程第4章创建应用程序框架课件
可在后台配置第一页与第二页中间广告代码
VisualC面向对象编程教程第4章创建应用程序框架课件
可在后台配置第二页与第三页中间广告代码
VisualC面向对象编程教程第4章创建应用程序框架课件
可在后台配置第三页与第四页中间广告代码
VisualC面向对象编程教程第4章创建应用程序框架课件
VisualC面向对象编程教程第4章创建应用程序框架课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 93
  • 收藏
  • 违规举报
  • © 版权认领
下载文档30.00 元 加入VIP免费下载
文本内容

【文档说明】VisualC面向对象编程教程第4章创建应用程序框架课件.ppt,共(93)页,1.600 MB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44920.html

以下为本文档部分文字说明:

版权所有复制必究应用程序框架应用程序向导应用程序向导生成的文件ClassWizard类向导程序调试通过本章的学习我们可以真正利用VisualC++创建一个简单的MFC应用程序。本章内容同一类型

应用程序的结构大致相同,并有很多相同的源代码,因此可以通过一个应用程序框架AFX(ApplicationFrameWorks)编写同一类型应用程序的通用源代码。何谓应用程序框架?与其它可视化开发工具一样,VisualC++提供了创建应用程序框架的向导AppWizard和相关的开发工具

。在可视化开发环境下,生成一个应用程序要做的工作主要包括编写源代码、添加资源和设置编译方式。向导实质上是一个源代码生成器,利用应用程序向导可以快速创建各种风格的应用程序框架,自动生成程序通用的源代码,这样大大减轻了手工编写代码的工作量。即使不非常熟悉Vi

sualC++编程,也可以利用它的应用程序向导一个简单的应用程序。4.1应用程序向导创建一个应用程序,首先要创建一个项目。项目用于管理组成应用程序的所有元素,并由它生成应用程序。VisualC++集成开发环境包含了创建各种类型应用程序的向导,执行File菜单中的New命令即

可看到向导类型。VisualC++集成开发环境中主要向导类型:4.1.1VisualC++中的向导类型主要向导类型DatebaseProject:创建数据库项目MFCActiveXControlWiz

ard:创建基于MFC的ActiveX控件MFCAppWizard[dll]:创建基于MFC的动态链接库MFCAppWizard[exe]:创建基于MFC的应用程序(最常用)NewDatabaseWizar

d:在SQL服务器上创建一个SQLServer数据库Win32Application:创建Win32应用程序,可不使用MFC,采用SDK方法编程Win32ConsoleApplication:创建D

OS下的Win32控制台应用程序,采用C++或C语言进行编程Win32Dynamic-linkLibrary:创建Win32动态链接库,采用SDK方法Win32StaticLibrary:创建Win32

静态链接库,采用SDK方法4.1.2使用MFCAppWizard[exe]引入应用程序向导的目的:区别于DOS程序,即使一个简单的Windows程序,它也必须显示一个程序运行窗口,需要编写复杂的程序代码。而同一类型应用程序的框架窗口风格是相同的

,如相同的菜单栏、工具栏、状态栏和用户区。并且,基本菜单命令的功能也是一样的,如相同的文件操作和编辑命令。所以,同一类型应用程序建立框架窗口的基本代码都是一样的,尽管有些参数不尽相同。为了避免程序员重复编写这些代码,一般的可视化软件开发工具都提供了创建Wi

ndows应用程序框架的向导。MFCAppWizard[exe]的功能:MFCAppWizard[exe]是创建基于MFC的Windows应用程序的向导。当利用MFCAppWizard[exe]创建一个项目时,它能够自动生成一个MFC应

用程序的框架。即使不添加任何代码,当执行编译、链接命令后,VisualC++IDE将生成一个Windows界面风格的应用程序。MFC应用程序框架将那些每个应用程序都共同需要使用的代码封装起来,如完成默认的程序初始化功能、建立应用程序界面和处理基本的Windows消息,使程序员不必做这些重复

的工作,把精力放在编写实质性的代码上。MFCAppWizard[exe]向导提供了一系列选项,程序员通过选择不同的选项,可以创建不同类型和风格的MFC应用程序,并可定制不同的程序界面窗口。例如,单文档、多文档、基于

对话框的程序,是否支持数据库操作、是否可以使用ActiveX控件以及是否具有联机帮助等。例编写一个单文档应用程序Mysdi,程序运行后在程序视图窗口显示信息“这是一个单文档程序!”。在VisualC++中执行File|New命令,出现N

ew对话框。确认New对话框的当前页面为Project,在左栏的项目类型列表框中选择MFCAppWizard[exe]项,在ProjectName框输入要创建项目的名称。在location栏中输入项目所在的目录,可单击右侧“…”浏览按钮来对默认的目录

进行修改。向导将在该目录下存放项目的所有文件。单击OK按钮出现MFCAppWizard-Step1对话框。在MFCAppWizard-Step1对话框中选择应用程序的类型。Singledocume

nt:单文档界面应用程序,程序运行后出现标准的Windows界面,它由框架(包括菜单栏、工具栏和状态栏)和用户区组成。并且程序运行后一次只能打开一个文档,如Windows自带的记事本Notepad。Multipledocuments:多文档界面应用程

序,程序运行后出现标准的Windows界面,并且可以同时打开多个文档,如Word。Dialogbased:基于对话框的应用程序,程序运行后首先出现一个对话框界面,如计算器Calculator。MFCAppWizard[exe]创建应用程序的类型:

None:向导创建的应用程序不包括对数据库的操作功能,但以后可以手工添加对数据库的操作代码(默认项)。Headerfilesonly:提供了最简单的数据库支持,仅在项目的stdAfx.h文件中使用#include指令包

含afxdb.h和afxdao.h两个用于定义数据库类的头文件,但并不生成与数据库相关的类,用户需要时可以自己生成。Databaseviewwithoutfilesupport:包含了所有的数据库头文件,并生成

了相关的数据库类和视图类,但不支持文档的序列化,向导创建的应用程序的File主菜单中将不包含有关文件操作的菜单命令项。Databaseviewwithfilesupport:包含了所有的数据库头文件,生成了相关的数据库类和视图类,支持文档的序列化。在MFCAppWizard-Step2o

f6选择应用程序所支持的数据库方式,包括以下选项:None:应用程序不支持任何复合文档(默认项)。Container:应用程序作为复合文档容器,能容纳所嵌入或链接的复合文档对象。Mini-server:微型复合文档服务器,应用程序可以创建和管理复合文档对象,但对

于它所创建的复合文档对象,集成应用程序可以嵌入,但不能链接。微型服务器不能作为一个单独的程序运行,而只能由集成应用程序来启动。Full-server:完全复合文档服务器,除了具备上面微型服务器的功能外,应用程序支持链接式对象,并可作为一个单独的程序运行。Bothcontaine

randserver:应用程序既可作为一个复合文档容器,又可作为一个可单独运行的复合文档服务器。在MFCAppWizard-Step3of6选择应用程序所支持的数据库方式复合文档类型,包括以下选项:Dockingtoolbar:

应用程序具有标准的工具栏(默认项)Initialstatusbar:应用程序具有标准的状态栏(默认项)Printingandprintpreview:应用程序支持打印和打印预览功能(默认项)Context-sensitiveHelp:应用程序具有上下文相关帮助功能3Dcontrols:应用

程序界面具有三维外观(默认项)Normal:应用程序采用传统风格的工具栏(默认项)InternetExplorerReBars:应用程序采用IE风格的工具栏Howmanyfileswouldyoulikeonyourrecentfilelist:在File主菜单

可列出文档的最多个数。Advanced按钮:进行更高一级的设置,如修改文件名或扩展名,调整程序用户界面窗口的样式(边框厚度和最小化、最大化、关闭按钮)。在MFCAppWizard-Step4of6设置应用程序界面特征(工具

栏和状态栏),包括以下选项:MFCStandard:应用程序采用MFC标准风格(默认项)WindowsExplorer:应用程序采用Windows资源管理器风格选择向导是否为源代码生成注释设置MFC

库与应用程序的链接方式:(1)AsasharedDLL:采用共享动态链接库的方式(默认项),即在程序运行时才调用MFC库。采用此方式可减少应用程序的代码长度。(2)Asastaticallylinkedlibrary:采用静态链接库的方式,即在编译时把MFC库与应用程序相链接。采用此方

式能提高运行速度,且不用考虑程序最终运行环境中是否安装了MFC库。在MFCAppWizard-Step5of6设置项目的风格,包括以下选项:在NewProjectInformation对话框,根据用户在前面各步

所做的选择列出将要创建的应用程序的有关信息,如应用程序的类型、创建的类和文件名、应用程序的特征以及项目所在的目录。若要修改这些内容,可单击Cancel按钮返回到前一个对话框。单击OK按钮,MFCAppWizard[exe]向导将开始创建应用程序框架。在MFCAppWizard

-Step6of6,列出了向导将创建的类,用户可以修改一些类默认的类名和对应的头文件名、实现文件名。对某些类还可以选择不同的基类。利用MFCAppWizard[exe]向导创建应用程序Mysdi的框架后,用户无需添加任何代码,就可以对程序进行编译、链

接,生成一个应用程序。但一般情况下,用户应根据程序具体功能需要,利用DeveloperStudio中的集成工具向应用程序框架添加具体的代码。当应用程序框架创建成功后,DeveloperStudio将装入应用程序项目,并在项目工作区窗口打开这个项目。值得说明的是,若想在同

一个目录下重新创建一个同名的项目,必须首先将原来的项目删除或移走。在视图类的成员函数OnDraw()中实现屏幕输出voidCMysdiView::OnDraw(CDC*pDC){CMysdiDoc*pDoc=GetDocum

ent();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedataherepDC->TextOut(100,100,“这是一个单文档程序!”);//在坐标(100,100)处显示文本串}执行Build(F7)命令编译链接程序,程序运行后

将在程序视图区域显示文本串。例2编写一个基于对话框的应用程序MyDialog,程序运行后显示一个对话框。编程说明与实现1.执行File|New命令,在New对话框中选择MFCAppWizard[exe]项,输入程序名MyDialog。单击OK按钮,出现MFCAp

pWizard-Step1。2.在MFCAppWizard-Step1中选择DialogBased选项,单击Next按钮,出现MFCAppWizard-Step2of4。3.在MFCAppWizard-Step2of4中设置应用程序界面特征。4.创建对话框应用程序后续的步骤与创建单文档或多文档应

用程序的Step5和Step6相同。利用VisualC++编写Windows应用程序可以采取几种不同的途径:利用Win32应用程序接口API(ApplicationProgrammingInterface)提供的函数,用C或C++语言编写程序。由于MFC通过类对API的绝

大部分功能进行了封装,可以利用MFC,用C++语言编写程序。利用MFC和MFCAppWizard[exe],首先利用MFCAppWizard[exe]应用程序向导生成基本的应用程序框架,然后按照MFC机制和原理向框架添加具体的应用代码。4

.1.3MFC应用程序的开发流程根据应用程序特性在MFCAppWizard[exe]应用程序向导各步骤对话框中进行选择,创建一个应用程序的框架。利用资源编辑器为程序编辑或添加资源,如编辑菜单、添加对话框等。利用ClassWizard类向导或手工添加类、成员变量和成员函数的声明。根

据需要编写具体的函数代码。编译、链接程序。如果程序有语法错误,需要修改源程序。直到没有编译、链接错误,才能得到可执行程序。测试应用程序各项功能,如果程序没有实现程序设计所要求的功能,启动Debug调试器进行调试,找出并修改

程序设计中的逻辑错误。编写一个实现具体功能的MFC应用程序的步骤:ClassWizard类向导:VisualC++IDE为MFC提供了大量的支持工具,除了MFCAppWizard[exe]向导,还提供了

ClassWizard类向导,利用它程序员可以方便地增加或删除对某个消息的处理。资源编辑器:为程序添加具体的代码时还经常要用到资源编辑器。下图形象地说明了编写一个MFC应用程序的流程、所用到的工具及主要生成的文件。

编程时,除了编辑现有的资源,有时需要向项目添加新的资源,这时可以利用Insert菜单创建一个新的资源。打开Insert菜单,选择Resource菜单项,出现InsertResource对话框,如下图所示,在ResourceType框中选择一个资

源类型,单击New按钮即可向项目添加一个资源。总结我们可以为VisualC++MFC编程作一个形象的总结,MFC应用程序框架使我们的程序设计工作犹如做填充题,DeveloperStudio中的集成工具使我们的程序设计工作犹如做选择题,程序员犹如软件集成装配车间里的技术工人(兰领、白

领)。MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,编程时需要利用C++类的继承性从MFC类中派生出自己的类,实现标准Windows应用程序的功能。MFCAppWizard[exe]向导

对Windows应用程序进行了分解,并利用MFC的派生类对应用程序重新进行了组装,同时还规定了应用程序中所用到的MFC派生类对象之间的相互联系,这就是向导生成的MFC应用程序框架。MFC应用程序框架实质上是一

个标准的Windows应用程序,它具有标准的窗口、菜单栏和工具栏。4.2应用程序向导生成的文件为了生成一个可执行程序,MFCAppWizard[exe]向导必须首先创建一个项目,并为项目生成一系列初始文件,

如C++头文件、C++源文件、资源文件和项目文件,其中的C++文件都是以MFC派生类为单元来组织的。如果要从项目中删除文件,首先在项目工作区FileView页面中选中要删除的文件,然后按Delete键。但注意这并没有从硬盘上真正删除了该文件。VisualC++中的文件类型很多,根据

项目类型不同而产生不同类型的文件。下面列出了MFCAppWizard[exe]应用程序向导生成的文件类型。当进行编辑、编译和链接时,还要生成一些临时文件。4.2.1应用程序向导生成的文件类型VisualC++中通用的文件类型后缀类型说明dsw工作区文件将项目的

详细情况组合到工作区中dsp项目文件存储项目的详细情况并替代mak文件hC++头文件存储类的定义代码cppC++源文件存储类的成员函数的实现代码rc资源脚本文件存储菜单、工具栏和对话框等资源rc2资源文件用来将资源包含到项目中ico图标文

件存储应用程序图标bmp位图文件存储位图clw类向导文件存储ClassWizard类向导使用的类信息VisualC++中类的支持文件•一般而言,C++中的一个类由头文件h和源文件cpp两类文件支持。•头文件用于定义类,包括指明派生关系、声

明成员变量和成员函数。•源文件用于实现类,主要定义成员函数的实现代码和消息映射。•例如,应用程序视图类CMysdiView的两个支持文件是MysdiView.h和MysdiView.cpp。4.2.2应用程序向导生成的头文件•MFCAppWizard[exe]向导为一

般的SDI应用程序生成了五个类,这些类都是MFC类的派生类。这里的“一般的SDI应用程序”是指向导每一步都采用默认选项,如不支持数据库和OLE对象等。•一般应用程序框架中所有类的名字由MFCAppWizard[exe]向导根据一定的规则自动命名,但用户可以在向导的第6步改变类名和有关类的文件名

。应用程序框架中类(框架窗口类例外)的命名规则一般遵照如下要求:ClassName=C+ProjectName+ClassType注:在定义类的头文件中的开始位置(类的正式定义前)有一段预处理命令代码,这些代码是为Develop

erStudio自身准备的,如用于保证头文件在编译时仅被编译一次。DeveloperStudio中的资源编辑器、ClassWizard类向导和编译器都可能用到这些代码。这些代码如下形式所示:#if!defined(AFX_MAINFRM_H__DE1F30C9

_677C_11D6_888#defineAFX_MAINFRM_H__DE1F30C9_677C_11D6_888D_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000向导为项目Mysdi生成了框架窗口类的

头文件MainFrm.h,该头文件用于定义框架窗口类CMainFrame。不同的SDI应用程序,其框架窗口类名和文件名是统一的。CMainFrame类是MFC的CFrameWnd类的派生类,它主要负责创建标题栏、菜单栏、工具栏和状态栏。CMainFram

e类中声明了框架窗口中的工具栏m_wndToolBar、状态栏m_wndStatusBar两个成员变量和四个成员函数。1.框架窗口类头文件向导为项目Mysdi生成了文档类的头文件MysdiDoc.h,该头文件用于定义文档类CMysdiDoc。CMysdiDoc类是MFC的CDocument类

的派生类,它主要负责应用程序数据的保存和装载,实现文档的序列化功能。2.文档类头文件向导为项目Mysdi生成了视图类的头文件MysdiView.h,该头文件用于定义视图类CMysdiView。视图类用于处理客户区窗口,它是框架窗口中的一个子窗口。CMysdiVie

w类是MFC的CView类的派生类,它主要负责客户区文档数据的显示,以及如何进行人机交互。3.视图类头文件向导为项目Mysdi生成了应用程序类的头文件Mysdi.h,该头文件用于定义应用程序类CMysdiApp。CMysdiApp

类是MFC的CWinApp类的派生类,它主要负责完成应用程序的初始化、程序的启动和程序运行结束时的清理工作。4.应用程序类头文件在项目中,资源通过资源标识符加以区别,通常将一个项目中所有的资源标识符放在头文件Resourde.h中定义。

向导为项目Mysdi生成了资源头文件Resource.h,该文件用于定义项目中所有的资源标识符,给资源ID分配一个整数值。标识符的命名有一定的规则,如IDR_MAINFRAME代表有关主框架的资源,

包括主菜单、工具栏及图标等。标识符以不同的前缀开始,见下表。5.资源头文件标识符前缀说明IDR_主菜单、工具栏、应用程序图标和快捷键表IDD_对话框IDC_控件和光标IDS_字符串IDP_提示信息对话框的字符串ID_菜单命令项MFC中资源标识符前缀向导为项目Mysdi生成了标准包含头

文件StdAfx.h,该文件用于包含一般情况下要用到且的头文件,如MFC类的声明文件afxwin.h、使用工具栏和状态栏的文件afxext.h,这些头文件一般都存放在路径“…\MicrosoftVisualSt

udio\VC98\MFC\Include”下。StdAfx.h文件和StdAfx.cpp文件用来生成预编译文件。6.标准包含头文件对应于一个头文件中定义的类,都有一个类的实现文件。在实现文件中主

要定义在头文件中声明的成员函数的实现代码和消息映射。MFCAppWizard[exe]生成的实现文件也包括六种。值得说明的是,向导生成的成员函数有很多,不要因为没有使用某个成员函数而删除其声明和实现代码。并且,用户一般不要轻易修改文件中那些以灰色字体显示的代码,因为这些代码是通

过资源编辑器或ClassWizard类向导进行维护的。4.2.3应用程序向导生成的实现文件向导为项目Mysdi生成了框架窗口类的实现文件Mainfrm.cpp,该文件包含了窗口框架类CMainFrame的实现代码,主要是CMainFrame类成员函数的

实现,它实现的框架窗口是应用程序的主窗口。1.框架窗口类实现文件CMainFrame类的四个主要成员函数:AssertValid():诊断CMainFrame对象是否有效,调试用。Dump():输出

CMainFrame对象的状态信息,调试用。OnCreate():创建工具栏m_wndToolBar和状态栏m_wndStatusBar。而视图窗口是由基类CFrameWnd的成员函数OnCreate()通过调用OnCreateClient()函数创建的。

PreCreateWindow():如果要创建一个非默认风格的窗口,可以重载该函数(虚函数),在函数中通过修改CREATESTRUCT结构参数cs来改变窗口类、窗口风格、窗口大小和位置等。在项目工作区ClassView页面打开CMainF

rame类,双击成员函数PreCreateWindow()在编辑窗口打开该函数,添加代码:例修改程序Mysdi,使程序运行窗口没有最大化按钮。BOOLCMainFrame::PreCreateWindow(CREATEST

RUCT&cs){if(!CFrameWnd::PreCreateWindow(cs))returnFALSE;//TODO:ModifytheWindowclassorstylesherecs.style&=~WS_MAXIMIZEBOX;//取消窗口的最大

化按钮returnTRUE;}向导为项目Mysdi生成了文档类的实现文件MysdiDoc.cpp。与框架类CMainFrame类似,文档类CMysdiDoc也定义了两个用于调试的成员函数AssertValid()和Dump。2.文档类实现文件文档类C

MysdiDoc的成员函数:AssertValid()Dump()OnNewDocument():当用户执行File菜单中New命令时,MFC应用程序框架会调用函数OnNewDocument()来完成新

建文档的工作。Serialize():负责文档数据的磁盘读写操作。注意:由于SDI单文档应用程序中只处理一个文档对象,当执行New命令时,文档对象已经生成,因此文档类CMysdiDoc的构造函数不会再被调用。所以,SDI应用程序不要在构造函数中进行文档对象成员变量的初始化,而应在OnNewDo

cument()函数中(看后面的例子)。在文档派生类CMysdiDoc重载的OnNewDocument()函数中,首先需要调用基类CDocument的OnNewDocument()函数。3.视图类实现文件向导为项

目Mysdi生成了视图类的实现文件MysdiView.cpp,该文件主要定义了视图类的成员函数。视图对象是用来显示文档对象的内容。与框架类和文档类一样,视图类CMysdiView也定义了两个用于调试的成员函数AssertValid()和Dump()。视图类CMysdiView的成员函

数:GetDocument():用于获取当前文档对象的指针m_pDocument。如果是建立程序的Release发行版,函数GetDocument()作为内嵌(inline)函数来实现。OnDraw():虚函数,它负责文档对象的数据在用户视图区的显示输出。例修改程序My

sdi,为CMysdiDoc文档类定义一个字符串类型的成员变量,在OnNewDocument()函数中初始化成员变量。在OnDraw()函数中访问该成员变量,并在屏幕上输出它的值。(1)在头文件MysdiDoc.h文档类

CMysdiDoc的定义中增加成员变量m_szText,用于保存将要显示的文本信息:public:char*m_szText;(2)在文档类实现文件MysdiDoc.cpp中找到成员函数OnNewDocument(),添加初始化m_szText的代码:BOOLCMysdiDoc::OnNewDoc

ument(){if(!CDocument::OnNewDocument())returnFALSE;//TODO:addreinitializationcodehere,…m_szText=“这是一个单文档程序!”;//初始化returnTRUE;}(3)在视图类实

现文件MysdiView.cpp中找到成员函数OnDraw(),向导创建的函数框架中已自动添加了函数GetDocument()的调用语句,以获取与当前视图相关联的文档指针pDoc。手工添加如下代码,通过pDoc访问文档类CMysdiDoc

的成员变量m_szText,用于在屏幕上输出。voidCMysdiView::OnDraw(CDC*pDC)//pDC是当前输出设备环境的指针{CMysdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//得到当前文档指针pDoc//TO

DO:adddrawcodefornativedataherepDC->TextOut(100,100,pDoc->m_szText);//通过pDoc访问文档对象的成员变量}向导为项目Mysdi生成了应用程序类的

实现文件Mysdi.cpp,该文件是应用程序的主文件,MFC应用程序的初始化、启动运行和结束都是由应用程序对象完成。在Mysdi.cpp文件中定义了应用程序类CMysdiApp的成员函数,以下列出了应用程序类实现文件

Mysdi.cpp的部分源代码。4.应用程序类实现文件......BEGIN_MESSAGE_MAP(CMysdiApp,CWinApp)//{{AFX_MSG_MAP(CMysdiApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)//ClassW

izard将在此处添加和删除消息映射宏......END_MESSAGE_MAP()//CMysdiAppconstructionCMysdiApp::CMysdiApp(){//TODO:在此处添加构造函数代码//把所有的重要的初始化信息放在InitInstance过程当中}//声明

唯一的CMysdiApp对象theAppCMysdiApptheApp;//CMysdiApp的初始化BOOLCMysdiApp::InitInstance(){//标准初始化//如果不使用这些特征并希望减少最终可执行代码的长度,//你可以去掉以下专门的初始化代码。...//

设置应用程序的注册键//TODO:你应该为这个字符串设置适当的内容,如公司名SetRegistryKey(_T("LocalAppWizard-GeneratedApplications"));//装入应用程序INI文件

中的设置信息,如“最近使用的文件列表”项LoadStdProfileSettings();//注册应用程序文档模板,文档模板用于链接文档、框架窗口和视图CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_M

AINFRAME,RUNTIME_CLASS(CMysdiDoc),RUNTIME_CLASS(CMainFrame),//SDI框架窗口RUNTIME_CLASS(CMysdiView));AddDocTempl

ate(pDocTemplate);...//主窗口已经初始化,在此显示并刷新窗口m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();returnTRUE;}向导为项目Mysdi生成

了标准包含文件StdAfx.cpp,该文件用于包含StdAfx.h标准包含头文件。StdAfx.cpp文件用于生成项目的预编译头文件(Mysdi.pch)和预编译类型信息文件(StdAfx.obj)。由于大多数MFC应用程序的实现文件都包

含StdAfx.h头文件(其中包含了一些共同要使用的头文件),如果在每个实现文件中都重新编译StdAfx.h头文件,整个编译过程将浪费大量的时间。为了提高编译速度,可以首先将项目中那些共同要使用的头文件编译出来,首次编译后将结果存放在一个名为预编译头文件的中间文件中,以后再编译时

直接读出存储的结果,无需重新编译,节约了编译时间。5.标准包含文件Windows编程的一个主要特点是资源和代码的分离,即将菜单、工具栏、字符串表、对话框等资源与基本的源代码分开。优点:这样使得对这些资源的修改独立于源代码。例如,可以将字符串表翻译成另一种语言,而无需

改动任何源代码。当Windows装入一个应用程序时,一般情况下,程序的资源数据并不同时装入内存,而是在应用程序执行过程中需要时如创建窗口、显示对话框或装载位图,才从硬盘读取相应的资源数据。4.2.4应用程序生成的资源文件1.资源文件向导为项目Mysdi生成了资源文件M

ysdi.rc和Mysdi.rc2。Mysdi.rc是VisualC++生成的脚本文件,它使用标准的Windows资源定义语句,可通过资源编译器转换为二进制资源。一般利用资源编辑器对资源进行可视化编辑,也可通过Open命令以文本方式打开一个资源文件进行编辑。Mysdi

.rc2文件一般用于定义资源编辑器不能编辑的资源。2.图标文件向导为项目Mysdi生成了应用程序的图标文件Mysdi.ico。在VisualC++中,可利用图形编辑器编辑应用程序的图标。3.文档图标文件向导为项

目Mysdi生成了文档图标文件MysdiDoc.ico。文档图标一般用于多文档应用程序中,在程序Mysdi中没有显示这个图标,但编程时用户可以利用相关函数来获取该图标资源并显示图标(ID为IDR_MYSDITYPE)。4.工具栏按钮位图文件向导为项目M

ysdi生成了工具栏按钮的位图文件Toolbar.bmp,该位图是应用程序工具栏中所有按钮的图形表示。除了上述用于生成可执行程序的源代码文件和资源文件,向导还为项目生成了其它一些在开发环境中必须使用的文件,如项目文件、项目工作区文件和ClassWizard类向导文件。1.项目文件项目用项目文件

DSP(DeveloperStudioProject)来描述,向导为项目Mysdi生成了项目文件Mysdi.dsp,该文件将项目中的所有文件组织成一个整体。项目文件保存了有关源代码文件、资源文件以及你所指定的编译设置等信息。4.2.5应用程序生成的其他文件2.项目工作区文件

为了创建应用程序,必须在DeveloperStudio的工作区中打开项目,这些应用程序项目工作区设置信息保存在项目工作区文件DSW(DeveloperStudioWorkspace)中。向导为项目Mysdi生成了项目工作区文件Mysdi.dsw,该文

件将一个DSP项目文件与具体的DeveloperStudio结合在一起,它保存了上一次操作结束时窗口状态、位置以及工作区设置信息。3.类向导文件向导为项目Mysdi生成了类向导文件Mysdi.clw,该文件存储了ClassWi

zard类向导使用的类信息,如类信息的版本、类的数量、每个类的头文件和实现文件。利用ClassWizard类向导时要使用该文件。如果从项目中删除了clw文件,下次使用ClassWizard类向导时会出现提示对话框,询问是否想重新创建这个文件。4.3ClassWizard类向导利用应用

程序向导生成MFC应用程序框架后,用户需要为自己的MFC派生类添加消息处理成员函数和对话框控件的成员变量,有时还需要为程序添加新的MFC派生类,这时用户需要使用ClassWizard类向导。MFCClassWizard类向

导根据程序员的要求以半自动的方式添加程序代码,它是进行MFC应用程序设计时一个必不可少的交互式工具,在今后的程序设计中经常用到它。4.3.1ClassWizard的功能定制现有的类和建立新的类,如把消息映射为

类的成员函数,把一个控件与类的成员变量关联起来。用户编程时,利用ClassWizard类向导能够大大简化一些细节问题,如成员变量和成员函数的声明和定义放在何处、成员函数如何与消息映射联系在一起。ClassWiza

rd有五个页面:MessageMaps页面用来处理消息映射,为消息添加或删除处理函数;MemberVariables面页用来给对话框类添加或删除成员变量(与控件关联);Automation页面提供了对OLE自动化类的属性和方法的管理;ActiveXEven

ts页面用于管理ActiveX类所支持的ActiveX事件;ClassInfo页面显示应用程序中所包含类的信息。4.3.2添加消息处理函数ClassWizard类向导的MessageMaps页面主要用于添加与消息处理有关的代码,包括添加消息映射宏和

消息处理函数。MessageMaps页面有五个列表框:Project框列出当前工作区中的项目Classname框列出当前项目中的类ObjectIDs框列出当前类所有能接收消息的对象(ID),包括类、菜单项和控件Mess

ages框列出在ObjectIDs框中选择的对象可处理的消息和可重载的MFC虚函数Memberfunctions框列出当前类已创建的消息处理函数,其中的“V”标记表示该函数是虚函数,“W”标记表示该函数是窗口消息处理函数当在Messages框选择一个消

息后:单击AddFunction按钮添加一个消息处理函数。单击EditCode按钮将退出ClassWizard,打开源代码编辑器并定位到指定的消息处理函数。单击DeleteFunction按钮可以删除已建立的消息处理函数。

注意:为了避免不小心删除了函数代码,此时只在头文件中删除了函数声明,在源文件中删除了消息映射项,实际的函数代码必须用户自己手工删除。添加、编辑、删除成员函数例编写一个SDI应用程序MyMessage,程

序运行后在程序视图窗口左击或右击鼠标时分别弹出不同提示信息的对话框,显示左击或右击鼠标的次数。1.利用MFCAppWizard[exe]建立一个单文档应用程序MyMessage。2.为视图类CMyMessageVie

w添加两个private属性、int类型的成员变量m_nLeft和m_nRight。在项目工作区的ClassView类视图中右击CMyMessageView,在弹出式菜单中选择AddMemberVariable命令项出现添加成员变量对话框,在对话框中输入变量类型

和变量名、选择属性。也可以采用手工方法直接在头文件中添加一般的成员变量。CMyMessageView::CMyMessageView(){//TODO:addconstructioncodeherem_nLeft=0;//初始化成员变量m_nRight=0;}3.在视图类CMyMessageV

iew的构造函数中添加初始化成员变量的代码:4.分别添加鼠标左击或右击的消息处理函数。按Ctrl+W键弹出MFCClassWizard对话框,选择MessageMaps页面。在Classname和ObjectIDs框选择CMyMe

ssageView,在Messages框分别选择WM_LBUTTONDOWN和WM_RBUTTONDOWN消息,单击AddFunction按钮。最后单击OK按钮退出MFCClassWizard对话框。ClassWizard类向导完成的工作:在视图类CMyMessageView的

头文件中声明了消息处理函数OnLButtonDown()和OnRButtonDown();在视图类CMyMessageView的实现文件中生成了消息处理函数的框架代码;在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中定义了消息映射。voidCMyMes

sageView::OnLButtonDown(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodeherem_nLeft++;//左击鼠标次数加一CStringstrOutput;//产生用于输出的格式化字

符串strOutput.Format("Thetimesofleftbuttondown:%d",m_nLeft);MessageBox(strOutput);//弹出提示信息框CView::OnLButtonDown(nFla

gs,point);}5.在消息处理函数OnLButtonDown()和OnRButton-Down()中指定位置添加如下代码,以累加左击或右击鼠标的次数,并弹出一个信息框。添加一般的成员函数除了采用手工方法直接在头文件和实现文件中分别添加函数声明和函数代码外

,也可以在Workspace项目工作区ClassView页面中右击鼠标,从弹出式菜单项执行AddMemberFunction命令。利用ClassWizard类向导为项目添加一个常用MFC类的派生类。选择执行“Insert|NewClass…”菜单命令添

加:(1)其它MFC类的派生类(2)非MFC类的派生类(3)普通类4.3.3为项目添加新类利用ClassWizard类向导添加新类利用“Insert|NewClass”命令添加类4.4程序调试程序调试是程序设计中一个很重要的环节,一个程序要经过很多次调试才能保证其基本

正确。程序调试分为源程序语法错误的修改和程序逻辑设计错误的修改两个阶段。编译器只能找出源程序语法上的错误,程序逻辑设计上的错误只能靠程序员通过一些调试工具来手工检查和修改。程序调试水平的高低与程序员的经验密切相关,程序调试水平也决定了程序员的编程能力,程序员在实际编程中应该熟练掌握各种调试工具

的使用。4.4.1查找源程序中的语法错误对于程序中的语法错误,直接利用高级语言编译器就能找出来。如果程序有语法错误,则在执行编译、链接命令时,VisualC++编译器将在Output输出窗口给出语法错误提示信息

。错误提示信息的格式为:<源程序路径>(行):<错误代码>:<错误内容说明>例如:D:\例4-6MyMessage\MyMessageView.cpp(38):errorC2065:'m_nLeft':undeclaredidentifier错误代码给出了源代码语法错误类别和编号,语法错误

分为一般错误(error)和警告错误(warning)两种。error错误和warning错误error错误出现的情况:如少写一个括号、分号或写错一个单词,属于语法错误。当出现error错误时将不会产生可执行

程序。warning错误出现的情况:如一个定义的变量没有使用、一个浮点值被赋值给一个整形变量等。出现warning错误时可生成可执行程序。提示:编译器给出的错误提示信息可能不十分准确,并且一处错误往往会引出若干条错误提示信息,一个有经验的程序员根据这些信

息就能够判断具体的错误位置,修改一个错误后马上进行程序的编译和链接。通过重复的编译和链接,使程序中的错误越来越少,直至所有的错误都被修改。在链接阶段也可能给出错误提示信息,链接错误提示信息不给出错误发生的具体位置,因为链接的程序是目标文件(obj),无法确定错误发生的准确位置

。发生链接错误时,一般是程序中调用了某个函数,而链接程序却找不到该函数的定义。另外,程序分为几个文件分别编译、链接时,可能出现全局变量没有声明或重复声明的错误。在Output窗口中双击错误提示信息可以返回到源程序编辑窗口,并通过一个箭头符号定位到产生错误的语句。在Output

窗口选择一条错误提示信息后,单击F1键可打开MSDN联机帮助,显示该错误代码更详细的说明和有关的例子。VisualC++提供了一个调试工具─Debug调试器。利用Debug调试器可以在开发程序时方便快捷地进行程序的调试。4.4.2Debug调试器Debug调试器功能:设置断点单

步跟踪观察变量、表达式和函数调用关系。即使程序没有设计错误,也可以使用Debug调试器分析任何一个程序的执行过程,这对于学习MFC应用程序框架的工作原理以及如何定制自己的应用程序都是非常有用的。Debug版本生成的中间文件及可执行文件

放在Debug子目录,目标文件包含所有的调试信息,但不具有优化功能。Release版本生成的文件放在Release子目录,目标文件不包含任何调试信息,不能进行程序调试,但具有优化功能。编程时一般先生成一个Debug调试版程序,程序经过调试确

认无误后,再编译、链接生成一个Release发布版程序。Debug和Release版Build主菜单中有一个StartDebug子菜单,其中含有启动Debug调试器的命令。如执行其中的Go(快捷键为F5)命令后,程序便在调试器中运行,直到断

点处停止。启动调试器后,Debug菜单取代Build菜单出现在菜单栏中,同时出现一个停靠的Debug工具栏和一些调试窗口,如下图所示。启动Debug调试器调试窗口除了Debug工具栏,Debug调试器还提供了一些辅助窗口

,用于显示程序的调试信息。调试窗口汇集了许多信息,但通常并不需要观察所有信息,而且有限的屏幕空间也限制了打开窗口的个数。一般情况下,当进入程序调试时,除了打开常见的Output输出窗口,Debug调试

器还自动打开Variable和Watch窗口。Output输出窗口:显示有关Build和Debug操作的信息,包括编译链接错误提示信息和调试时一些调试宏的输出信息。Variable变量窗口:用于观察和修改某个作用域

内所有变量的当前值,调试器可根据当前程序运行过程中变量的变化情况自动选择应显示的变量。该窗口有三个页面:(1)Auto页面显示当前语句或前一条语句中变量的值和函数的返回值;(2)Locals页面显示当前函数中局部变量的值;(3)This页面以树型

方式显示当前类的对象的所有数据成员,单击“+”号可展开指针所指对象。Watch查看窗口:用于观察和修改变量或表达式的值。单击Watch窗口Name栏下的空白框,用户可添加新的要观察的变量或表达式。跟踪调试程序是查找逻辑设计错误最常采用的动态方法。跟踪调

试的基本原理就是让程序按照源代码设计流程一步一步地执行,通过观察和分析程序执行过程中数据和代码执行流程的变化来查找程序设计的逻辑错误。程序调试的几种方法:在程序中人为设置断点,加入输出语句(传统方法)。采用TRACE调试宏输出

需要的信息(VisualC++)。利用VisualC++IDE集成调试器直接进行程序的跟踪调试,Debug调试器是其中最常用的调试器。4.4.3跟踪调试可执行程序设置断点:在调试器中运行程序时可以强制程序执行到断点处暂时停下来。使用Debug调试程序最有效的

手段单步执行:使程序按照源代码的编写流程一行一行执行。观察程序当前的数据变化情况:单步执行程序时通过观察调试窗口中变量、表达式、调试输出信息和函数栈的内容了解程序的运行情况。跟踪调试时可以很方便地查看某个变量的值,只需将光标在该变量上停留片刻,就会出现一个黄色的Data

Tips信息框,显示光标所指变量的值。voidCEllipseView::OnDraw(CDC*pDC){CEllipseDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);int

yLeft[5]={0,70,140,210,280};intyRight[5]={70,140,210,280,350};for(inti=1;i<=5;i++)//绘制五个纵向排列整齐的椭圆pDC->Ellipse(100,yLeft[i],300,yRight[i]);//参数为椭圆外

接矩形的左上角和右下角坐标}例编写一个单文档应用程序Ellipse,程序运行后在程序视图窗口根据所提供的参数绘制五个纵向排列整齐的椭圆。编译、链接并运行程序Ellipse,程序没有按要求绘制出五个椭圆。为了找到错误所在,首先应该跟踪绘制椭圆的函数OnDraw()。

将光标移到OnDraw()函数的开头位置,单击工具栏最右端手掌形状的按钮设置一个断点。按F5键启动Debug调试器并使程序运行到断点处暂停,然后通过不断按F10键单步跟踪执行程序,在单步执行过程中观察椭圆参数的实际值。我们发现当i=1时,yLeft[

i]=70,yRight[i]=140,不是原意所要求的0和70。继续单步执行,当i=5时,yLeft[i]=7806880,yRight[i]=0,更不是我们所设置的参数,如下图所示。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?