关于CCmdTarget及消息映射

CCmdTarget类直接继承自CObject,主管应用程序架构,其向下直接派生出CWnd,而CWnd是所有控件、框架窗口、对话框、视图类的父类。

CCmdTarget类是可以在里面使用消息映射的类,其派生的所有类都有消息映射函数。能用消息映射的类的基类都必须是CCmdTarget类。

CCmdTarget类的派生类在头文件中都必须提供DECLARE_MESSAGE_MAP()宏,在类的CPP文件中都有相应的BEGIN_MESSAGE_MAP(当前类, 直接父类)和END_MESSAGE_MAP()宏与之对应,这两个宏之间(我称之为宏段)定义的就是在这个类中声明的消息映射宏。消息映射宏有三种: ON_COMMAND(控件ID,响应函数),ON_NOTIFY(通知代码, 控件ID, 响应函数),ON_MESSAGE(消息,响应函数)。

消息映射宏放在哪个类中要看基响应函数定义在哪个类中,消息映射宏中使用的响应函数必须是当前类的成员函数或者是当前类的直接父类(在BEGIN_MESSAGE_MAP括号中出现的两个)的成员函数。如果消息响应函数是在当前类中定义的,那么一般会在头文件中对该函数的声明前加上afx_msg。消息响应函数一般是没有参数列表和返回值的。

ON_NOTIFY(通知代码, 控件ID, 响应函数)中的通知代码是一个NMHDR结构类型的数据或者是一个扩展的NMHDR结构类型(第一个数据成员是NMHDR结构类型的结构类型数据),对于扩展的NMHDR结构类型,由于其第一个数据成员是NMHDR结构类型,因而使用指定可以方便地转换为NMHDR结构类型。

NMHDR结构类型的定义如下:其中的code是个常量数据(不同控件定义的)。

typedef struct tagNMHDR {
                  HWND hwndFrom; 
                  UINT idFrom;
                  UINT code;
} NMHDR;

扩展的NMHDR结构类型中增加的数据会据其所使用的控件不同而有不同的数据。

ON_MESSAGE(消息,响应函数)中的消息是?

DECLARE_MESSAGE_MAP()这个宏里定义了GetThisMessageMap()和GetMessageMap()这两个函数(这两个函数都是在CCmdTarget类中声明定义的),因而可以在类视图中看到这两个函数。在h文件和cpp文件中看不到这两个函数就是DECLARE_MESSAGE_MAP()这个宏就是它俩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值