chap4创建应用程序框架(4h)

上传人:xia****ai 文档编号:243144460 上传时间:2024-09-16 格式:PPT 页数:93 大小:1.55MB
返回 下载 相关 举报
chap4创建应用程序框架(4h)_第1页
第1页 / 共93页
chap4创建应用程序框架(4h)_第2页
第2页 / 共93页
chap4创建应用程序框架(4h)_第3页
第3页 / 共93页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第 4 章,创建应用程序框架,版权所有 复制必究,应用程序框架,应用程序向导,应用程序向导生成的文件,ClassWizard,类向导,程序调试,通过本章的学习我们可以真正利用,Visual C+,创建一个简单的,MFC,应用程序。,本章内容,同一类型应用程序的结构大致相同,并有很多相同的源代码,因此可以通过一个应用程序框架,AFX,(Application,FrameWorks,),编写同一类型应用程序的通用源代码。,何谓应用程序框架?,与其它可视化开发工具一样,,Visual C+,提供了创建应用程序框架的向导,AppWizard,和相关的开发工具。,在可视化开发环境下,生成一个应用程序要做的工作主要包括编写源代码、添加资源和设置编译方式。向导实质上是一个,源代码生成器,,利用,应用程序向导,可以快速创建各种风格的,应用程序框架,,自动生成程序通用的源代码,这样大大减轻了手工编写代码的工作量。,即使不非常熟悉,Visual C+,编程,也可以利用它的,应用程序向导,一个简单的应用程序。,4.1 应用程序向导,创建一个应用程序,首先要创建一个,项目,。项目用于管理组成应用程序的所有元素,并由它生成应用程序。,Visual C+,集成开发环境包含了创建各种类型应用程序的向导,执行,File,菜单中的,New,命令即可看到向导类型。,Visual C+,集成开发环境中主要向导类型:,4.1.1,Visual C+,中的向导类型,主要向导类型,Datebase,Project:,创建数据库项目,MFC ActiveX Control Wizard:,创建基于,MFC,的,ActiveX,控件,MFC,AppWizarddll,:,创建基于,MFC,的动态链接库,MFC,AppWizardexe,:,创建基于,MFC,的应用程序(最常用),New Database Wizard:,在,SQL,服务器上创建一个,SQL Server,数 据库,Win32 Application:,创建,Win32,应用程序,可不使用,MFC,,采 用,SDK,方法编程,Win32 Console Application,:,创建,DOS,下的,Win32,控制台应用程 序,采用,C+,或,C,语言进行编程,Win32 Dynamic-link Library:,创建,Win32,动态链接库,采用,SDK,方法,Win32 Static Library:,创建,Win32,静态链接库,采用,SDK,方法,4.1.2 使用,MFC,AppWizardexe,引入应用程序向导的目的:,区别于,DOS,程序,即使一个简单的,Windows,程序,它也必须显示一个程序运行窗口,需要编写复杂的程序代码。而同一类型应用程序的框架窗口风格是相同的,如相同的菜单栏、工具栏、状态栏和用户区。并且,基本菜单命令的功能也是一样的,如相同的文件操作和编辑命令。所以,同一类型应用程序建立,框架窗口,的基本代码都是一样的,尽管有些参数不尽相同。为了避免程序员重复编写这些代码,一般的可视化软件开发工具都提供了创建,Windows,应用程序框架的向导。,MFC,AppWizardexe,的功能:,MFC,AppWizardexe,是创建基于,MFC,的,Windows,应用程序的向导。当利用,MFC,AppWizardexe,创建一个项目时,它能够自动生成一个,MFC,应用程序的框架。,即使不添加任何代码,当执行编译、链接命令后,,Visual C+ IDE,将生成一个,Windows,界面风格的应用程序。,MFC,应用程序框架,将那些每个应用程序都共同需要使用的代码封装起来,如完成默认的程序初始化功能、建立应用程序界面和处理基本的,Windows,消息,使程序员不必做这些重复的工作,把精力放在编写实质性的代码上。,MFC,AppWizardexe,向导提供了一系列选项,程序员通过选择不同的选项,可以创建不同类型和风格的,MFC,应用程序,并可定制不同的程序界面窗口。例如,单文档、多文档、基于对话框的程序,是否支持数据库操作、是否可以使用,ActiveX,控件以及是否具有联机帮助等。,例,编写一个单文档应用程序,Mysdi,,,程序运行后在程序视图窗口显示信息“这是一个单文档程序!”。,在,Visual C+,中执行,File,|,New,命令,出现,New,对话框。,确认,New,对话框的当前页面为,Project,,在左栏的项目类型列表框中选择,MFC,AppWizardexe,项,在,Project Name,框输入要创建项目的名称,。,在,location,栏中输入项目所在的目录,可单击右侧“”浏览按钮来对默认的目录进行修改。向导将在该目录下存放项目的所有文件。单击,OK,按钮出现,MFC AppWizard-Step1,对话框。,在,MFC AppWizard-Step1,对话框中选择应用程序的类型。,Single document,:,单文档界面应用程序,程序运行后出现标准的,Windows,界面,它由框架(包括菜单栏、工具栏和状态栏)和用户区组成。并且程序运行后一次只能打开一个文档,如,Windows,自带的记事本,Notepad。,Multiple documents,:,多文档界面应用程序,程序运行后出现标准的,Windows,界面,并且可以同时打开多个文档,如,Word。,Dialog based,:,基于对话框的应用程序,程序运行后首先出现一个对话框界面,如计算器,Calculator。,MFC,AppWizardexe,创建,应用程序的类型,:,None,:,向导创建的应用程序不包括对数据库的操作功能,但以后可以手工添加对数据库的操作代码(,默认项,)。,Header files only,:,提供了最简单的数据库支持,仅在项目的,stdAfx.h,文件中使用#,include,指令包含,afxdb.h,和,afxdao.h,两个用于定义数据库类的头文件,但并不生成与数据库相关的类,用户需要时可以自己生成。,Database view without file support,:,包含了所有的数据库头文件,并生成了相关的数据库类和视图类,但不支持文档的序列化,向导创建的应用程序的,File,主菜单中将不包含有关文件操作的菜单命令项。,Database view with file support,:,包含了所有的数据库头文件,生成了相关的数据库类和视图类,支持文档的序列化。,在,MFC AppWizard-Step 2 of 6,选择应用程序所支持的数据库方式,包括以下选项:,None,:,应用程序不支持任何复合文档(,默认项,)。,Container,:,应用程序作为复合文档容器,能容纳所嵌入或链接的复合文档对象。,Mini-server,:,微型复合文档服务器,应用程序可以创建和管理复合文档对象,但对于它所创建的复合文档对象,集成应用程序可以嵌入,但不能链接。微型服务器不能作为一个单独的程序运行,而只能由集成应用程序来启动。,Full-server,:,完全复合文档服务器,除了具备上面微型服务器的功能外,应用程序支持链接式对象,并可作为一个单独的程序运行。,Both container and server,:,应用程序既可作为一个复合文档容器,又可作为一个可单独运行的复合文档服务器。,在,MFC AppWizard-Step 3 of 6,选择应用程序所支持的数据库方式,复合,文档类型,包括以下选项:,Docking toolbar,:,应用程序具有标准的工具栏(,默认项,),Initial status bar,:,应用程序具有标准的状态栏(,默认项,),Printing and print preview,:,应用程序支持打印和打印预览功能(,默认项,),Context-sensitive Help,:,应用程序具有上下文相关帮助功能,3,D controls,:,应用程序界面具有三维外观(,默认项,),Normal,:,应用程序采用传统风格的工具栏(,默认项,),Internet Explorer,ReBars,:,应用程序采用,IE,风格的工具栏,How many files would you like on your recent file list,:,在,File,主菜单可列出文档的最多个数。,Advanced,按钮:进行更高一级的设置,如修改文件名或扩展名,调整程序用户界面窗口的样式(边框厚度和最小化、最大化、关闭按钮)。,在,MFC AppWizard-Step 4 of 6,设置应用程序界面特征(工具栏和状态栏),包括以下选项:,MFC Standard,:,应用程序采用,MFC,标准风格(,默认项,),Windows Explorer,:,应用程序采用,Windows,资源管理器 风格,选择向导是否为源代码生成,注释,设置,MFC,库与应用程序的,链接方式,:,(1),As a shared DLL,:,采用,共享动态链接库,的方式(,默认项,) ,即在程序运行时才调用,MFC,库。采用此方式可减少应用程序的代码长度。,(2),As a statically linked library,:,采用,静态链接库,的方式,即在编译时把,MFC,库与应用程序相链接。采用此方式能提高运行速度,且不用考虑程序最终运行环境中是否安装了,MFC,库。,在,MFC AppWizard-Step 5 of 6,设置项目的风格,,包括以下选项:,在,New Project Information,对话框,根据用户在前面各步所做的选择列出将要创建的应用程序的有关信息,如应用程序的类型、创建的类和文件名、应用程序的特征以及项目所在的目录。若要修改这些内容,可单击,Cancel,按钮返回到前一个对话框。单击,OK,按钮,,MFC,AppWizardexe,向导将开始创建应用程序框架。,在,MFC AppWizard-Step 6 of 6,,列出了向导将创建的类,用户可以修改一些类默认的类名和对应的头文件名、实现文件名。对某些类还可以选择不同的,基类,。,利用,MFC,AppWizardexe,向导创建应用程序,Mysdi,的框架后,用户无需添加任何代码,就可以对程序进行编译、链接,生成一个应用程序。但一般情况下,用户应根据程序具体功能需要,利用,Developer Studio,中的集成工具向应用程序框架添加具体的代码。,当应用程序框架创建成功后,,Developer Studio,将装入应用程序项目,并在项目工作区窗口打开这个项目。值得说明的是,若想在同一个目录下重新创建一个同名的项目,必须首先将原来的项目删除或移走。,在视图类的成员函数,OnDraw,(),中实现屏幕输出,void,CMysdiView:OnDraw(CDC,*,pDC,),CMysdiDoc,*,pDoc,=,GetDocument,();,ASSERT_VALID(pDoc,);,/ TODO: add draw code for native data here,pDC,-TextOut(100, 100, “,这是一个单文档程序!”);,/ 在坐标(100, 100)处显示文本串,执行,Build(F7),命令,编译链接程序,程序运行后将在程序视图区域显示文本串。,例2,编写一个基于对话框的应用程序,MyDialog,,,程序运行后显示一个对话框。,编程说明与实现,1. 执行,File,|,New,命令,在,New,对话框中选择,MFC,AppWizardexe,项,输入程序名,MyDialog,。,单击,OK,按钮,出现,MFC AppWizard-Step 1,。,2. 在,MFC AppWizard-Step 1,中选择,Dialog Based,选项,单击,Next,按钮,出现,MFC AppWizard-Step 2 of 4。,3. 在,MFC AppWizard-Step 2 of 4,中设置应用程序界面特征。,4,. 创建对话框应用程序后续的步骤与创建单文档或多文档应用程序的,Step 5,和,Step 6,相同。,利用,Visual C+,编写,Windows,应用程序可以采取几种不同的途径:,利用,Win32,应用程序接口,API,(Application,Programming Interface),提供的函数,用,C,或,C+,语言编写程序。,由于,MFC,通过类对,API,的绝大部分功能进行了封装,可以利用,MFC,,用,C+,语言编写程序。,利用,MFC,和,MFC,AppWizardexe,,,首先利用,MFC,AppWizardexe,应用程序向导生成基本的应用程序框架,然后按照,MFC,机制和原理向框架添加具体的应用代码。,4.1.3,MFC,应用程序的开发流程,根据应用程序特性在,MFC,AppWizardexe,应用程序向导各步骤对话框中进行选择,创建一个应用程序的框架。,利用,资源编辑器,为程序编辑或添加资源,如编辑菜单、添加对话框等。,利用,ClassWizard,类向导或手工添加类、成员变量和成员函数的声明。,根据需要编写具体的函数代码。,编译、链接程序。如果程序有语法错误,需要修改源程序。直到没有编译、链接错误,才能得到可执行程序。,测试应用程序各项功能,如果程序没有实现程序设计所要求的功能,启动,Debug,调试器进行调试,找出并修改程序设计中的逻辑错误。,编写一个实现具体功能的,MFC,应用程序的步骤:,ClassWizard,类向导:,Visual C+ IDE,为,MFC,提供了大量的支持工具,除了,MFC,AppWizardexe,向导,还提供了,ClassWizard,类向导,利用它程序员可以方便地增加或删除对某个消息的处理。,资源编辑器:,为程序添加具体的代码时还经常要用到,资源编辑器,。下图形象地说明了编写一个,MFC,应用程序的流程、所用到的工具及主要生成的文件。,编程时,除了编辑现有的资源,有时需要向项目添加新的资源,这时可以利用,Insert,菜单创建一个新的资源。,打开,Insert,菜单,选择,Resource,菜单项,出现,Insert Resource,对话框,如下图所示,在,Resource Type,框中选择一个资源类型,单击,New,按钮即可向项目添加一个资源。,总 结,我们可以为,Visual C+,MFC,编程作一个形象的总结,,MFC,应用程序框架使我们的程序设计工作犹如做填充题,,Developer Studio,中的集成工具使我们的程序设计工作犹如做选择题,程序员犹如软件集成装配车间里的技术工人(兰领、白领)。,MFC,类库将所有图形用户界面的元素如窗口、菜单和按钮等都,以类的形式进行了封装,,编程时需要利用,C+,类的继承性从,MFC,类中派生出自己的类,实现标准,Windows,应用程序的功能。,MFC,AppWizardexe,向导对,Windows,应用程序进行了分解,并利用,MFC,的派生类对应用程序重新进行了组装,同时还规定了应用程序中所用到的,MFC,派生类对象之间的,相互联系,,这就是向导生成的,MFC,应用程序框架,。,MFC,应用程序框架实质上是一个标准的,Windows,应用程序,它具有标准的窗口、菜单栏和工具栏。,4.2,应用程序向导生成的文件,为了生成一个可执行程序,,MFC,AppWizardexe,向导必须首先创建一个项目,并为项目生成一系列初始文件,如,C+,头文件,、,C+,源文件,、,资源文件,和,项目文件,,其中的,C+,文件都是以,MFC,派生类为单元来组织的。,如果要从项目中删除文件,首先在项目工作区,FileView,页面中选中要删除的文件,然后按,Delete,键。但注意这并没有从硬盘上真正删除了该文件。,Visual C+,中的文件类型很多,根据项目类型不同而产生不同类型的文件。下面列出了,MFC,AppWizardexe,应用程序向导生成的文件类型。当进行编辑、编译和链接时,还要生成一些临时文件。,4.2.1,应用程序向导生成的文件类型,Visual C+,中通用的文件类型,后缀类型说明,dsw,工作区文件将项目的详细情况组合到工作区中,dsp,项目文件存储项目的详细情况并替代,mak,文件,hC+,头文件存储类的定义代码,cpp,C+,源文件存储类的成员函数的实现代码,rc,资源脚本文件,存储菜单、工具栏和对话框等资源,rc2,资源文件用来将资源包含到项目中,ico,图标文件存储应用程序图标,bmp,位图文件存储位图,clw,类向导文件存储,ClassWizard,类向导使用的类信息,Visual C+,中类的支持文件,一般而言,,C+,中的一个类由,头文件,h,和,源文件,cpp,两类文件支持。,头文件用于定义类,包括指明派生关系、声明成员变量和成员函数。,源文件用于实现类,主要定义成员函数的实现代码和消息映射。,例如,应用程序视图类,CMysdiView,的两个支持文件是,MysdiView.h,和,MysdiView.cpp,。,4.2.2,应用程序向导生成的头文件,MFC,AppWizardexe,向导为一般的,SDI,应用程序生成了五个类,这些类都是,MFC,类的派生类。这里的“,一般的,SDI,应用程序,”是指向导每一步都采用默认选项,如不支持数据库和,OLE,对象等。,一般应用程序框架中所有类的名字由,MFC,AppWizardexe,向导根据一定的规则自动命名,但用户可以在向导的第6步改变类名和有关类的文件名。应用程序框架中类(框架窗口类例外)的命名规则一般遵照如下要求:,Class Name = C +,ProjectName,+,ClassType,注,:在定义类的头文件中的开始位置(类的正式定义前)有一段预处理命令代码,这些代码是为,Developer Studio,自身准备的,如用于保证头文件在编译时仅被编译一次。,Developer Studio,中的资源编辑器、,ClassWizard,类向导和编译器都可能用到这些代码。这些代码如下形式所示:,#,if !defined(AFX_MAINFRM_H_DE1F30C9_677C_11D6_888,#define AFX_MAINFRM_H_DE1F30C9_677C_11D6_888D_,#if _MSC_VER 1000,#,pragma,once,#,endif,/ _MSC_VER 1000,向导为项目,Mysdi,生成了框架窗口类的头文件,MainFrm.h,,,该头文件用于定义框架窗口类,CMainFrame,。,不同的,SDI,应用程序,其框架窗口类名和文件名是统一的。,CMainFrame,类是,MFC,的,CFrameWnd,类的派生类,它主要负责创建标题栏、菜单栏、工具栏和状态栏。,CMainFrame,类中声明了框架窗口中的工具栏,m_wndToolBar,、,状态栏,m_wndStatusBar,两个成员变量和四个成员函数。,1.,框架窗口类头文件,向导为项目,Mysdi,生成了文档类的头文件,MysdiDoc.h,,,该头文件用于定义文档类,CMysdiDoc,。CMysdiDoc,类是,MFC,的,CDocument,类的派生类,它主要负责应用程序数据的保存和装载,实现文档的序列化功能。,2.,文档类头文件,向导为项目,Mysdi,生成了视图类的头文件,MysdiView.h,,,该头文件用于定义视图类,CMysdiView,。,视图类用于处理客户区窗口,它是框架窗口中的一个子窗口。,CMysdiView,类是,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,,,这些头文件一般都存放在路径“,Microsoft Visual StudioVC98MFCInclude”,下。,StdAfx.h,文件和,StdAfx.cpp,文件用来生成预编译文件。,6. 标准包含头文件,对应于一个头文件中定义的类,都有一个类的,实现文件,。在实现文件中主要定义在头文件中声明的成员函数的实现代码和,消息映射,。,MFC,AppWizardexe,生成的实现文件也包括六种。,值得说明的是,向导生成的成员函数有很多,不要因为没有使用某个成员函数而删除其声明和实现代码。并且,用户一般不要轻易修改文件中那些以灰色字体显示的代码,因为这些代码是通过,资源编辑器,或,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,页面打开,CMainFrame,类,双击成员函数,PreCreateWindow,(),在编辑窗口打开该函数,添加代码:,例,修改程序,Mysdi,,,使程序运行窗口没有最大化按钮。,BOOL,CMainFrame:PreCreateWindow(CREATESTRUCT,&,cs,),if( !,CFrameWnd:PreCreateWindow(cs,) ),return FALSE;,/ TODO: Modify the Window class or styles here,cs.style,/,取消窗口的最大化按钮,return TRUE;,向导为项目,Mysdi,生成了文档类的实现文件,MysdiDoc.cpp,。,与框架类,CMainFrame,类似,文档类,CMysdiDoc,也定义了两个用于调试的成员函数,AssertValid,(),和,Dump。,2. 文档类实现文件,文档类,CMysdiDoc,的成员函数:,AssertValid,(),Dump(),OnNewDocument,(),:,当用户执行,File,菜单中,New,命令时,,MFC,应用程序框架会调用函数,OnNewDocument,(),来完成新建文档的工作。,Serialize(),:,负责文档数据的磁盘读写操作。,注意,:,由于,SDI,单文档应用程序中只处理一个文档对象,当执行,New,命令时,文档对象已经生成,因此文档类,CMysdiDoc,的构造函数不会再被调用。所以,,SDI,应用程序不要在构造函数中进行文档对象成员变量的初始化,而应在,OnNewDocument,(),函数中(看后面的例子)。,在文档派生类,CMysdiDoc,重载的,OnNewDocument,(),函数中,首先需要调用基类,CDocument,的,OnNewDocument,(),函数。,3. 视图类实现文件,向导为项目,Mysdi,生成了视图类的实现文件,MysdiView.cpp,,,该文件主要定义了视图类的成员函数。视图对象是用来显示文档对象的内容。与框架类和文档类一样,视图类,CMysdiView,也定义了两个用于调试的成员函数,AssertValid,(),和,Dump()。,视图类,CMysdiView,的成员函数:,GetDocument,():,用于获取当前文档对象的指针,m_pDocument,。,如果是建立程序的,Release,发行版,函数,GetDocument,(),作为内嵌(,inline),函数来实现。,OnDraw,():,虚函数,它负责文档对象的数据在用户视图区的显示输出。,例,修改程序,Mysdi,,,为,CMysdiDoc,文档类定义一个字符串类型的成员变量,在,OnNewDocument,(),函数中初始化成员变量。在,OnDraw,(),函数中访问该成员变量,并在屏幕上输出它的值。,(1)在头文件,MysdiDoc.h,文档类,CMysdiDoc,的定义中增加成员变量,m_szText,,,用于保存将要显示的文本信息:,public:,char,*,m_szText,;,(2)在文档类实现文件,MysdiDoc.cpp,中找到成员函数,OnNewDocument,(),,,添加初始化,m_szText,的代码:,BOOL,CMysdiDoc:OnNewDocument,( ),if (!,CDocument:OnNewDocument,(),return FALSE;,/ TODO: add,reinitialization,code here, ,m_szText,= “,这是一个单文档程序!”;,/ 初始化,return TRUE;,(3),在视图类实现文件,MysdiView.cpp,中找到成员函数,OnDraw,(),,,向导创建的函数框架中已自动添加了函数,GetDocument,(),的调用语句,以获取与当前视图相关联的文档指针,pDoc,。,手工添加如下代码,通过,pDoc,访问文档类,CMysdiDoc,的成员变量,m_szText,,,用于在屏幕上输出。,void,CMysdiView:OnDraw(CDC,*,pDC,),/,pDC,是当前输出设备环境的指针,CMysdiDoc,*,pDoc,=,GetDocument,();,ASSERT_VALID(pDoc,); /,得到当前文档指针,pDoc,/ TODO: add draw code for native data here,pDC,-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,),/,ClassWizard,将在此处添加和删除消息映射宏,. . . . . .,END_MESSAGE_MAP(),/,CMysdiApp,construction,CMysdiApp:CMysdiApp,(),/ TODO:,在此处添加构造函数代码,/ 把所有的重要的初始化信息放在,InitInstance,过程当中,/ 声明唯一的,CMysdiApp,对象,theApp,CMysdiApp,theApp,;,/,CMysdiApp,的初始化,BOOL,CMysdiApp:,InitInstance,(),/,标准初始化,/ 如果不使用这些特征并希望减少最终可执行代码的长度,,/ 你可以去掉以下专门的初始化代码。,. . .,/,设置应用程序的注册键,/,TODO:,你应该为这个字符串设置适当的内容,如公司名,SetRegistryKey(_T(Local,AppWizard-Generated Applications);,/,装入应用程序,INI,文件中的设置信息,如 “最近使用的文件列表”项,LoadStdProfileSettings,();,/,注册应用程序文档模板,文档模板用于链接文档、框架窗口和视图,CSingleDocTemplate,*,pDocTemplate,;,pDocTemplate,= new,CSingleDocTemplate,(,IDR_MAINFRAME,RUNTIME_CLASS(CMysdiDoc,),RUNTIME_CLASS(CMainFrame,), / SDI,框架窗口,RUNTIME_CLASS(CMysdiView,);,AddDocTemplate(pDocTemplate,);,. . .,/,主窗口已经初始化,在此显示并刷新窗口,m_pMainWnd,-,ShowWindow(SW_SHOW,);,m_pMainWnd,-,UpdateWindow,();,return TRUE;,向导为项目,Mysdi,生成了标准包含文件,StdAfx.cpp,,,该文件用于包含,StdAfx.h,标准包含头文件。,StdAfx.cpp,文件用于生成项目的预编译头文件(,Mysdi.pch,),和预编译类型信息文件(,StdAfx.obj,),。,由于大多数,MFC,应用程序的实现文件都包含,StdAfx.h,头文件(其中包含了一些共同要使用的头文件),如果在每个实现文件中都重新编译,StdAfx.h,头文件,整个编译过程将浪费大量的时间。为了提高编译速度,可以首先将项目中那些共同要使用的头文件编译出来,首次编译后将结果存放在一个名为预编译头文件的中间文件中,以后再编译时直接读出存储的结果,无需重新编译,节约了编译时间。,5.,标准包含文件,Windows,编程的一个主要特点是资源和代码的分离,即将菜单、工具栏、字符串表、对话框等资源与基本的源代码分开。,优点,:,这样使得对这些资源的修改独立于源代码。例如,可以将字符串表翻译成另一种语言,而无需改动任何源代码。,当,Windows,装入一个应用程序时,一般情况下,程序的资源数据并不同时装入内存,而是在应用程序执行过程中需要时如创建窗口、显示对话框或装载位图,才从硬盘读取相应的资源数据。,4.2.4,应用程序生成的资源文件,1,资源文件,向导为项目,Mysdi,生成了资源文件,Mysdi.rc,和,Mysdi.rc2,。Mysdi.rc,是,Visual C+,生成的脚本文件,它使用标准的,Windows,资源定义语句,可通过,资源编译器,转换为二进制资源。一般利用资源编辑器对资源进行可视化编辑,也可通过,Open,命令以文本方式打开一个资源文件进行编辑。,Mysdi.rc2,文件一般用于定义资源编辑器不能编辑的资源。,2,图标文件,向导为项目,Mysdi,生成了应用程序的图标文件,Mysdi.ico,。,在,Visual C+,中,可利用图形编辑器编辑应用程序的图标。,3,文档图标文件,向导为项目,Mysdi,生成了文档图标文件,MysdiDoc.ico,。,文档图标一般用于多文档应用程序中,在程序,Mysdi,中没有显示这个图标,但编程时用户可以利用相关函数来获取该图标资源并显示图标(,ID,为,IDR_MYSDITYPE)。,4,工具栏按钮位图文件,向导为项目,Mysdi,生成了工具栏按钮的位图文件,Toolbar.bmp,,,该位图是应用程序工具栏中所有按钮的图形表示。,除了上述用于生成可执行程序的源代码文件和资源文件,向导还为项目生成了其它一些在开发环境中必须使用的文件,如,项目文件,、,项目工作区文件,和,ClassWizard,类向导文件,。,1项目文件,项目用项目文件,DSP,(Developer,Studio Project),来描述,向导为项目,Mysdi,生成了项目文件,Mysdi.dsp,,,该文件将项目中的所有文件组织成一个整体。项目文件保存了有关源代码文件、资源文件以及你所指定的编译设置等信息。,4.2.5,应用程序生成的其他文件,2,项目工作区文件,为了创建应用程序,必须在,Developer Studio,的工作区中打开项目,这些应用程序项目工作区设置信息保存在项目工作区文件,DSW,(Developer,Studio Workspace),中。向导为项目,Mysdi,生成了项目工作区文件,Mysdi.dsw,,,该文件将一个,DSP,项目文件与具体的,Developer Studio,结合在一起,它保存了上一次操作结束时窗口状态、位置以及工作区设置信息。,3,类向导文件,向导为项目,Mysdi,生成了类向导文件,Mysdi.clw,,,该文件存储了,ClassWizard,类向导使用的类信息,如类信息的版本、类的数量、每个类的头文件和实现文件。利用,ClassWizard,类向导时要使用该文件。如果从项目中删除了,clw,文件,下次使用,ClassWizard,类向导时会出现提示对话框,询问是否想重新创建这个文件。,4.3,ClassWizard,类向导,利用应用程序向导生成,MFC,应用程序框架,后,用户需要为自己的,MFC,派生类添加,消息处理成员函数,和对话框控件的,成员变量,,有时还需要为程序添加新的,MFC,派生类,这时用户需要使用,ClassWizard,类向导。,MFC,ClassWizard,类向导根据程序员的要求以半自动的方式添加程序代码,它是进行,MFC,应用程序设计时一个必不可少的交互式工具,在今后的程序设计中经常用到它。,4.3.1,ClassWizard,的功能,定制现有的类和建立新的类,如把消息映射为类的成员函数,把一个控件与类的成员变量关联起来。,用户编程时,利用,ClassWizard,类向导能够大大简化一些细节问题,如成员变量和成员函数的声明和定义放在何处、成员函数如何与消息映射联系在一起。,ClassWizard,有五个页面:,Message Maps,页面用来处理消息映射,为消息添加或删除处理函数;,Member Variables,面页用来给对话框类添加或删除成员变量(与控件关联);,Automation,页面提供了对,OLE,自动化类的属性和方法的管理;,ActiveX Events,页面用于管理,ActiveX,类所支持的,ActiveX,事件;,Class Info,页面显示应用程序中所包含类的信息。,4.3.2 添加消息处理函数,ClassWizard,类向导的,Message Maps,页面主要用于添加与消息处理有关的代码,包括添加消息映射宏和消息处理函数。,Message Maps,页面有五个列表框:,Project,框列出当前工作区中的项目,Class name,框列出当前项目中的类,Object IDs,框列出当前类所有能接收消息的对象(,ID),,包括类、菜单项和控件,Messages,框列出在,Object IDs,框中选择的对象可处理的,消息,和可重载的,MFC,虚函数,Member functions,框列出当前类已创建的消息处理函数,其中的“,V,”,标记表示该函数是虚函数,“,W,”,标记表示该函数是窗口消息处理函数,当在,Messages,框选择一个消息后:,单击,Add Function,按钮添加一个消息处理函数。,单击,Edit Code,按钮将退出,ClassWizard,,打开源代码编辑器并定位到指定的消息处理函数。,单击,Delete Function,按钮可以删除已建立的消息处理函数。,注意,:为了避免不小心删除了函数代码,此时只在头文件中删除了函数声明,在源文件中删除了消息映射项,实际的函数代码必须用户自己手工删除。,添加、编辑、删除成员函数,例,编写一个,SDI,应用程序,MyMessage,,,程序运行后在程序视图窗口左击或右击鼠标时分别弹出不同提示信息的对话框,显示左击或右击鼠标的次数。,1利用,MFC,AppWizardexe,建立一个单文档应用程序,MyMessage,。,2,为视图类,CMyMessageView,添加两个,private,属性、,int,类型的成员变量,m_nLeft,和,m_nRight,。,在项目工作区的,ClassView,类视图中右击,CMyMessageView,,,在弹出式菜单中选择,Add Member Variable,命令项出现添加成员变量对话框,在对话框中输入变量类型和变量名、选择属性。也可以采用手工方法直接在头文件中添加一般的成员变量。,CMyMessageView:CMyMessageView,(),/ TODO: add construction code here,m_nLeft,=0; /,初始化成员变量,m_nRight,=0;,3在视图类,CMyMessageView,的构造函数中添加,初始化,成员变量的代码:,4分别添加鼠标左击或右击的,消息处理函数,。,按,Ctrl+W,键弹出,MFC,ClassWizard,对话框,选择,Message Maps,页面。在,Class name,和,Object IDs,框选择,CMyMessageView,,,在,Messages,框分别选择,WM_LBUTTONDOWN,和,WM_RBUTTONDOWN,消息,单击,Add Function,按钮。最后单击,OK,按钮退出,MFC,ClassWizard,对话框。,ClassWizard,类向导完成的工作:,在视图类,CMyMessageView,的头文件中,声明,了消息处理函数,OnLButtonDown,(),和,OnRButtonDown,();,在视图类,CMyMessageView,的实现文件中生成了消息处理函数的,框架代码;,在,BEGIN_MESSAGE_MAP,和,END_MESSAGE_MAP,中定义了,消息映射。,void,CMyMessageView:OnLButtonDown,(UINT,nFlags,CPoint,point),/ TODO: Add your message handler code here,m_nLeft,+; /,左击鼠标次数加一,CString,strOutput,; /,产生用于输出的格式化字符串,strOutput.Format(The,times of left button down: %d,m_nLeft,);,MessageBox(strOutput,); /,弹出提示信息框,CView:OnLButtonDown(nFlags, point);,5. 在消息处理函数,OnLButtonDown,(),和,OnRButton,-Down(),中指定位置添加如下代码,以累加左击或右击鼠标的次数,并弹出一个信息框。,添加一般的成员函数除了采用手工方法直接在头文件和实现文件中分别添加函数声明和函数代码外,也可以在,Workspace,项目工作区,ClassView,页面中右击鼠标,从弹出式菜单项执行,Add Member Function,命令。,利用,ClassWizard,类向导为项目添加一个,常用,MFC,类的派生类,。,选择执行“,Insert,|,New,Class,”,菜单命令添加:,(1)其它,MFC,类的派生类,(2)非,MFC,类的派生类,(3)普通类,4.3.3 为项目添加新类,利用,ClassWizard,类向导添加新类,利用“,Insert,|,New,Class”,命令添加类,4.4 程序调试,程序调试是程序设计中一个很重要的环节,一个程序要经过很多次调试才能保证其,基本正确,。,程序调试分为源程序,语法错误,的修改和程序逻辑,设计错误,的修改两个阶段。编译器只能找出源程序语法上的错误,程序逻辑设计上的错误只能靠程序员通过一些调试工具来手工检查和修改。,程序调试水平的高低与程序员的经验密切相关,程序调试水平也决定了程序员的编程能力,程序员在实际编程中应该熟练掌握各种调试工具的使用。,程序不是编出来的,而是调出来的,4.4.1 查找源程序中的语法错误,对于程序中的语法错误,直接利用高级语言编译器就能找出来。如果程序有语法错误,则在执行编译、链接命令时,,Visual C+,编译器将在,Output,输出窗口给出语法错误提示信息。,错误提示信息的格式为:, (行): :,例如:,D: ,例4-6,MyMessageMyMessageView.cpp(38) :,error C2065: ,m_nLeft, : undeclared identifier,错误代码,给出了源代码语法错误类别和编号,语法错误分为一般错误(,error,),和警告错误(,warning,),两种。,error,错误和,warning,错误,error,错误出现的情况:如少写一个括号、分号或写错一个单词,属于,语法错误,。当出现,error,错误时将不会产生可执行程序。,warning,错误出现的情况:如一个定义的变量没有使用、一个浮点值被赋值给一个整形变量等。出现,warning,错误时可生成可执行程序。,提示,:编译器给出的错误提示信息可能不十分准确,并且一处错误往往会引出若干条错误提示信息,一个有经验的程序员根据这些信息就能够判断具体的错误位置,修改一个错误后马上进行程序的编译和链接。通过重复的编译和链接,使程序中的错误越来越少,直至所有的错误都被修改。,在链接阶段也可能给出错误提示信息,,链接错误,提示信息不给出错误发生的具体位置,因为链接的程序是目标文件(,obj,),,无法确定错误发生的准确位置。,发生链接错误时,一般是程序中调用了某个函数,而链接程序却找不到该函数的定义。另外,程序分为几个文件分别编译、链接时,可能出现全局变量没有声明或重复声明的错误。,在,Output,窗口中双击错误提示信息可以返回到源程序编辑窗口,并通过一个箭头符号定位到产生错误的语句。在,Output,窗口选择一条错误提示信息后,单击,F1,键可打开,MSDN,联机帮助,显示该错误代码更详细的说明和有关的例子。,Visual C+,提供了一个调试工具,Debug,调试器,。利用,Debug,调试器可以在开发程序时方便快捷地进行程序的调试。,4.4.2,Debug,调试器,Debug,调试器功能:,设置断点,单步跟踪,观察变量、表达式和函数调用关系。,即使程序没有设计错误,也可以使用,Debug,调试器分析任何一个程序的执行过程,这对于学习,MFC,应用程序框架的工作原理以及如何定制自己的应用程序都是非常有用的。,Debug,版本生成的中间文件及可执行文件放在,Debug,子目录,目标文件包含所有的调试信息,但不具有优化功能。,Release,版本生成的文件放在,Release,子目录,目标文件不包含任何调试信息,不能进行程序调试,但具有优化功能。,编程时一般先生成一个,Debug,调试版程序,程序经过调试确认无误后,再编译、链接生成一个,Release,发布版程序。,Debug,和,Release,版,Build,主菜单中有一个,Start Debug,子菜单,其中含有启动,Debug,调试器的命令。如执行其中的,Go,(,快捷键为,F5,),命令后,,程序便在调试器中运行,直到断点处停止。,启动调试器后,,Debug,菜单取代,Build,菜单出现在菜单栏中,同时出现一个停靠的,Debug,工具栏和一些调试窗口,如下图所示。,启动,Debug,调试器,调试窗口,除了,Debug,工具栏,,Debug,调试器还提供了一些辅助窗口,用于显示程序的调试信息。调试窗口汇集了许多信息,但通常并不需要观察所有信息,而且有限的屏幕空间也限制了打开窗口的个数。,一般情况下,当进入程序调试时,除了打开常见的,Output,输出窗口,,Debug,调试器还自动打开,Variable,和,Watch,窗口。,Output,输出窗口:显示有关,Build,和,Debug,操作的信息,包括编译链接错误提示信息和调试时一些调试宏的输出信息。,Variable,变量窗口:用于观察和修改某个作用域内所有变量的当前值,调试器可根据当前程序运行过程中变量的变化情况自动选择应显示的变量。该窗口有三个页面:,(1),Auto,页面显示当前语句或前一条语句中变量的值和函数的返回值;,(2),Locals,页面显示当前函数中局部变量的值;,(3),This,页面以树型方式显示当前类的对象的所有数据成员,单击“+”号可展开指针所指对象。,Watch,查看窗口:用于观察和
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!