- 浏览: 45978 次
- 性别:
- 来自: 河北
最新评论
在C和C++语言中都能够使用宏,宏就是用宏定义指令#define定义一个标识符,用它来表示一个字符串或一段源代码。MFC宏作为MFC类库的一个组成部分在MFC应用程序中经常出现。MFC宏在路径"...\Microsoft Visual Studio\VC98\MFC\Include"下的Afxwin.h、Afx.h及Afxmsg_.h等MFC头文件中分别进行了定义。
(1)常用的MFC宏
NFC提供的宏有很多,常用的MFC宏包括消息映射宏、运行时类型识别宏、序列化宏、调试宏和异常宏等。表1列出了编程时经常遇到的MFC宏。读者也许知道了一些MFC宏的用法,但未必认识它们的庐山真面目。要想真正了解MFC的内部机制和熟练运用MFC,必须掌握MFC宏的基本原理和使用方法。
表1 常见的MFC宏
(2)有关运行时类型识别的宏
运行时类型识别(runtime type information,RTTI)是指在程序运行时能够确定一个对象的类型。MFC扩充了一般C++中运行时类型识别的功能,当一个类支持MFC的运行时类型识别功能时,它允许程序获取对象的信息(如类名、所占存储空间大小及版本号等)和基类信息(runtime class informtation,RTCI)。
1.运行时基础宏:RUNTIME_CLASS(class_name)
RUNTIME_CLASS宏返回参数class_name所指定类的静态成员变量class##class_name的指针,该指针指向一个CRuntime结构。宏定义如下:
#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
程序能够利用RUNTIME_CLASS宏实时创建类的实例。为了让这个宏起作用,定义的类必须是类CObject的派生类,并且在派生类的定义中必须使用宏DECLARE_DYNAMIC、DECLARE_DYNCREATE或DECLARE_SERIAL,在派生类的实现源文件中使用宏IMPLEMENT_DYNAMIC、IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL。这三个宏使MFC类及其派生类具有三个不同等级的功能。
2.动态支持宏:DECLARE_DYNAMIC(class_name)和
IMPELMENT_DYNAMIC(class_name,base_class_name)
使用动态支持宏能够使CObject派生类的对象具有基本的类型识别机能,可以通过调用成员函数CObject::IsKindOf(ClassName)测试对象与给定类Class_Name的关系。
DECLARE_DYNAMIC()宏定义如下:
#define DECLARE_DYNAMIC(class_name)\ public:\ static const AFX_DATA CRuntimeClass class##class_name;\ virtual CRuntimeClass* GetRuntimeClass() const;\
例1 定义一个类MyClass,使用RUNTIME_CLASS()宏的基本对象识别功能。
//在头文件MyClass.h class CMyClass:public CObject { DECLARE_DYNAMIC(CMyClass) public: void someFunction(void); };
//在实现源文件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*)pObject; AfxMessageBox("MyObject is an object of the class CMyClass"); } else AfxMessageBox("MyObject is not an object of the class CMyClass"); delete pObject; }
3.动态创建宏:DECLARE_DYNCREATE(class_name)和
IMPLEMENT_DYNCREATE(class_name,base_class_name)
动态创建是动态支持的一个超集,除了基本的类型识别机能,使用动态创建宏能够使CObject类的派生类具有运行时动态创建对象的功能。注意,支持动态创建的类必须有一个默认的不带参数的构造函数,用于一个稳定的对象。MFC应用程序框架利用这个机能动态创建新的对象。例如,当序列化期间从磁盘读取一个对象时,应用程序框架将利用文档类、视图类和框类的动态创建功能业动态创建它们的运行时对象。在MFC应用程序框架中,向导为MFC派生类自动添加了这两个动态创建宏。
4.序列化:DECLARE_SERIAL()和IMPLEMENT_SERIAL()
序列化是动态支持和动态创建的一个超集,除了基本的类别识别和动态创建机能,使用序列化宏能够使CObject类的派生类具有实现对象持久性的序列化功能。
(3)MFC调试宏
1.TRACE跟踪声明宏
TRACE()宏语法说明如下:
TRACE(<输出格式>,<表达式>)
其中的参数是由输出格式和表达式组成,其形式与函数printf()的参数一样。TRACE宏的功能是在调试运行时把表达式的值输出到Output调试窗口。TRACE宏只在MFC应用程序Debug版的调试运行状态下才起作用,并且必须保证在Developer Studio中的Enable tracing设置,这需要执行Tools|MFC Tracer命令。
例2 对于以下代码:
char* szName="LiMing"; int nAge=18; TRACE("Name=%s,Age=%",szName,nAge);
调试运行时在Ouput窗口将输出以下内容:
Name=LiMing,Age=18
2.ASSERT断言宏
ASSERT(<表达式>)
当执行该宏时,如果表达式为真,则程序继续执行;否则暂停程序的运行,并弹出一个对话框,告诉用户程序暂停运行的行及所在文件的信息。用户可选择终止运行、调试程序或继续运行。例如,在视图派生类的成员函数GetDocument()中,MFC使用了ASSERT()宏判断当前文档是否是运行时类的对象。
例3 设已自定义一个名为CMyFrame的框架窗口类,它也是CFrameWnd的派生类。在程序中构建一个与CMyFrame相关联的文档模板对象,并为构建的文档模板创建框架窗口。然后可以编写如下代码使用这个框架窗口。
CMyFrame* pFrame=(CMyFrame*)AfxGetMainWnd(); ASSERT(pFrame->IsKindOf(RUNTIME_CLASS(CMyFrame))); //判断pFrame的类型 pFrame->DoSomeOperation(); //调用成员函数完成某些操作
AfxGetMainWnd()是一个全局函数,返回值向应用程序主窗口的指针,类型为CWnd*,因此必须对它进行强制类型转换。但如何知道是否转换成功?CMyFrame类也是CObject的派生类,可以结合成员函数IsKindOf()使用ASSERT()宏来检查pFrame的类型。在pFrame->DoSomeOperation()语句之前插入ASSERT()宏,就可以在运行机制时做类型检查,当类型不匹配时,引发一个断方,可以中断程序执行。
ASSERT宏只在Debug版本中才起作用,它在Release版本中是不会被编译的,在Release版本中可以使用VERIFY宏。VERIFY宏与ASSERT宏在Debug版本中的作用一致,区别在于在Release版本中VERIFY宏仍然有效,它会对参数表达式求值,但不管结果如何都不会暂停程序的运行。
为了避免给程序带来不良的后果,使用ASSERT宏时必须保证参数表达式中不能有函数调用语句,因为ASSERT宏中的函数调用语句在Release版本中根本不在。出现这种情况时,可以使用VERIFY宏取代ASSERT宏。
3.ASSERT_VALID断言有效宏
ASSERT_VALID()宏语法说明如下:
ASSERT_VALID(<指针>)
ASSERT_VALID宏用于检查指针和对象的有效性。对于一般指针,只检查指针是否为空。对于MFC类对象指针,通过调用CObject类的成员函数AssertValid()判断对象的舍法性。ASSERT_VALID宏提示指针或对象无效的方式与ASSERT宏一样,弹出一个信息对话框。ASSERT_VALID宏也是只在Debug版本中才起作用。
发表评论
-
MFC的打印
2009-05-24 17:05 0虽然Windows通过 ... -
ActiveX控件
2009-05-23 15:49 6715ActiveX是Microsoft提出的使用组件对 ... -
多线程
2009-05-22 18:57 0Windows对CPU的管理的采取时间片分配的方式 ... -
动态链接库DLL
2009-05-22 14:38 0为了提高系统 ... -
异常处理
2009-05-21 19:06 2123异常(exception)是指在程序运行过程中发生 ... -
MFC ODBC数据库类
2009-05-20 19:44 74941.ODBC概述 ... -
对话框高级编程---公共控件之四(树视控件)
2009-05-19 21:45 2377树视(tree view)控 ... -
对话框高级编程---公共控件之四(列表视控件)
2009-05-19 14:01 0列表视(list view)控件也称列表控件,属 ... -
对话框高级编程---公共控件之三(图像列表)
2009-05-18 21:22 0图像列表(image list)是一个由一些大小相同 ... -
对话框高级编程---公共控件之二(标签控件和属性表)
2009-05-18 20:33 35571.标签控件 标签(tab)控件也 ... -
对话框高级编程---公共控件之一(旋转按钮、滑块和进度条)
2009-05-18 11:09 01.旋转按钮 ... -
对话框高级编程---通用对话框
2009-05-17 21:17 18221.通用对话框概 ... -
对话框高级编程---非模态对话框
2009-05-16 21:39 0尽管不同对话 ... -
图形处理---位图、图标和光标
2009-05-16 20:33 22121.位图 例1 编写一个应用程序MyB ... -
图形处理---位图,图标和光标
2009-05-16 20:16 01.位图 例1 编写一个应用程序MyBMP ... -
图形处理---位图、图标和光标
2009-05-16 19:58 01.位图 例1 编写一个应用程序MyBMP ... -
文本与字体
2009-05-16 16:23 01.绘制文本 以图形方式进行文本的输 ... -
图形处理---基本几何图形的绘制
2009-05-15 21:27 0获取设备环境、设置绘图属性和选择GDI绘图对象后,就 ... -
图形处理---画笔和画刷
2009-05-15 17:30 0进行绘图除了需 ... -
图形处理---颜色的设置
2009-05-15 16:08 0在绘制图形时,颜色是一个需要考虑的因素。Window ...
相关推荐
宏定义在MFC中扮演着重要的角色,它们提供了代码复用、简化编程、以及在编译时进行条件检查等能力。本文将深入探讨MFC中的宏定义,帮助开发者更好地理解和利用这些工具。 首先,我们来看MFC中的类宏。MFC中有很多...
MFC宏定义是C++编程中一个重要的概念,尤其对于构建基于Windows的应用程序来说,它们能够简化代码、提高可读性和效率。以下是对MFC宏定义的详细解释。 1. **宏定义的基本形式** 在C++中,宏定义通常使用`#define`...
### MFC宏定义详解 #### 一、AND_CATCH宏 **定义与作用:** - **AND_CATCH**: 此宏用于捕捉异常处理中的多个异常情况。它接收两个参数:`exception_class` 和 `exception_object_pointer_name`。 - **功能**: 当...
包括:MFC宏定义详解.txt、 MFC类库详解.chm、 MFC深入浅出完整电子版.chm、 新编win32API大全《WIN32API.chm》(Win32API.chm)
### Visual C++ MFC中常用宏的含义 #### AN_D_CATCH **宏定义:** ```cpp AN_D_CATCH(exception_class, exception_object_pointer_name) ``` **功能说明:** `AN_D_CATCH`宏被设计用于处理MFC中特定类型的异常...
在Visual C++的MFC(Microsoft Foundation Classes)库中,宏是经常被使用的工具,用于简化编程和增强代码的可读性。以下是标题和描述中提及的一些重要宏的详细解释: 1. **AND_CATCH**: 和`CATCH`宏一起使用,`AND...
该MFC参考含盖了Microsoft基本类库中的类、全局函数、... · MFC宏和全局 详细解说MFC库中的每个宏、全局函数、全局变量。 · 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。
4. **MFC宏**:MFC宏是预定义的代码片段,用于简化类定义、消息映射和其他常见任务。例如,DECLARE_DYNAMIC用于声明类动态创建的能力,ON_MESSAGE宏用于添加处理自定义消息的函数。 在深入学习MFC时,通常会涉及到...
以下是一些常用的MFC宏及其详细解释: 1. **AND_CATCH** 和 **CATCH**: 这两个宏用于异常处理。`CATCH`定义了一个代码块,当在`TRY`块中发生异常时,这个块会被执行。`AND_CATCH`则用于捕获不同类型的异常,它允许...
也许因为自己薄弱的英语基础,成为你研发路上的绊...· MFC宏和全局 详细解说MFC库中的每个宏、全局函数、全局变量。 · 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。
**MFC宏**是预定义的代码片段,它们在编译时展开,提供了许多实用的功能。例如,`DECLARE_DYNAMIC`和`IMPLEMENT_DYNAMIC`用于支持运行时类型信息;`BEGIN_MESSAGE_MAP`和`END_MESSAGE_MAP`用于定义消息映射,将消息...
标题中的"mfc里面的140种颜色宏"指的是MFC提供的预定义宏,这些宏代表了Windows操作系统中常见的140种颜色。这些颜色宏使得开发者无需记住具体的RGB值,就能直接在代码中使用预定义的颜色,从而提高开发效率。 首先...
该MFC参考含盖了Microsoft基本类库中的类、全局函数、...· MFC宏和全局 详细解说MFC库中的每个宏、全局函数、全局变量。 · 结构、风格、回调函数和消息映射 详细解说MFC库中的各个结构、风格、回调函数和消息映射。
5. 实现`IDispatch`接口所需的其他MFC宏,如`IMPLEMENT_DYNAMIC`、`BEGIN_OLEFACTORY_MAP`等。 了解并掌握这些知识点,你就可以在MFC环境中有效地实现和使用`IDispatch`接口,从而创建能够被脚本语言或其他自动化...
**MFC宏定义** MFC中的宏定义是其强大功能的关键之一。例如: 1. **DECLARE_DYNAMIC** 和 **IMPLEMENT_DYNAMIC** 用于实现运行时类型信息,支持多态性。 2. **BEGIN_MESSAGE_MAP**、**END_MESSAGE_MAP** 和 ON_...
MFC宏和全局在MFC编程中也起着至关重要的作用: 1. 宏:如DECLARE_DYNAMIC、DECLARE_DYNCREATE、IMPLEMENT_DYNAMIC等,用于支持运行时类型识别和动态创建,使得在运行时可以获取对象的实际类型。 2. DECLARE_...
MFC类库详解 chm,该MFC参考含盖了Microsoft基本类库...· MFC宏和全局 详细解说MFC库中的每个宏、全局函数、全局变量。 · 结构、风格、回 详细解说MFC库中的各个结构、风格、回调函数和消 调函数和消息映射 息映射。
- **MFC宏与全局函数**:探讨MFC中的宏定义及其使用场景。 - **第6章 MFC程序的生死因果** - **MFC程序结构**:解释MFC程序的基本构成部分。 - **程序生命周期**:分析MFC程序从启动到关闭的过程。 - **消息...