• DECLARE_MESSAGE_MAP / BEGIN_MESSAGE_MAP()用法


    DECLARE_MESSAGE_MAP( ) 

    说明: 
    你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息。在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏。然后,在实现了类成员函数的.CPP文件中加入BEGIN_MESSAGE_MAP宏,再加入每个消息处理函数的宏入口,最后使用END_MESSAGE_MAP宏。 
    注意: 
    如果你在DECLARE_MESSAGE_MAP之后定义了成员,那么你必须为它们指定新的访问类型(public,private 或protected)。 
    关于消息映射和DECLARE_MESSAGE_MAP宏的更多信息参见“Visual C++程序员指南”中的“消息处理”和“映射主题”。 

    示例: 
    // DECLARE_MESSAGE_MAP的例子 
    class CMyWnd : public CFrameWnd 

    // 成员声明 
    DECLARE_MESSAGE_MAP( ) 

    };

    说明: 

    DECLARE_MESSAGE_MAP()宏的作用是向类中添加消息映射必要的结构体和函数声明,只需要添加一次,放在什么位置并不重要,就如同类里其他普通函数的声明可以相互交换顺序一样。 函数的修饰符也是可以自己决定的,遵循一般原则。比如你需要在类外部也可以调用该消息响应函数,就可以定义成public的。
    ======================================================
    在一些资料上,有这么一段文字: 
    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为该消息对应的处理的函数名。




    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    BEGIN_MESSAGE_MAP()

    1BEGIN_MESSAGE_MAP(CpassApp, CWinApp)
    2    ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    3END_MESSAGE_MAP()

    这些都是宏定义,不是函数。 
    在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加你的消息响应函数,为每个消息处理函数加入一个入口


    BEGIN_MESSAGE_MAP( theClass, baseClass )

    参数:
    theClass 指定消息映射所属的类的名字。
    baseClass 指定theClass的基类的名字。

    说明:
    使用BEGIN_MESSAGE_MAP宏开始你的消息映射的定义。
    在你的类的成员函数的实现文件(.CPP)中,使用BEGIN_MESSAGE_MAP宏开始消息映射,然后为每个消息处理函数加入一个入口,最后用END_MESSAGE_MAP宏结束消息映射。

    每个消息映射入口的格式如下:
      ON_Notification(id, memberFxn)
      其中id指定了发送通知的控件的子窗口的ID,而memberFxn指定了处理该通知的父对象中的成员函数名。
      父对象的函数原型格式如下:
      afx_msg void memberFxn( );

      可能的消息映射入口如下:
    映射入口 何时向父对象发送消息
    ON_BN_CLICKED   用户单击按钮时
    ON_BN_DOUBLECLICKED 用户双击按钮时

    例如:
    1BEGIN_MESSAGE_MAP(CpassDlg, CDialog)
    2    ON_WM_SYSCOMMAND()
    3    ON_WM_PAINT()
    4    ON_WM_QUERYDRAGICON()
    5    //}}AFX_MSG_MAP
    6    ON_BN_CLICKED(IDOK, OnOK)
    7    ON_BN_CLICKED(IDCANCEL, OnExit)
    8END_MESSAGE_MAP()

    void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

    这个函数响应系统控制菜单的命令.(即左上角图标处)。

    OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.

    另外:

    DoDataExchange:当UpdateData时候

    OnInitDialog:对话框类已经构造,但是对话框还没有显示出来的时候

    OnQueryDragIcon:The framework calls this member function by a minimized (iconic) window that does not have an icon defined for its class. The system makes this call to obtain the cursor to display while the user drags the minimized window. 

  • 相关阅读:
    iOS开发之多线程技术(NSThread、OperationQueue、GCD)
    数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)
    iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
    iOS开发之使用XMPPFramework实现即时通信(三)
    iOS开发之调用系统打电话发短信接口以及程序内发短信
    iOS开发之抽屉效果实现
    iOS开发之WebView
    iOS开发之地图与定位
    iOS开发之使用XMPPFramework实现即时通信(二)
    iOS开发之使用XMPPFramework实现即时通信(一)
  • 原文地址:https://www.cnblogs.com/liangjq/p/4462926.html
Copyright © 2020-2023  润新知