VisualC++面向对象编程教程第7章MFC原理与方法_第1页
VisualC++面向对象编程教程第7章MFC原理与方法_第2页
VisualC++面向对象编程教程第7章MFC原理与方法_第3页
VisualC++面向对象编程教程第7章MFC原理与方法_第4页
VisualC++面向对象编程教程第7章MFC原理与方法_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、Visual C+面向对象编程教程第7章 MFC原理与方法 版权所有版权所有 复制必究复制必究 Visual C+面向对象编程教程第7章 MFC原理与方法 一个优秀的编程工具往往匹配一个功能强大 的类库,类库封装了大量Windows编程需要使用 的函数和数据结构。与Visual C+捆绑在一起的 MFC(Microsoft Foundation Class)微软基础类就 是这样一个由Microsoft公司设计的类库。采用 MFC方式编程提高了Windows应用程序的开发效 率,但由于MFC应用程序结构的复杂性和透明性, 要想完全掌握MFC应用程序的内部机制需要付出 很大的努力。 认识MFC只是

2、一个过程、一个手段,最终目 的是为了良好并熟练地运用MFC。 Visual C+面向对象编程教程第7章 MFC原理与方法 本章主要学习内容:本章主要学习内容: lWindows的编程机制 lMFC的基本原理和使用方法: MFC类类 MFC应用程序框架应用程序框架 MFC消息管理消息管理 MFC宏宏 l常用的MFC类 Visual C+面向对象编程教程第7章 MFC原理与方法 lWindows是一个多进程的图形窗口操作系统, Windows应用程序与DOS应用程序有很大的区别。 DOS应用程序采用顺序执行过程,而Windows是 一个基于事件的消息(Message)驱动系统。 lWindows应

3、用程序是按照“事件事件消息消息处理处理” 非顺序的机制运行。当有某个事件(如单击鼠标、 键盘输入和执行菜单命令等)发生时,Windows 会根据具体的事件产生对应的消息,并发送到指 定应用程序的消息队列;应用程序从消息队列中 取出消息,并根据不同的消息进行不同的处理。 Visual C+面向对象编程教程第7章 MFC原理与方法 lWindows API(Application Programming Interface) 是Windows操作系统与应用程序之间的标准接口, 它提供了上千个标准函数、宏和数据结构的定义。 l在使用Visual C+、Visual Basic和Delphi编程时 都

4、可以调用Windows API函数,Windows应用程 序可通过调用标准Windows API函数使用系统提 供的功能。 lWindows API函数定义在一些DLL动态链接库中, 其中最主要的DLL是User32.dll、Gdi32.dll和 Kernel32.dll三个库文件。 Visual C+面向对象编程教程第7章 MFC原理与方法 l传统SDK编程:程序员通过调用API函数,自己 动手、按部就班地实现程序各部分的功能。SDK 应用程序的结构比较清晰,但程序员必须编写所 有的功能代码。 l利用Visual C+编写一个类SDK应用程序:首先 利用Win32 Application向导

5、建立一个Windows应 用程序框架,然后根据需要可以向程序项目中添 加一些头文件、实现源文件和资源文件,并编写 具体的程序代码。 例例 编写一个名为Hello的类SDK应用程序,当单 击鼠标时通过调用API函数,以弹出一个提示信 息对话框。 Visual C+面向对象编程教程第7章 MFC原理与方法 1执行“”菜单命令,在New对话框的Project页面 中选择Win32 Application项目类型,输入程序名 Hello。在向导第1步选择“A typital “Hello world!” application”项,单击Finish按钮。 2在窗口函数WndProc()的消息处理分支s

6、witch- case结构中添加WM_LBUTTONDOWN鼠标单击消 息及其处理代码: case WM_LBUTTONDOWN: MessageBox(NULL, You pressed the left button of mouse !,Message,NULL); break; Visual C+面向对象编程教程第7章 MFC原理与方法 l一个由API函数构造的Windows程序的功能由三个 部分组成:入口函数、窗口函数和Windows系统。 l每一个程序都有一个主函数,WinMain()函数就 是Windows程序的入口主函数。该函数的主要任 务是完成一些初始化工作并维护一个消息循环

