• MFC宏


    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)

  • 相关阅读:
    全网最全微服务架构—Spring Cloud详解,没有比这更详细的了!
    基于 Spring Cloud 的微服务架构实践指南(上)
    如何在一分钟内搞定面试官?
    成功面试宝典Java
    Spring Boot 自动装配流程
    C语言浮点数
    C语言字符串
    C语言数据类型转换
    C语言结构体
    C语言格式化输出
  • 原文地址:https://www.cnblogs.com/perfy/p/5072802.html
Copyright © 2020-2023  润新知