1,DECLARE_MESSAGE_MAP:在头文件中声明源文件中所含有的消息映射
2,BEGIN_MESSAGE_MAP:标记源文件消息映射的开始
3,END_MESSAGE_MA:标记源文件消息映射的结束
4,ON_COMMAND:将特定命令的处理委派给类的一个成员函数
5,ON_CONTROL:映射一个函数到一个定制控制通知消息,该定制消息是从一个控制发送父窗口的消息
6,ON_CONTROL_REFLECT:映射一个父窗口反射回控制的通知消息
7,ON_CONTROL_RANGE:将一个控制ID的范围映射到一个消息处理函数
8,ON_MESSAGE:将一个用户自定义消息映射到一消息处理函数
9,ON_NOTIFY:映射一个控制消息到一个函数
10,ON_NOTIFY_RANGE:映射一个控制ID范围内的控制消息到一个函数
11,ON_NOTIFY_EX:映射一个控制消息到一个函数,该成员函数返回FALSE或TRUE来表明通知是否应被传送到一下对象以进行其他反应
12,ON_NOTIFY_EX_RANGE:映射一个控制ID范围内的消息到一个函数,该成员函数返回FALSE或TRUE来表明通知是否应被传送到一下对象以进行其他反应
13,ON_NOTIFY_REFLECT:映射一个控制消息到一个函数,该消息将会被控制的父窗口反射回来
14,ON_REGISTERED_MESSAGE:映射一个惟一的消息到一个将处理该注册消息的函数上.该消息是由RegisterWindowMessage()函数注册的
15,ON_UPDATE_COMMAND_UI:映射一个函数来处理用户接口更新命令消息
16,ON_UPDATE_COMMAND_UI_RANGE:映射一个命令ID的范围到一个更新消息处理函数

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)

MFC宏的更多相关文章

  1. MFC宏常识

    1.宏就是用宏定义指令#define定义一个标识符,用它来表示一个字符串或一段源代码. MFC宏作为MFC类库的一个组成部分在MFC应用程序中经常出现. MFC宏在路径 ".../Micro ...

  2. 常用MFC宏

    最近我在用MFC开发一个智能家居监控平台的软件(用到了MSCOMM串口通信控件),当我通过在一个对话框类A中定义另一个对话框类B的对象访问B的public成员时,提示不可访问.后来经过多天的向朋友求救 ...

  3. MFC宏—DECLARE_DYNCREATE

    DECLARE_DYNCREATE( class_name ) 参数: class_name 类的实际名字(不用引号括起来). 说明: 使用DECLARE_DYNCREATE宏可以使每个CObject ...

  4. MFC如何添加系统消息处理函数?

    http://zhidao.baidu.com/question/318026804.html 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成 ...

  5. MFC 总体理解

    在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用 ...

  6. MFC命名规范

    属性部分 全局变量:g_ 常量:c_ c++类成员变量:m_ 静态变量:s_ 类型部分 指针:p 函数:fn 无效:v 句柄:h 长整型:l 布尔:b 浮点型(有时也指文件):f 双字:dw 字符串: ...

  7. 深入浅出MFC——MFC六大关键技术仿真(二)

    1. 仿真MFC目的:以MFC为例,学习application framework的内部运行.MFC六大关键技术: (1)MFC程序的初始化过程 (2)RTTI(Runtime Type Inform ...

  8. MFC异常处理的问题

    参考文献:http://technet.microsoft.com/zh-cn/library/t078xe4f(v=vs.85).aspx MFC中异常处理的语法和语义构建在标准C++异常处理语法和 ...

  9. MFC类别概述

    MFC 类别主要可分为下列数大群组: ■ General Purpose classes - 提供字符串类别.数据处理类别(如数组与串行),异 常情况处理类别.文件类别...等等. ■ Windows ...

随机推荐

  1. centos7 安装后需要做的事情

    安装centos 7 系统之后要做的几件事 #修改主机名 hostnamectl --static set-hostname xd-1 vim /etc/hosts127.0.0.1 xd-1x.x. ...

  2. jquery 取子节点及当前节点属性值

    分享下jquery取子节点及当前节点属性值的方法. <li class="menulink"><a href="#" rel="ex ...

  3. 服务端 https和SSL

    String keyStoreFilePassword = System .getProperty("keystore.file.password"); /usr/java/jdk ...

  4. ElasticSearch + xpack 使用

    ElasticSearch 是一个高可用开源全文检索和分析组件.提供存储服务,搜索服务,大数据准实时分析等.一般用于提供一些提供复杂搜索的应.我们为什么要选择 ElasticSearch ?因为它是一 ...

  5. ssl与tls的差别

    1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0便 用的版 本号为SSLv3.1. 2) 报文鉴别码:SSLv3.0和TLS的MAC算法的范围不同,但两者的安全层度 ...

  6. zabbix 对/etc/ssh/sshd_config文件的监控 但status为unknowen

    原因为该文件没有被访问的权限: # ll /etc/ssh/sshd_config -rw------- root root Apr : /etc/ssh/sshd_config 授权后再看: [ro ...

  7. VS注释与取消注释快捷键

    最近在使用VS2010开发ASP.Net,突然发现想全部注释时找不到注释的快捷键,网上查了下,原来很简单,只是需要使用组合键. 注释:        先CTRL+K,然后CTRL+C 取消注释: 先C ...

  8. linux命令(39):shell 打印偶数行,奇数行 ,行号

    awk 命令: 1. 打印行号和内容: awk '{print NR":"$0}' 2. 输出:偶数行和奇数行到文件 awk '{print $0.txt > NR%2.tx ...

  9. 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述

    悲观锁 悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据: 乐观锁 乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务 应用程序上使用 ...

  10. (原)docker安装

    2018直接看这里: https://docs.docker.com/cs-engine/1.12/#install-on-ubuntu-1404-lts-or-1604-lts 以下为原文: 网上的 ...