MFC宏

DECLARE_DYNCREATE

DECLARE_DYNCREATE( class_name )

参数: class_name 类的实际名字(不用引号括起来)。

说明:

使用DECLARE_DYNCREATE宏可以使每个CObject的派生类的对象具有运行时动态创建的能力。框架利用这种能力来动态创建对象,例如,当它在串行化过程中从磁盘读取对象的时候。文档、视和框架类必须支持动态创建,因为框架需要动态地创建它们。

在类的.H模块中加入DECLARE_DYNCREATE宏,然后在每个需要访问这个类的对象的.CPP模块中包含这个模块。

如果在类声明中包含了DECLARE_DYNCREATE,那么必须在类的实现中包含IMPLEMENT_DYNCREATE宏。

关于DECLARE_DYNCREATE宏的更多信息参见“Visual C++程序员指南”中的“CObject类主题”。

问答:

<<Dissecting   MFC>>章看了一遍,想问:   
    
       1.哪些类要DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC,哪些类要DECLARE_DYNCREATE  / IMPLEMENT_DYNCREATE,哪些类又要BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()呢?不会要靠死记吧,是什么规律?   
    
  2.用Console程序来模仿MFC的动作,如不建立窗口则可以不要CView和CDocument类系吧?   
    
  3.在Persistence相关章节中,如果从某个CArchieve对象中读出的一个类名在内存中没有任何定义或声明的信息,这如何能Dynamic   Create出来呢?(我想是不可能的)

回答1:

声明DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE表明该类的实例可以动态创建。一般从CCmdTarget类继承下来的类都有BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()对消息进行处理   
       2.没有关系。   
       3.通过类名来创建实例这就是动态创建的功能阿,当然前提是你一定要事先在该类里加上了DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE声明,至于怎么创建出来的,书里讲得很清楚吧,我记得是创建了一个数据结构的链表,。。。。

回答2

1.DECLARE_DYNAMIC只需要运行时,就要用这个宏   
  IMPLEMENT_DYNAMIC,支持动态创建,其中包含了对DECLARE_DYNAMIC的支持   
  mfc用到了文档模板,所以,cdocument,cview,cframewnd派生的都需要IMPLEMENT_DYNAMIC   
    
  BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()定义消息映射的宏,派生自ccmdtarget的类都可以用它,(ccmdtarget的字面意义也是处理消息,command   target,深入浅出mfc后面有)   
  2.用Console程序来模仿MFC的动作,如不建立窗口则可以不要CView和CDocument类系吧?   
  用cview和cdocument是为了更清楚的讲解framework,否则就不是模仿mfc了。   
    
  3.类名已保存在磁盘文件中,读取文件,获得类名字符串,再利用动态创建就可以创建了,书的第四部分第一章有详细解释

DECLARE_MESSAGE_MAP()

在一些资料上,有这么一段文字: 
DECLARE_MESSAGE_MAP() 
说明: 
用户程序中的每个CCmdTarget派生类必须提供消息映射以处理消息。在类定义的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定义类成员函数的.CPP文件中,使用BEGIN_MESSAGE_MAP宏,每个用户消息处理函数的宏项下面的列表以及END_MESSAGE_MAP宏。 
注释: 
如果在DECLARE_MESSAGE_MAP之后定义任何一个成员,那么必须为他们指定一个新存取类型(公共的,私有的,保护的)。

我觉得他描述得欠妥,我的理解是:

只要有:只要是CCmdTarget(用于所有能够消息映射的基类)派生类,必有消息映射以处理消息,则在类的说明文件的尾部有DECLARE_MESSAGE_MAP宏,在类的定义文件中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以处理用户消息。

其中BEGIN_MESSAGE_MAP(参数1,参数2) ,参数1为该类的类名,参数2为该类基类的类名。

其中ON_MESSAGE(参数1,参数2),参数1为响应的消息,参数2为该消息对应的处理的函数名。

