VisualC面向对象编程教程第4章创建应用程序框架_第1页
VisualC面向对象编程教程第4章创建应用程序框架_第2页
VisualC面向对象编程教程第4章创建应用程序框架_第3页
VisualC面向对象编程教程第4章创建应用程序框架_第4页
VisualC面向对象编程教程第4章创建应用程序框架_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、VisualC面向对象编程教程第4章创 建应用程序框架 第 4 章 创建应用程序框架 版权所有版权所有 复制必究复制必究 l 应用程序框架应用程序框架 l 应用程序向导应用程序向导 l 应用程序向导生成的文件应用程序向导生成的文件 l ClassWizard类向导类向导 l 程序调试程序调试 通过本章的学习我们可以真正利用 Visual C+ 创建一个简单的 MFC 应用程序。 同一类型应用程序的结构大致相同,并有很 多相同的源代码,因此可以通过一个应用程序框 架AFX(Application FrameWorks)编写同一类型 应用程序的通用源代码。 何谓应用程序框架?何谓应用程序框架? l

2、与其它可视化开发工具一样,Visual C+提供了 创建应用程序框架的向导AppWizard和相关的 开发工具。 l在可视化开发环境下,生成一个应用程序要做 的工作主要包括编写源代码、添加资源和设置 编译方式。向导实质上是一个源代码生成器, 利用应用程序向导应用程序向导可以快速创建各种风格的应应 用程序框架用程序框架,自动生成程序通用的源代码,这 样大大减轻了手工编写代码的工作量。 l即使不非常熟悉Visual C+编程,也可以利用它 的应用程序向导应用程序向导一个简单的应用程序。 创建一个应用程序,首先要创建一个项目项目。项 目用于管理组成应用程序的所有元素,并由它生成 应用程序。Visua

3、l C+集成开发环境包含了创建各 种类型应用程序的向导,执行File菜单中的New命 令即可看到向导类型。 Visual C+集成开发环境中主要向导类型: lDatebase Project:创建数据库项目 lMFC ActiveX Control Wizard:创建基于MFC的ActiveX控件 lMFC AppWizarddll:创建基于MFC的动态链接库 lMFC AppWizardexe:创建基于MFC的应用程序(最常用) lNew Database Wizard:在SQL服务器上创建一个SQL Server数 据库 lWin32 Application:创建Win32应用程序,可不使

4、用MFC,采 用SDK方法编程 lWin32 Console Application:创建DOS下的Win32控制台应用程 序,采用C+或C语言进行编程 lWin32 Dynamic-link Library:创建Win32动态链接库,采用 SDK方法 lWin32 Static Library:创建Win32静态链接库,采用SDK方法 引入应用程序向导的目的:引入应用程序向导的目的: 区别于DOS程序,即使一个简单的Windows程 序,它也必须显示一个程序运行窗口,需要编写复 杂的程序代码。而同一类型应用程序的框架窗口风 格是相同的,如相同的菜单栏、工具栏、状态栏和 用户区。并且,基本菜单

5、命令的功能也是一样的, 如相同的文件操作和编辑命令。所以,同一类型应 用程序建立框架窗口的基本代码都是一样的,尽管 有些参数不尽相同。为了避免程序员重复编写这些 代码,一般的可视化软件开发工具都提供了创建 Windows应用程序框架的向导。 lMFC AppWizardexe是创建基于MFC的Windows应用程 序的向导。当利用MFC AppWizardexe创建一个项目时, 它能够自动生成一个MFC应用程序的框架。 l即使不添加任何代码,当执行编译、链接命令后,Visual C+ IDE 将生成一个Windows界面风格的应用程序。 lMFC应用程序框架应用程序框架将那些每个应用程序都共同

6、需要使用 的代码封装起来,如完成默认的程序初始化功能、建立应 用程序界面和处理基本的Windows消息,使程序员不必做 这些重复的工作,把精力放在编写实质性的代码上。 lMFC AppWizardexe向导提供了一系列选项,程序员通 过选择不同的选项,可以创建不同类型和风格的MFC应用 程序,并可定制不同的程序界面窗口。例如,单文档、多 文档、基于对话框的程序,是否支持数据库操作、是否可 以使用ActiveX控件以及是否具有联机帮助等。 l在Visual C+ 中执行File| |New命令,出现New对 话框。 l确认New对话框的当前页面为Project,在左栏的 项目类型列表框中选择MF

