网络编程实用教程第二版_第4章.pptVIP

  • 0
  • 0
  • 约8.66千字
  • 约 54页
  • 2019-09-10 发布于辽宁
  • 举报
4.3 CObject类 CObject是大多数MFC类的根类或基类。CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等。MFC从CObject派生出许多类,具备其中的一个或者多个特性。程序员也可以从CObject类派生出自己的类,利用CObject类的这些特性。 4.3.1 CObject类的定义 CObject定义了一个CRuntimeClass类型的静态成员变量 , 还定义了几组函数:构造函数和析构函数类;诊断函数;与运行时类信息相关的函数;与串行化相关的函数 其中,一个静态函数: _GetBaseClass;五个虚拟函数:析构函数、GetRuntimeClass、Serialize、AssertValid、Dump。这些虚拟函数,在CObject的派生类中应该有更具体的实现。必要的话,派生类实现它们时可能要求先调用基类的实现, 静态成员变量 classCObject和相关函数实现了对CObjet特性的支持。 4.3.2 CObject类的特性 1.对运行时类信息的支持 该特性用于在运行时确定一个对象是否属于一特定类(是该类的实例),或者从一个特定类派生来的,CObject提供IsKindOf函数来实现这个功能。 从CObject派生的类要具有这样的特性,需要: (1)定义该类时,在类说明中使用 DECLARE_DYNAMIC(CLASSNMAE)宏; (2)在类的实现文件中使用 IMPLEMENT_DYNAMIC(CLASSNAME,BASECLASS)宏。 2.对动态创建的支持 前面提到了动态创建的概念,就是运行时创建指定类的实例。在MFC中大量使用,如前所述框架窗口对象、视对象,还有文档对象都需要由文档模板类(CDocTemplate)对象来动态的创建。 从CObject派生的类要具有动态创建的功能,需要: (1)定义该类时,在类说明中使用DECLARE_DYNCREATE(CLASSNMAE)宏; (2)定义一个不带参数的构造函数(默认构造函数); (3)在类的实现文件中使用IMPLEMENT_DYNCREATE(CLASSNAME,BASECLASS)宏; (4)使用时先通过宏RUNTIME_CLASS得到类的RunTime信息,然后使用CRuntimeClass的成员函数CreateObject创建一个该类的实例。 3.对序列化的支持 “序列化”就是把对象内容存入一个文件或从一个文件中读取对象内容的过程。从CObject派生的类要具有序列化的功能,需要: (1)定义该类时,在类说明中使用DECLARE_SERIAL(CLASSNMAE)宏; (2)定义一个不带参数的构造函数(默认构造函数); (3)在类的实现文件中使用IMPLEMENT_SERIAL(CLASSNAME,BASECLASS)宏; (4)覆盖Serialize成员函数。(如果直接调用Serialize函数进行序列化读写,可以省略前面三步。) 对运行时类信息的支持、动态创建的支持、串行化的支持层(不包括直接调用Serailize实现序列化),这三种功能的层次依次升高。如果对后面的功能支持,必定对前面的功能支持。支持动态创建的话,必定支持运行时类信息;支持序列化,必定支持前面的两个功能,因为它们的声明和实现都是后者包含前者。 4.4 消息映射的实现 Windows系统将Windows应用程序的输入事件转换为消息,并将消息发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。 1.消息的分类 可以从消息的发送途径和消息的来源两方面对消息分类: (1)队列消息和非队列消息 从消息的发送途径上,可将消息分为队列消息和非队列消息。队列消息送到系统消息队列,然后送到线程消息队列;非队列消息直接送给目的窗口过程。 Windows系统维护着一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。 (2)系统消息和应用程序消息 从消息的来源,可将消息分为系统定义的消息和应用程序定义的消息。 系统消息ID的范围是从0到WM_USER-1,或从0X80000到0XBFFFF;应用程序消息ID的范围是从WM_USER(0X0400)到0X7FFF,或从0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他

文档评论(0)

1亿VIP精品文档

相关文档