(以上引自http://www.cnblogs.com/cwbo-win/articles/3398637.html)

时间: 2024-10-29 19:08:11

MFC宏的相关文章

常用MFC宏

最近我在用MFC开发一个智能家居监控平台的软件(用到了MSCOMM串口通信控件),当我通过在一个对话框类A中定义另一个对话框类B的对象访问B的public成员时,提示不可访问.后来经过多天的向朋友求救,终于在一个大神的帮助下找到了解决方案.原来在使用ActiveX控件时会产生一个DECLARE_EVENTSINK_MAP()宏,在此宏之后定义的每一个成员如果不指定一个新的存取类型都会失去其原有的属性.如果在DECLARE_EVENTSINK_MAP()宏(或者其它宏)之后定义任何一个成员,都必须

MFC宏消息处理机制的原理

1.1.在MFC中处理消息的函数是固定的,如afx_msg int OnCreate(LPCREATESTRUCT);这是一个固定的,对应于ON_WM_CREAT()宏.如果改变了函数名,对应的宏就会不认识. 1.2.MyCreate函数,用来响应系统的WM_CREATE消息,这些函数是有固定格式要求的.并且函数名必须和MSDN给定的函数名保持完全一致. 1.3. struct AFX_MSGMAP { const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)(); c

MFC常用的类详细介绍

常用的MFC类 CRuntimeClass结构 在CRuntimeClass结构中定义了类名.对象所占存储空间的大小.类的版本号等成员变量及动态创建对象.派生关系判断等成员函数.每一个从CObject类派生的类都有一个CRuntimeClass结构同它关联,以便完成在运行时得到对象的信息或基类的信息. 要使用CRuntimeClass结构,必须结合使用RUNTIME_CLASS()宏和其他有关运行时类型识别的MFC宏. CObject类 MFC的CObject类为程序员提供了对象诊断.运行时类型

MFC的运行机制 以及 MFC中的DC、CDC、HDC、句柄、设备上下文 [转]

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API.你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的 MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石. 1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装W

从Windows API 到 MFC浅谈

上一篇<一个Demo初识MFC>用一个例程带入对MFC的初探,本篇紧接着上篇,首先对代码进行讲解,然后继续向前进. <一个Demo初识MFC>代码解析 概念一览: MFC提供数百个类,最重要的.也是编写任何VC++应用程序都必不可少的两个类 CWinApp 和 CFrameWnd ,这两个类是编写复杂庞大应用程序的基石. 封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库.这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接

变量命名规则------匈牙利命名规则!

几年以前,Charles Simonyi(他后来成为微软的著名程序员)设计了一种以前缀为基础的命名方法,这种方法后来称为"匈牙利表示法"以记念他.他的思想是根据每个标识符所代表的含义给它一个前缀.微软后来采用了这个思想,给每个标识符一个前缀以说明它的数据类型.因此,整型变量的前缀是n,长整型变量是nl,字符型数组变量是ca,以及字符串(以空类型结尾的字符数组)以sz为前缀.这些名字可能会非常古怪.比如说:lpszFoo表示"Foo"是一个指向以空字符为结尾的字符串的

变量命名规范

原文链接:http://www.cnblogs.com/zhangpengshou/archive/2008/10/19/1314424.html a Array 数组 b BOOL (int) 布尔(整数) by Unsigned Char (Byte) 无符号字符(字节) c Char 字符(字节) cb Count of bytes 字节数 cr Color reference value 颜色(参考)值 cx Count of x (Short) x的集合(短整数) dw DWORD (

C++变量命名规则

转自:http://www.cnblogs.com/finallyliuyu/archive/2010/09/25/1834301.html 浅谈C++变量命名规则 不知道别的公司如何,反正我现在的公司对变量命名并没有一定的规范,唯一要求就是能简单易懂,但是,我想,这个多个程序员,大概每个人都有自己习惯的一套 命名规则吧,不过,要是并不通用的话,大概看别人的程序会很头疼吧,SO 为了别人看偶的程序不至于太头疼,偶决定找个通俗的命名法来参考下,于是,搜到了匈牙利命名法... 匈牙利命名法的来历和介

匈牙利命名法

变量(还包含宏)的命名规则,比較系统和彻底的有 Windows 编程中用到的匈牙利命名法.匈牙利命名法通过在变量名前面加上对应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等.这些符号能够多个同一时候使用,顺序是先m_(成员变量),再指针,再简单数据类型,再其它.比如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量. 有关匈牙利命名法的一点有意思的说明是它的名字的由来.这样的命名技术是由一位能干的 Microsoft 程序猿查尔斯·西蒙尼(Charles Simo