7、C AppWizardexe项, 在Project Name框输入要创建项目的名称。在 location栏中输入项目所在的目录,可单击右侧 “”浏览按钮来对默认的目录进行修改。向导 将在该目录下存放项目的所有文件。单击OK按钮 出现MFC AppWizard-Step1对话框。 l在MFC AppWizard-Step1对话框中选择应用程序 的类型。 lSingle document:单文档界面应用程序,程序运 行后出现标准的Windows界面,它由框架(包括 菜单栏、工具栏和状态栏)和用户区组成。并且 程序运行后一次只能打开一个文档,如Windows 自带的记事本Notepad。 lMult

8、iple documents:多文档界面应用程序,程序 运行后出现标准的Windows界面,并且可以同时 打开多个文档,如Word。 lDialog based:基于对话框的应用程序,程序运行 后首先出现一个对话框界面,如计算器Calculator。 lNone:向导创建的应用程序不包括对数据库的操作功能, 但以后可以手工添加对数据库的操作代码(默认项)。 lHeader files only:提供了最简单的数据库支持,仅在项目 的stdAfx.h文件中使用#include指令包含afxdb.h和afxdao.h两 个用于定义数据库类的头文件,但并不生成与数据库相关的 类,用户需要时可以自己生

9、成。 lDatabase view without :包含了所有的数据库头文件,并生 成了相关的数据库类和视图类,但不支持文档的序列化,向 导创建的应用程序的File主菜单中将不包含有关文件操作的 菜单命令项。 l Database view with :包含了所有的数据库头文件,生成了 相关的数据库类和视图类,支持文档的序列化。 lNone:应用程序不支持任何复合文档(默认项)。 lContainer:应用程序作为复合文档容器,能容纳所嵌入 或链接的复合文档对象。 lMini-server:微型复合文档服务器,应用程序可以创建和 管理复合文档对象,但对于它所创建的复合文档对象,集 成应用程序

10、可以嵌入,但不能链接。微型服务器不能作为 一个单独的程序运行,而只能由集成应用程序来启动。 lFull-server:完全复合文档服务器,除了具备上面微型服 务器的功能外,应用程序支持链接式对象,并可作为一个 单独的程序运行。 lBoth container and server:应用程序既可作为一个复合文 档容器,又可作为一个可单独运行的复合文档服务器。 lDocking toolbar:应用程序具有标准的工具栏(默认项) lInitial status bar:应用程序具有标准的状态栏(默认项) lPrinting and print preview:应用程序支持打印和打印预览 功能(默认

11、项) lContext-sensitive Help:应用程序具有上下文相关帮助功能 l3D controls:应用程序界面具有三维外观(默认项) lNormal:应用程序采用传统风格的工具栏(默认项) lInternet Explorer ReBars:应用程序采用IE风格的工具栏 lHow many files would you like on your recent : 在 File主菜单可列出文档的最多个数。 lAdvanced按钮:进行更高一级的设置,如修改文件名或扩 展名,调整程序用户界面窗口的样式(边框厚度和最小化、 最大化、关闭按钮)。 lMFC Standard:应用程序采

12、用MFC标准风格(默认项) lWindows Explorer:应用程序采用Windows资源管理器 风格 l选择向导是否为源代码生成注释 l设置MFC库与应用程序的链接方式: (1) As a shared DLL:采用共享动态链接库的方式(默认 项) ,即在程序运行时才调用MFC库。采用此方式可减少 应用程序的代码长度。 (2) As a statically linked library:采用静态链接库的方式, 即在编译时把MFC库与应用程序相链接。采用此方式能提 高运行速度,且不用考虑程序最终运行环境中是否安装了 MFC库。 在New Project Information对话框,根据