7、。 当消息循环结束后,就退出了WinMain()函数, 也就退出了应用程序。此外,WinMain()函数还 负责完成窗口的注册、创建和显示。 lWindows程序以窗口的形式存在,在不同窗口之 间传递消息是Windows和应用程序进行交流的主 要形式。程序具体功能由不同的窗口函数实现。 Visual C+面向对象编程教程第7章 MFC原理与方法 l在Windows中,用句柄(句柄(Handle)标识应用程序 中不同的对象和同类对象中不同的实例,如一个 具体的窗口、按钮、输出设备、画笔和文件等。 通过句柄可以获得相应的对象信息。常用的句柄 类型有: HWND 、 HINSTANCE 、 HDC

8、、 HCURSOR、HICON、HMENU等。 l句柄常作为Windows消息和API函数的参数,在采 用API方法编写Windows应用程序时要经常使用句 柄。而采用MFC方法编写Windows应用程序时, 由于对应的MFC类已对句柄进行了封装,大多数 情况下不再需要访问句柄。 Visual C+面向对象编程教程第7章 MFC原理与方法 获取获取MFC类对象的句柄的两种方法:类对象的句柄的两种方法: l通过访问类的public属性成员变量,如类CWnd的成员变 量m_hWnd就是一个窗口对象的句柄。 l先定义一个句柄,然后调用MFC类的成员函数Attach()将 句柄与一个MFC类对象联系在

9、一起,此时的句柄就成为 该MFC类对象的句柄。在退出对象作用域之前,调用成 员函数Detach()将句柄和对象进行分离。如下所示: CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach(); Visual C+面向对象编程教程第7章 MFC原理与方法 l所谓消息消息就是用于描述某个事件发生的信息,而事事 件件是对于Windows的某种操作。 l事件和消息密切相关,事件是因,消息是果,事件 产生消息,消息对应事件。所谓消息的响应,其实 质就是事件的响应。 l消息驱动消息驱动是Windows应用程序的核心,所有的外部

10、 响应(如键盘、鼠标和计时器等)都被Windows先 拦截,转换成消息后再发送到应用程序中的目标对 象,应用程序根据消息的具体内容进行处理。 l消息不仅可由Windows发出,它也可由应用程序本 身或其它程序产生。Windows为每一个应用程序都 维护一个或多个消息队列消息队列,发送到每个程序窗口的 消息都排成一个队列。 Visual C+面向对象编程教程第7章 MFC原理与方法 Visual C+面向对象编程教程第7章 MFC原理与方法 l标 准标 准 W i n d o w s 消 息消 息 : 以 W M _ 前 缀 ( 但 不 包 括 WM_COMMAND)开始的消息,包括鼠标消息、键

11、盘消 息和窗口消息,如WM_MOVE 、WM_PAINT等。 l控件通知(控件通知(Control Notification)消息消息:对控件操作引起 的 消 息 , 是 控 件 和 子 窗 口 向 其 父 窗 口 发 出 的 WM_COMMAND通知消息。例如,当用户修改了编辑控 件 中 的 文 本 后 , 编 辑 控 件 向 其 父 窗 口 发 送 WM_COMMAND通知消息。 l命令(命令(Command)消息消息:由菜单项、工具栏按钮、快捷 键等用户界面对象发出的WM_COMMAND消息。命令消 息与其它消息不同,它可被更广泛的的对象如文档、文 档模板、应用程序对象、窗口和视图等处理

12、。 Visual C+面向对象编程教程第7章 MFC原理与方法 typedef struct tagMSG HWND hWnd; / 目标窗口句柄 UINT message;/ 消息标识 WPARAM wParam;/ 消息参数1(附加信息,16位) LPARAM lParam;/ 消息参数2(附加信息,32位) DWORD time;/ 消息发送时间 POINT pt; / 消息发送时鼠标的屏幕坐标 MSG; 消息用消息用MSG结构表示:结构表示: Visual C+面向对象编程教程第7章 MFC原理与方法 例例 为程序Hello添加键盘消息处理功能,判断当前 按下的键是不是A或a键,并给出

13、相应的提示。 打开程序项目Hello,在文件Hello.cpp的窗口函 数WndProc()的switch消息处理分支中添加键盘消 息的处理代码: case WM_KEYDOWN: / 处理键盘消息 if(wParam=0 x41) / A或a键的虚键码为0 x41H MessageBox(NULL, The key you pressed is A or a !,KEYDOWN,NULL); else MessageBox(NULL, The key you pressed is not A or a !,KEYDOWN,NULL); break; Visual C+面向对象编程教程第7章

14、MFC原理与方法 利用Windows API开发程序的用户有这样的体 会,即使开发一个简单的Windows应用程序也需要 对Windows的编程原理有很深刻的认识,需要手工 编写冗长的代码。由于程序的出错率是随着代码长 度的增加呈几何级数增长的,而且当程序长度逐渐 膨胀时,调试程序会变得越来越困难。因此,传统 的Windows应用程序设计需要程序员有极大的耐心 和丰富的编程经验。 Visual C+捆绑了微软的基础类MFC,编程时 我们就可以利用类的可重用性和可扩充性,大大降 低Windows应用程序设计的难度和工作量。 Visual C+面向对象编程教程第7章 MFC原理与方法 l类库是一个

15、可以在应用程序中使用的相互关联的 C+类的集合。 MFC作为一个Windows编程类库, 它包含了200多个类,封装了Windows的大部分编 程对象以及与它们有关的操作。 l虽然程序在功能上千差万别,但从本质上看,都 可以分为用户界面设计、文件操作、数据库访问 及多媒体使用等几部分,这些都可以通过一些类 来实现。MFC提供了一个标准化的程序结构,使 开发人员不必从头设计一个Windows应用程序。 lMFC实际上是一个庞大的文件库,它由几百个执 行文件和源代码文件(如H文件)组成。 Visual C+面向对象编程教程第7章 MFC原理与方法 l使用标准化的程序代码结构,有利于程序员之 间的交

16、流。 lVisual C+为MFC提供了大量的工具支持,提高 了编程效率。如利用MFC AppWizard创建MFC 应用程序框架,利用ClassWizard方便地对 Windows消息进行管理。 lMFC应用程序的效率较高,只比传统的Windows C程序低5%左右。并且,在MFC应用程序中还 允许混合使用传统的Windows API函数。 l其它优势:完全支持Windows所有的函数、控件、 消息、菜单及对话框;具有良好的稳定性和可 移植性,更符合微软的风格等。 Visual C+面向对象编程教程第7章 MFC原理与方法 lMFC主要组成部分:类、宏和全局函数。 l类是MFC中最主要的内容

17、。MFC类是以层次结 构方式组织起来的。MFC中的类分成两部分,除 了一些辅助类,大多数的MFC类是直接或间接从 根类CObject派生而来。 l几乎每一个派生层次都与一具体的Windows实例 相对应,如文档类、窗口类和视图类等。 lMFC宏主要功能:消息映射、运行时对象类型服 务、诊断服务、异常处理。 lMFC约定:全局函数以“Afx”为前缀,全局变 量以“afx”为前缀。 Visual C+面向对象编程教程第7章 MFC原理与方法 l首先要对Windows编程概念和API函数有一定的了解,如 Windows API有哪些功能和哪些常用的数据结构等。 l学会抽象地把握问题,不求甚解,不要一

18、开始学习Visual C+就试图了解整个MFC类库。从理解和使用两个方面学 习MFC,理解MFC应用程序的框架结构。 l先大体上了解MFC的概念、组成和基本约定,从简单的类 入手,结合程序设计,由浅入深,循序渐进、日积月累。 l编程时如果MFC某个类能完成所需要的功能,可以直接调 用已有类的方法(成员函数)。否则,可以利用面向对象 技术中的“继承”方法对MFC类的行为进行扩充和修改, 从MFC中已有的类派生出自己需要的类。 l学习MFC,另一点就是不要过分依赖于向导(Wizard)工 具。向导能做许多工作,但同时掩饰了太多的细节。 Visual C+面向对象编程教程第7章 MFC原理与方法 l

19、尽管每个应用程序具体实现的功能不同,但同一 类程序的基本结构是相同的。因此,通常采用 MFC AppWizard创建一个MFC应用程序框架应用程序框架。 lMFC不仅仅是一个类库,它还提供了一层建立在 MFC类对象封装上的附加应用程序框架。应用程 序框架是为了生成一般的应用程序所必需的各种 软组件的集成,是类库的一种超集。 l类库只是一种可以嵌入到任何程序中的、提供某 些特定功能的类的集合。而应用程序框架却定制 了应用程序的结构和源代码,其中的类对象既相 互独立、又相互作用,形成一个统一的整体。 Visual C+面向对象编程教程第7章 MFC原理与方法 lMFC应用程序框架提供了构建应用程序

20、所需要 的类,在程序运行时能够生成运行时类的对象, 如代表应用程序对象、文档对象、视图对象和 框架窗口对象。应用程序对象theApp是一个唯 一的全局变量,它的主要功能是通过调用 WinMain()主函数启动程序的运行。 lMFC应用程序框架也有一个作为程序入口点的 WinMain()主函数,但在源程序中看不见该函 数,它在MFC中已定义好并同应用程序相链接。 Visual C+面向对象编程教程第7章 MFC原理与方法 Visual C+面向对象编程教程第7章 MFC原理与方法 l在MFC应用程序的CWinApp派生类对象theApp是一个全局 变量,代表了应用程序运行的主线程。它在程序整个运

21、行 期间都存在,它的销毁意味着运行程序的消亡。 lMFC应用程序启动时,首先创建应用程序对象theApp,这 时将自动调用应用程序类的构造函数初始化对象theApp, 然后由应用程序框架调用MFC提供的AfxWinMain()主函数。 lAfxWinMain()主函数首先通过调用全局函数AfxGetApp()获 取应用程序对象theApp的指针pApp,然后通过pApp调用应 用程序对象的有关成员函数,完成程序的初始化和启动工 作,最后调用成员函数Run(),进入消息循环。 l程序运行后将收到WM_PAINT消息,调用OnPaint()函数绘 制客户区窗口。如果Run()收到WM_QUIT消息

22、,则结束消 息循环,然后调用函数ExitInstance(),结束程序运行。 Visual C+面向对象编程教程第7章 MFC原理与方法 InitInstance()函数是派生类唯一需要重载的函数,它负 责应用程序的初始化,如初始化数据、创建文档模板、处理 命令行以及显示应用程序主窗口。 Visual C+面向对象编程教程第7章 MFC原理与方法 文文 件件 名名 称称说说 明明 afxwin.h声明MFC核心类 afxext.hMFC扩展文件,声明工具栏、状态栏、拆分窗口等类 afxdisp.h声明OLE类 afxdtctl.h声明支持IE 4公用控件的MFC类,如CImageList等 a

23、fxcmn.h声明Windows公共控件类 Mfc42.libMFCxx.DLL的导入函数库(Release版) Mfc42D.libMFCxx.DLL的导入函数库(Debug版) MfcS42.libMFCSxx.DLL的导入函数库(Static Release版) MfcS42D.libMFCSxxD.DLL的导入函数库(Static Debug版) Mfc42U.libMFCxxU.DLL的导入函数库(Unicode Release版) Visual C+面向对象编程教程第7章 MFC原理与方法 Mfc42UD.libMFCxxUD.DLL的导入函数库(Unicode Debug版) M

24、fcO42D.libMFCOxxD.DLL的导入函数库(OLE Debug版) MfcD42D.libMFCDxxD.DLL的导入函数库(Database Debug版) Nafxcw.libMFC静态链接库(Release版) NafxcwD.libMFC静态链接库(Debug版) gdi32.libGDI32.DLL的导入函数库 user32.libUSER32.DLL的导入函数库 kernel32.libKERNEL32.DLL的导入函数库 msvcrt.libMSVCRT.DLL(C运行函数库)的导入函数库 msvcrtd.libMSVCRTD.DLL(Debug版C运行函数库)的导入

25、函数库 libcmt.libC运行函数静态链接库(多线程) libc.libC运行函数静态链接库(单线程) Visual C+面向对象编程教程第7章 MFC原理与方法 lMFC消息管理是MFC编程的一个重要内容,也是 编写MFC应用程序的基础。 lMFC应用程序消息处理的方式与SDK应用程序有所 不同。MFC应用程序框架截取了Windows向应用程 序发出的消息,再确定将消息发送给哪一个对象, 可以根据需要利用函数重载对消息进行处理,但不 需要处理的消息将由应用程序框架自动处理。 l消息管理包括消息的发送和处理。对于消息发送, MFC提供了类似于API函数功能的消息发送函数, 而MFC消息处理

26、的内部机制则相对复杂一些。从编 程的角度出发,我们只需了解其大致的原理。 Visual C+面向对象编程教程第7章 MFC原理与方法 lMFC采用消息映射(消息映射(Message Map)机制取代 C/C+语言中的switch-case结构来处理消息。 lMFC消息映射机制包括一组消息映射宏消息映射宏。一条消 息映射宏把一个Windows消息和其消息处理函数 联结起来。 lMFC应用程序框架提供了消息映射功能。 l在类的实现源文件中用BEGIN_MESSAGE_MAP() 和END_MESSAGE_MAP()宏来定义消息映射。 l在类定义的结尾用DECLARE_MESSAGE_MAP() 宏

27、来声明使用消息映射。 Visual C+面向对象编程教程第7章 MFC原理与方法 BEGIN_MESSAGE_MAP(theclass, baseclass) /AFX_MSG_MAP(theclass) ON_ . . . . . . / MFC预定义的消息映射宏 ON_MESSAGE(message , memberFxn) / 用户自定义的消息映射宏 . . . . . . /AFX_MSG_MAP END_MESSAGE_MAP() 注意:注意:特殊注解“/AFX_MSG_MAP”是ClassWizard类 向导用于维护消息映射宏的标记,用户不要删除注解轻易 修改注解内的代码。 Vis

28、ual C+面向对象编程教程第7章 MFC原理与方法 启动ClassWizard,添加要求的三个消息处理函数, ClassWizard将在类的实现文件中添加三个消息映射宏和消息 处理函数。消息映射宏如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() / 由MFC AppWizard程序向导自动生成的消息映射 ON_WM_CLOSE() / 由ClassWizard类向导添加 ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy)

29、 /AFX_MSG_MAP END_MESSAGE_MAP() Visual C+面向对象编程教程第7章 MFC原理与方法 class CMainFrame : CFrameWnd public: CMainFrame(); protected: /AFX_MSG(CMainFrame) / 声明消息处理函数原形 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); / 由程序向导自动生成 afx_msg void OnClose(); / 由ClassWizard类向导添加 afx_msg void OnDestroy(); afx_msg

30、 void OnEditCopy(); /AFX_MSG DECLARE_MESSAGE_MAP() / 声明使用消息映射宏 ; Visual C+面向对象编程教程第7章 MFC原理与方法 l发送消息到一个窗口可以采用传送(Send)或寄 送(Post)方式,这两种方式之间的主要区别是消 息被接收对象收到后是否立即被处理。Windows提 供了三个API函数用于消息的发送。 l函数SendMessage()用于向一个或多个窗口传送消 息,该函数将调用目标窗口的窗口函数,直到目 标窗口处理完收到的消息,该函数才返回。 l函数PostMessage()用于向一个或多个窗口寄送消息, 它把消息放在指

31、定窗口创建的线程的消息队列中, 然后不等消息处理完就返回。 Visual C+面向对象编程教程第7章 MFC原理与方法 l函数SendDlgItemMessage()函数用于向对话框中指 定的控件发送消息,直到目标控件处理完收到的 消息,该函数才返回。 lMFC将这三个函数封装为CWnd窗口类的成员函数, 封装了目标窗口句柄,它们将向调用它的窗口对 象发送或寄送消息,如pMyView-SendMessage() 的调用形式表示向pMyView所指对象发送消息。 l与用户输入相关的消息(如鼠标消息和键盘消息) 通常是以寄送(Post)的方式发送,以便这些用户 输入可以由运行较缓慢的系统进行缓冲处

32、理。而 其它消息通常是以传送(Send)的方式发送 Visual C+面向对象编程教程第7章 MFC原理与方法 l由于程序逻辑设计结构的限制或不同窗口之间数 据的同步,程序员需要手工自定义一些消息。例 如,如果需要在特定时间间隔内通知所有数据输 出窗口重新取得数据,就必须采用定时器事件来 产生特定的消息。 lMFC允许用户自定义消息,常量WM_USER(为 0 x0400)与第一个自定义消息值相对应,用户必 须为自己的消息定义相对于WM_USER的偏移值,。 利用#define语句定义自己的消息,例如: #define WM_USER1 WM_USER+0 #define WM_USER2 W

33、M_USER+1 Visual C+面向对象编程教程第7章 MFC原理与方法 必须在函数返回类型前面加上afx_msg标识,如: afx_msg LRESULT memberFxn ( WPARAM wParam , LPARAM lParam); 其中,参数wParam、lParam用于传递消息的两个附 加信息 ON_MESSAGE(message, memberFxn) 其中,message是消息名标识,memberFxn是对应的 消息处理函数。如: ON_MESSAGE(WM_MYMESSAGE, OnMyMessage) 自定义消息映射宏的定义自定义消息映射宏的定义: Visual C

34、+面向对象编程教程第7章 MFC原理与方法 1首先利用MFC AppWizardexe向导创建一个名为Rotate的 应用程序。利用ClassWizard类向导为CRotateView类生成消 息WM_CREATE的消息处理函数,通过设置定时器在指定的 时间间隔向窗口发送WM_TIMER消息。 SetTimer(1,200,NULL); / 启动定时器 2在文件RotateView.cpp开始位置定义一个用户自定义消息: #define WM_MYMESSAGE WM_USER+1 利用ClassWizard为CRotateView类生成消息WM_TIME的 消息处理函数:SendMessag

35、e(WM_MYMESSAGE); Visual C+面向对象编程教程第7章 MFC原理与方法 3在类CRotateView的定义中声明自定义消息处理函数: afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 在文件RotateView.cpp消息映射BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间添加自定义消息映射宏: ON_MESSAGE(WM_MYMESSAGE,OnMyMyessage) 4在类CRotateView的定义中声明一个private属性、int型的 成员变量m_dEscapement,

36、它表示文本显示角度,并在类 CRotateView的构造函数中初始化:m_dEscapement=0; 5在文件RotateView.cpp中手工添加自定义消息处理函数实 现代码,完成以动画形式旋转显示一行文本的功能。 6利用ClassWizard生成消息WM_DESTROY的消息处理函 数,在销毁已创建的定时器:KillTimer(1); Visual C+面向对象编程教程第7章 MFC原理与方法 宏宏就是用预处理指令#define定义一个标识符, 用它来表示一个字符串或一段源代码。MFC宏宏作 为MFC类库的一个组成部分在MFC应用程序中经 常出现。MFC宏在Afxwin.h、Afx.h及

37、Afxmsg_.h等 MFC头文件中分别进行了定义。 MFC提供的宏有很多,常用的包括消息映射宏、 运行时类型识别的宏、调试宏和异常宏等,下表列 出了一般MFC编程时要用到的宏。 Visual C+面向对象编程教程第7章 MFC原理与方法 RUNTIME_CLASS获得运行时类的CRuntimeClass结构的 DECLARE_DYNAMIC提供基本的运行时类型识别(声明) IMPLEMENT_ DYNAMIC提供基本的运行时类型识别(实现) DECLARE_DYNCREATE动态创建(声明) IMPLEMENT_DYNCREATE动态创建(实现) DECLARE_SERIAL对象序列化(声明

38、) IMPLEMENT_SERIAL对象序列化(实现) DECLARE_MESSAGE_MAP声明消息映射表 BEGIN_MESSAGE_MAP开始建立消息映射表 END_MESSAGE_MAP结束建立消息映射表 ON_COMMAND命令消息映射宏 ON_MESSAGE自定义消息映射宏 ON_WM_MFC预定义消息映射宏 ON_BN_ , ON_CBN_ 等控件通知(Notification)消息映射宏 Visual C+面向对象编程教程第7章 MFC原理与方法 运行时类型识别RTTI(Run Time Type Information)是指在程序运行时允许确定对象的类 型。MFC扩充了一般C

39、+中运行时类型识别的功能, 当一个类支持MFC的运行时类型识别时,它允许程 序获取对象的信息(如类名、所占存储空间大小及 版本号等)和基类信息。 1. 宏宏RUNTIME_CLASS(class_name): 返回参数class_name所指定类的静态成员变量 class#class_name的指针,该指针指向一个 CRuntimeClass结构。 Visual C+面向对象编程教程第7章 MFC原理与方法 2. 动态支持宏动态支持宏DECLARE_DYNAMIC()和和 IMPLEMENT_DYNAMIC(): 使用动态支持宏能够使CObject派生类的对象具 有基本的类型识别机能,可以通过

40、调用成员函数 CObject:IsKindOf()测试对象与给定类的关系。 3. 动态创建宏动态创建宏DECLARE_DYNCREATE()和和 IMPLEMENT_DYNCREATE(): 动态创建是动态支持的一个超集,除了基本的 类型识别机能,使用动态创建宏能够使CObject的派 生类具有在运行时动态创建对象的功能。 4. 序列化宏序列化宏DECLARE_SERIAL() 和和IMPLEMENT_SERIAL() Visual C+面向对象编程教程第7章 MFC原理与方法 / 在头文件MyClass.h中 class CMyClass : public CObject DECLARE_D

41、YNAMIC(CMyClass) public: void SomeFunction(void); ; Visual C+面向对象编程教程第7章 MFC原理与方法 / 在实现文件MyClass.cpp中 #include MyClass.h IMPLEMENT_DYNAMIC(CMyClass, CObject) void CMyClass:SomeFunction(void) CObject* pObject=new CMyClass; if(pObject-IsKindOf(RUNTIME_CLASS(CMyClass) CMyClass* pMyObject=(CMyClass*) pO

42、bject; AfxMessageBox(MyObject is an object of the class CMyClass); else AfxMessageBox(MyObject is not an object of the class CMyClass); delete pObject; Visual C+面向对象编程教程第7章 MFC原理与方法 跟踪声明和断言在查找程序设计错误时是非常 有用的。跟踪声明可以让程序在运行过程中遇到跟 踪声明时在输出窗口显示指定的信息,而断言使程 序在断言条件不成立时暂停程序的运行。MFC提供 了一些跟踪声明和断言宏用于程序调试,这些宏只 能用于D

43、EBUG版本应用程序的调试状态。 1TRACE()宏语法说明如下: TRACE (); 其中参数是由输出格式和变量等组成 的输出表达式,其格式与函数printf()的参数一样, 它指定调试时要在Output窗口输出的内容。 Visual C+面向对象编程教程第7章 MFC原理与方法 char* szName = “LiMing”; int nAge = 18; TRACE(“Name = %s, Age = %d n”, szName, nAge ); 调试时在Output窗口输出以下内容: Name = LiMing, Age = 18 例例2 设自定义一个CFrameWnd的派生类CMyF

44、rame, 在程序中构建一个与CMyFrame相关联的文档模板 对象,并为构键的文档模板创建框架窗口: CMyFrame* pFrame=(CMyFrame*) AfxGetMainWnd(); ASSERT(pFrame-IsKindOf(RUNTIME_CLASS (CMyFrame); / 判断pFrame的类型 pFrame-DoSomeOperation(); Visual C+面向对象编程教程第7章 MFC原理与方法 7.6.1 CRuntimeClass结构结构 lCRuntimeClass在MFC中是以结构的方式定义,它 含有使用CRuntimeClass结构的类的有关信息,与

45、 CObject类一同实现运行时类型识别RTTI的功能。 CRuntimeClass结构包含了类名、对象所占存储空 间大小及类的版本号等成员变量和动态对象创建、 派生关系判断等成员函数。 l每个从CObject类派生的类都有一个CRuntimeClass 对象同它关联。要使用CRuntimeClass结构,必须 结合使用RUNTIME_CLASS()宏和其它有关运行 时类型识别的MFC宏。 Visual C+面向对象编程教程第7章 MFC原理与方法 7.6.2 CObject类类 l由于MFC中大部分类是从CObject类继承而来的, CObject类描述了几乎所有的MFC类的一些公共特 性,CObject类为程序员提供了对象诊断、运行时 类型识别和序列化等功能。 l对象诊断。MFC提供了两种诊断特性:利用成员 函数AssertValid()进行对象有效性检查,使得类可 以在继续运行前对自己进行正确性检查;利用成 员函数Dump()输出对象的数据成员的值。 l运行时访问类的信息:提供GetRuntimeClass()和 IskindOf()两个成员函数来支

温馨提示

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

评论

0/150

提交评论