13、用户 在前面各步所做的选择列出将要创建的应用程序的 有关信息,如应用程序的类型、创建的类和文件名、 应用程序的特征以及项目所在的目录。若要修改这 些内容,可单击Cancel按钮返回到前一个对话框。 单击OK按钮,MFC AppWizardexe向导将开始创 建应用程序框架。 在MFC AppWizard-Step 6 of 6,列出了向导将 创建的类,用户可以修改一些类默认的类名和对应 的头文件名、实现文件名。对某些类还可以选择不 同的基类。 利用MFC AppWizardexe向导创建应用程序 Mysdi的框架后,用户无需添加任何代码,就可以 对程序进行编译、链接,生成一个应用程序。但 一般

14、情况下,用户应根据程序具体功能需要,利 用Developer Studio中的集成工具向应用程序框架 添加具体的代码。 当应用程序框架创建成功后,Developer Studio将装入应用程序项目,并在项目工作区窗口 打开这个项目。值得说明的是,若想在同一个目录 下重新创建一个同名的项目,必须首先将原来的项 目删除或移走。 void CMysdiView:OnDraw(CDC* pDC) CMysdiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-Text

15、Out(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

16、选项,单击Next按钮,出现MFC AppWizard-Step 2 of 4。 3. 在MFC AppWizard-Step 2 of 4中设置应用程 序界面特征。 4. 创建对话框应用程序后续的步骤与创建单 文档或多文档应用程序的Step 5和Step 6 相同。 利用Visual C+编写Windows应用程序可以采取 几种不同的途径: l 利用 Win32应用程序接口API(Application Programming Interface)提供的函数,用C或C+语 言编写程序。 l 由于MFC通过类对API的绝大部分功能进行了封 装,可以利用MFC,用C+语言编写程序。 l 利用MF

17、C和MFC AppWizardexe,首先利用 MFC AppWizardexe应用程序向导生成基本的应用 程序框架,然后按照MFC机制和原理向框架添加具 体的应用代码。 l根据应用程序特性在MFC AppWizardexe应用程序向导 各步骤对话框中进行选择,创建一个应用程序的框架。 l利用资源编辑器资源编辑器为程序编辑或添加资源,如编辑菜单、添 加对话框等。 l利用ClassWizard类向导或手工添加类、成员变量和成员 函数的声明。 l根据需要编写具体的函数代码。 l编译、链接程序。如果程序有语法错误,需要修改源程序。 直到没有编译、链接错误,才能得到可执行程序。 l测试应用程序各项功能

18、,如果程序没有实现程序设计所要 求的功能,启动Debug调试器进行调试,找出并修改程序 设计中的逻辑错误。 ClassWizard类向导:类向导: Visual C+ IDE为MFC提供了大量的支持工具, 除了MFC AppWizardexe向导,还提供了 ClassWizard类向导,利用它程序员可以方便地增 加或删除对某个消息的处理。 资源编辑器:资源编辑器: 为程序添加具体的代码时还经常要用到资源编资源编 辑器辑器。下图形象地说明了编写一个MFC应用程序的 流程、所用到的工具及主要生成的文件。 编程时,除了编辑现有的资源,有时需要向项目添加新 的资源,这时可以利用Insert菜单创建一个

19、新的资源。 打开Insert菜单,选择Resource菜单项,出现Insert Resource对话框,如下图所示,在Resource Type框中选择一 个资源类型,单击New按钮即可向项目添加一个资源。 我们可以为Visual C+ MFC编程作一个形 象的总结,MFC应用程序框架使我们的程序设 计工作犹如做填充题,Developer Studio中的集 成工具使我们的程序设计工作犹如做选择题, 程序员犹如软件集成装配车间里的技术工人 (兰领、白领)。 MFC类库将所有图形用户界面的元素如窗口、菜单 和按钮等都以类的形式进行了封装,编程时需要利用C+ 类的继承性从MFC类中派生出自己的类,

20、实现标准 Windows应用程序的功能。 MFC AppWizardexe向导对Windows应用程序进行 了分解,并利用MFC的派生类对应用程序重新进行了组 装,同时还规定了应用程序中所用到的MFC派生类对象 之间的相互联系,这就是向导生成的MFC应用程序框架。 MFC应用程序框架实质上是一个标准的Windows应用程 序,它具有标准的窗口、菜单栏和工具栏。 为了生成一个可执行程序,MFC AppWizardexe向 导必须首先创建一个项目,并为项目生成一系列初始文 件,如C+头文件、C+源文件、资源文件和项目文件, 其中的C+文件都是以MFC派生类为单元来组织的。 如果要从项目中删除文件,

21、首先在项目工作区页面 中选中要删除的文件,然后按Delete键。但注意这并没 有从硬盘上真正删除了该文件。 Visual C+中的文件类型很多,根据项目类型不同 而 产 生 不 同 类 型 的 文 件 。 下 面 列 出 了 M F C AppWizardexe应用程序向导生成的文件类型。当进行 编辑、编译和链接时,还要生成一些临时文件。 后缀后缀类型类型说明说明 dsw工作区文件将项目的详细情况组合到工作区中 dsp项目文件存储项目的详细情况并替代mak文件 hC+头文件存储类的定义代码 cppC+源文件存储类的成员函数的实现代码 rc资源脚本文件存储菜单、工具栏和对话框等资源 rc2资源文

22、件用来将资源包含到项目中 ico图标文件存储应用程序图标 bmp位图文件存储位图 clw类向导文件存储ClassWizard类向导使用的类信息 一般而言,C+中的一个类由头文件h和源文件 cpp两类文件支持。 头文件用于定义类,包括指明派生关系、声明 成员变量和成员函数。 源文件用于实现类,主要定义成员函数的实现 代码和消息映射。 例如,应用程序视图类CMysdiView的两个支持 文件是MysdiView.h和MysdiView.cpp。 MFC AppWizardexe向导为一般的SDI应用程序 生成了五个类,这些类都是MFC类的派生类。这 里的“一般的SDI应用程序”是指向导每一步都 采

23、用默认选项,如不支持数据库和OLE对象等。 一般应用程序框架中所有类的名字由MFC AppWizardexe向导根据一定的规则自动命名, 但用户可以在向导的第6步改变类名和有关类的 文件名。应用程序框架中类(框架窗口类例外) 的命名规则一般遵照如下要求: Class Name = C + ProjectName + ClassType 注注:在定义类的头文件中的开始位置(类的正 式定义前)有一段预处理命令代码,这些代码是为 Developer Studio自身准备的,如用于保证头文件在 编译时仅被编译一次。Developer Studio中的资源编 辑器、ClassWizard类向导和编译器都

24、可能用到这些 代码。这些代码如下形式所示: #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 l向导为项目Mysdi生成了框架窗口类的头文件 MainFrm.h,该头文件用于定义框架窗口类 CMainFrame。不同的SDI应用程序,其框架窗 口类名和文件名是统一的。 lCMainFrame类是MFC的CFrameWnd类的派生 类,它主要负责创

25、建标题栏、菜单栏、工具栏和 状态栏。 lCMainFrame类中声明了框架窗口中的工具栏 m_wndToolBar、状态栏m_wndStatusBar两个成 员变量和四个成员函数。 向导为项目Mysdi生成了文档类的头文件 M y s d i D o c . h , 该 头 文 件 用 于 定 义 文 档 类 CMysdiDoc。CMysdiDoc类是MFC的CDocument 类的派生类,它主要负责应用程序数据的保存和 装载,实现文档的序列化功能。 l向导为项目Mysdi生成了视图类的头文件 MysdiView.h,该头文件用于定义视图类 CMysdiView。视图类用于处理客户区窗口,它

26、是框架窗口中的一个子窗口。 lCMysdiView类是MFC的CView类的派生类,它 主要负责客户区文档数据的显示,以及如何进行 人机交互。 向导为项目Mysdi生成了应用程序类的头文件 M y s d i . h , 该 头 文 件 用 于 定 义 应 用 程 序 类 CMysdiApp。CMysdiApp类是MFC的CWinApp类 的派生类,它主要负责完成应用程序的初始化、程 序的启动和程序运行结束时的清理工作。 l在项目中,资源通过资源标识符加以区别,通常 将一个项目中所有的资源标识符放在头文件 Resourde.h中定义。 l向导为项目Mysdi生成了资源头文件Resource.h

27、, 该文件用于定义项目中所有的资源标识符,给资 源ID分配一个整数值。 l标 识 符 的 命 名 有 一 定 的 规 则 , 如 IDR_MAINFRAME代表有关主框架的资源,包 括主菜单、工具栏及图标等。标识符以不同的前 缀开始,见下表。 标识符前缀标识符前缀说明说明 IDR_主菜单、工具栏、应用程序图 标和快捷键表 IDD_对话框 IDC_控件和光标 IDS_字符串 IDP_提示信息对话框的字符串 ID_菜单命令项 l向导为项目Mysdi生成了标准包含头文件 StdAfx.h,该文件用于包含一般情况下要用到且 的头文件,如MFC类的声明文件afxwin.h、使用 工具栏和状态栏的文件af

28、xext.h,这些头文件一 般 都 存 放 在 路 径 “ M i c r o s o f t Vi s u a l StudioVC98MFCInclude”下。 lStdAfx.h文件和StdAfx.cpp文件用来生成预编译 文件。 l对应于一个头文件中定义的类,都有一个类的实 现文件。在实现文件中主要定义在头文件中声明 的成员函数的实现代码和消息映射。MFC AppWizardexe生成的实现文件也包括六种。 l值得说明的是,向导生成的成员函数有很多,不 要因为没有使用某个成员函数而删除其声明和实 现代码。并且,用户一般不要轻易修改文件中那 些以灰色字体显示的代码,因为这些代码是通过 资

29、源编辑器或ClassWizard类向导进行维护的。 向 导 为 项 目 M y s d i 生 成 了 框 架 窗 口 类 的 实 现 文 件 Mainfrm.cpp,该文件包含了窗口框架类CMainFrame的实现 代码,主要是CMainFrame类成员函数的实现,它实现的框架窗 口是应用程序的主窗口。 CMainFrame类的四个主要成员函数: l AssertValid():诊断CMainFrame对象是否有效,调试用。 l Dump():输出CMainFrame对象的状态信息,调试用。 l OnCreate():创建工具栏m_wndToolBar和状态栏 m_wndStatusBar。

30、而视图窗口是由基类CFrameWnd的成员函数 OnCreate()通过调用OnCreateClient()函数创建的。 l PreCreateWindow():如果要创建一个非默认风格的窗口,可 以 重 载 该 函 数 ( 虚 函 数 ) , 在 函 数 中 通 过 修 改 CREATESTRUCT结构参数cs来改变窗口类、窗口风格、窗口 大小和位置等。 在项目工作区ClassView页面打开CMainFrame类, 双击成员函数PreCreateWindow()在编辑窗口打开该函 数,添加代码: BOOL CMainFrame:PreCreateWindow(CREATESTRUCT /

31、TODO: Modify the Window class or styles here cs.style / 取消窗口的最大化按钮取消窗口的最大化按钮 return TRUE; 向导为项目Mysdi生成了文档类的实现文件 MysdiDoc.cpp。与框架类CMainFrame类似,文档 类CMysdiDoc也定义了两个用于调试的成员函数 AssertValid()和Dump。 文档类CMysdiDoc的成员函数: l AssertValid() l Dump() l OnNewDocument():当用户执行File菜单中New命令 时,MFC应用程序框架会调用函数OnNewDocument

32、()来 完成新建文档的工作。 l Serialize():负责文档数据的磁盘读写操作。 注意:注意: l由于SDI单文档应用程序中只处理一个文档对象, 当执行New命令时,文档对象已经生成,因此文 档类CMysdiDoc的构造函数不会再被调用。所以, SDI应用程序不要在构造函数中进行文档对象成 员变量的初始化,而应在OnNewDocument()函数 中(看后面的例子)。 l在 文 档 派 生 类 C M y s d i D o c 重 载 的 OnNewDocument()函数中,首先需要调用基类 CDocument的OnNewDocument()函数。 向导为项目Mysdi生成了视图类的

33、实现文件 MysdiView.cpp,该文件主要定义了视图类的成员 函数。视图对象是用来显示文档对象的内容。与框 架类和文档类一样,视图类CMysdiView也定义了 两个用于调试的成员函数AssertValid()和Dump()。 视图类CMysdiView的成员函数: lGetDocument():用于获取当前文档对象的指针 m_pDocument。如果是建立程序的Release发行版,函数 GetDocument()作为内嵌(inline)函数来实现。 lOnDraw():虚函数,它负责文档对象的数据在用户视图 区的显示输出。 例例 修改程序Mysdi,为CMysdiDoc文档类定义一个

34、 字符串类型的成员变量,在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 F

35、ALSE; / 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是当前输

36、出设备环境的指针 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应用 程序的初始化、启动运行和结束都是由应用程序对 象完成。 在 M y s d i . c p p 文 件 中 定

37、义 了 应 用 程 序 类 CMysdiApp的成员函数,以下列出了应用程序类实 现文件Mysdi.cpp的部分源代码。 . . . . . . BEGIN_MESSAGE_MAP(CMysdiApp, CWinApp) /AFX_MSG_MAP(CMysdiApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) / ClassWizard将在此处添加和删除消息映射宏 . . . . . . END_MESSAGE_MAP() / CMysdiApp construction CMysdiApp:CMysdiApp() / TODO: 在此处添加构造函数代码 / 把

38、所有的重要的初始化信息放在InitInstance过程当中 / 声明唯一的CMysdiApp对象theApp CMysdiApp theApp; / CMysdiApp的初始化 BOOL CMysdiApp:InitInstance() / 标准初始化 / 如果不使用这些特征并希望减少最终可执行代码的长度, / 你可以去掉以下专门的初始化代码。 . . . / 设置应用程序的注册键 / TODO: 你应该为这个字符串设置适当的内容,如公司名 SetRegistryKey(_T(Local AppWizard-Generated Applications); / 装入应用程序INI文件中的设置信

39、息,如 “最近使用的文件列表”项 LoadStdPro(); / 注册应用程序文档模板,文档模板用于链接文档、框架窗口和视图 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMysdiDoc), RUNTIME_CLASS(CMainFrame), / SDI框架窗口 RUNTIME_CLASS(CMysdiView); AddDocTemplate(pDocTemplate); . . . / 主窗口已经初始化,在此显示并刷新窗口 m_

40、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头文件,整个编译过程将 浪费大量的时间。为了提高编译速度,可以首先将项目中 那

41、些共同要使用的头文件编译出来,首次编译后将结果存 放在一个名为预编译头文件的中间文件中,以后再编译时 直接读出存储的结果,无需重新编译,节约了编译时间。 Windows编程的一个主要特点是资源和代码 的分离,即将菜单、工具栏、字符串表、对话框 等资源与基本的源代码分开。优点优点: l 这样使得对这些资源的修改独立于源代码。例 如,可以将字符串表翻译成另一种语言,而无需 改动任何源代码。 l 当Windows装入一个应用程序时,一般情况下, 程序的资源数据并不同时装入内存,而是在应用 程序执行过程中需要时如创建窗口、显示对话框 或装载位图,才从硬盘读取相应的资源数据。 1资源文件资源文件 向导为

42、项目Mysdi生成了资源文件Mysdi.rc和Mysdi.rc2。Mysdi.rc是 Visual C+生成的脚本文件,它使用标准的Windows资源定义语句,可通 过资源编译器转换为二进制资源。一般利用资源编辑器对资源进行可视化 编辑,也可通过Open命令以文本方式打开一个资源文件进行编辑。 Mysdi.rc2文件一般用于定义资源编辑器不能编辑的资源。 2图标文件图标文件 向导为项目Mysdi生成了应用程序的图标文件Mysdi.ico。在Visual C+ 中,可利用图形编辑器编辑应用程序的图标。 3文档图标文件文档图标文件 向导为项目Mysdi生成了文档图标文件MysdiDoc.ico。文

43、档图标一般用 于多文档应用程序中,在程序Mysdi中没有显示这个图标,但编程时用户 可 以 利 用 相 关 函 数 来 获 取 该 图 标 资 源 并 显 示 图 标 ( I D 为 IDR_MYSDITYPE)。 4工具栏按钮位图文件工具栏按钮位图文件 向导为项目Mysdi生成了工具栏按钮的位图文件Toolbar.bmp,该位图 是应用程序工具栏中所有按钮的图形表示。 除了上述用于生成可执行程序的源代码文件和 资源文件,向导还为项目生成了其它一些在开发环 境中必须使用的文件,如项目文件、项目工作区文 件和ClassWizard类向导文件。 1项目文件项目文件 项目用项目文件DSP(Devel

44、oper Studio Project) 来描述,向导为项目Mysdi生成了项目文件 Mysdi.dsp,该文件将项目中的所有文件组织成一个 整体。项目文件保存了有关源代码文件、资源文件 以及你所指定的编译设置等信息。 2项目工作区文件项目工作区文件 为了创建应用程序,必须在Developer Studio的工作区中 打开项目,这些应用程序项目工作区设置信息保存在项目工 作区文件DSW(Developer Studio Workspace)中。向导为项 目Mysdi生成了项目工作区文件Mysdi.dsw,该文件将一个 DSP项目文件与具体的Developer Studio结合在一起,它保存 了

45、上一次操作结束时窗口状态、位置以及工作区设置信息。 3类向导文件类向导文件 向导为项目Mysdi生成了类向导文件Mysdi.clw,该文件 存储了ClassWizard类向导使用的类信息,如类信息的版本、 类的数量、每个类的头文件和实现文件。利用ClassWizard类 向导时要使用该文件。如果从项目中删除了clw文件,下次 使用ClassWizard类向导时会出现提示对话框,询问是否想重 新创建这个文件。 l利用应用程序向导生成MFC应用程序框架后, 用户需要为自己的MFC派生类添加消息处理成 员函数和对话框控件的成员变量,有时还需要 为程序添加新的MFC派生类,这时用户需要使 用Class

46、Wizard类向导。 lMFC ClassWizard类向导根据程序员的要求以 半自动的方式添加程序代码,它是进行MFC应 用程序设计时一个必不可少的交互式工具,在 今后的程序设计中经常用到它。 l定制现有的类和建立新的类,如把消息映射为类的 成员函数,把一个控件与类的成员变量关联起来。 l用户编程时,利用ClassWizard类向导能够大大简化 一些细节问题,如成员变量和成员函数的声明和定 义放在何处、成员函数如何与消息映射联系在一起。 lClassWizard有五个页面:Message Maps页面用来处 理消息映射,为消息添加或删除处理函数;Member Variables面页用来给对话

47、框类添加或删除成员变量 (与控件关联);Automation页面提供了对OLE自动 化类的属性和方法的管理;ActiveX Events页面用于 管理ActiveX类所支持的ActiveX事件;Class Info页 面显示应用程序中所包含类的信息。 ClassWizard类向导的Message Maps页面主要 用于添加与消息处理有关的代码,包括添加消息 映射宏和消息处理函数。Message Maps页面有五个 列表框: l Project框列出当前工作区中的项目 l Class name框列出当前项目中的类 l Object IDs框列出当前类所有能接收消息的对象(ID), 包括类、菜单项

48、和控件 l Messages框列出在Object IDs框中选择的对象可处理的消 息和可重载的MFC虚函数 l Member functions框列出当前类已创建的消息处理函数, 其中的“V”标记表示该函数是虚函数,“W”标记表示该函 数是窗口消息处理函数 当在Messages框选择一个消息后: l单击Add Function按钮添加一个消息处理函数。 l单击Edit Code按钮将退出ClassWizard,打开源代 码编辑器并定位到指定的消息处理函数。 l单击Delete Function按钮可以删除已建立的消息 处理函数。注意注意:为了避免不小心删除了函数代 码,此时只在头文件中删除了函

49、数声明,在源文 件中删除了消息映射项,实际的函数代码必须用 户自己手工删除。 例例 编写一个SDI应用程序MyMessage,程序运行后 在程序视图窗口左击或右击鼠标时分别弹出不同提 示信息的对话框,显示左击或右击鼠标的次数。 1利用MFC AppWizardexe建立一个单文档应用 程序MyMessage。 2为视图类CMyMessageView添加两个private属性、 int类型的成员变量m_nLeft和m_nRight。在项目工 作区的ClassView类视图中右击CMyMessageView, 在弹出式菜单中选择Add Member Variable命令项 出现添加成员变量对话框,

50、在对话框中输入变量类 型和变量名、选择属性。也可以采用手工方法直接 在头文件中添加一般的成员变量。 CMyMessageView:CMyMessageView() / TODO: add construction code here m_nLeft=0; / 初始化成员变量初始化成员变量 m_nRight=0; 4分别添加鼠标左击或右击的消息处理函数。 按Ctrl+W键弹出MFC ClassWizard对话框,选 择Message Maps页面。在Class name和Object IDs框 选择CMyMessageView,在Messages框分别选择 WM_LBUTTONDOWN和WM_R

51、BUTTONDOWN 消息,单击Add Function按钮。最后单击OK按钮退 出MFC ClassWizard对话框。 ClassWizard类向导完成的工作: l 在视图类CMyMessageView的头文件中声明了消 息处理函数OnLButtonDown()和OnRButtonDown(); l 在视图类CMyMessageView的实现文件中生成了 消息处理函数的框架代码; l 在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP中 定义了消息映射。 void CMyMessageView:OnLButtonDown (UINT nFlags, CPoint poin

52、t) / 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); 添加一般的成员函数除了采用手工方法直接在 头文件和实现文件中分别添加函数声明和

53、函数代码 外,也可以在Workspace项目工作区ClassView页面 中右击鼠标,从弹出式菜单项执行Add Member Function命令。 l利用ClassWizard类向导为项目添加一个常用 MFC类的派生类。 l选择执行“Insert| |New Class”菜单命令添加: (1)其它MFC类的派生类 (2)非MFC类的派生类 (3)普通类 利用“Insert|New Class”命令添加类 程序调试是程序设计中一个很重要的环节,一 个程序要经过很多次调试才能保证其基本正确。 程序调试分为源程序语法错误的修改和程序逻 辑设计错误的修改两个阶段。编译器只能找出源程 序语法上的错误,

54、程序逻辑设计上的错误只能靠程 序员通过一些调试工具来手工检查和修改。 程序调试水平的高低与程序员的经验密切相关, 程序调试水平也决定了程序员的编程能力,程序员 在实际编程中应该熟练掌握各种调试工具的使用。 对于程序中的语法错误,直接利用高级语言编 译器就能找出来。如果程序有语法错误,则在执行 编译、链接命令时,Visual C+编译器将在Output 输出窗口给出语法错误提示信息。 错误提示信息的格式为: (行): : 例如: D: 例4-6 MyMessageMyMessageView.cpp(38) : error C2065: m_nLeft : undeclared identifie

55、r 错误代码给出了源代码语法错误类别和编号, 语法错误分为一般错误(error)和警告错误 (warning)两种。 lerror错误出现的情况:如少写一个括号、分号 或写错一个单词,属于语法错误。当出现error错 误时将不会产生可执行程序。 lwarning错误出现的情况:如一个定义的变量没 有使用、一个浮点值被赋值给一个整形变量等。 出现warning错误时可生成可执行程序。 提示提示:编译器给出的错误提示信息可能不十分 准确,并且一处错误往往会引出若干条错误提示信 息,一个有经验的程序员根据这些信息就能够判断 具体的错误位置,修改一个错误后马上进行程序的 编译和链接。通过重复的编译和链

56、接,使程序中的 错误越来越少,直至所有的错误都被修改。 在链接阶段也可能给出错误提示信息,链接错 误提示信息不给出错误发生的具体位置,因为链接 的程序是目标文件(obj),无法确定错误发生的准 确位置。 发生链接错误时,一般是程序中调用了某个函 数,而链接程序却找不到该函数的定义。另外,程 序分为几个文件分别编译、链接时,可能出现全局 变量没有声明或重复声明的错误。 在Output窗口中双击错误提示信息可以返回到 源程序编辑窗口,并通过一个箭头符号定位到产生 错误的语句。在Output窗口选择一条错误提示信息 后,单击F1键可打开MSDN联机帮助,显示该错误 代码更详细的说明和有关的例子。 Visual C+提供了一个调试工具Debug调试调试 器器。利用Debug调试器可以在开发程序时方便快捷 地进行程序的调试。 Debug调试器功能:调试器功能: l 设置断点 l 单步跟踪

温馨提示

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

评论

0/150

提交评论