天天看点

MFC 消息映射实现原理

DECLARE_MESSAGE_MAP

BEGIN_MESSAGE_MAP

END_MESSAGE_MAP

这三个宏,实际就是定义并实现了两个函数(一个静态函数GetThisMessageMap,一个虚函数GetMessageMap),

静态函数时属于类的全局函数

-------------------------------

关于GetThisMessageMap函数:

改静态函数内部创建了两个静态成员,第一个静态成员是一个AFX_MSGMAP_ENTRY数组, 里面每个元素记录了{消息号、消息代码、控件ID、需要响应的函数的指针……}, 另一个静态成员是一个AFX_MSGMAP结构类型变量, 该变量记录了一个静态函数地址 (通过这个静态函数就是父类的同名函数,从而可以得到父类的AFX_MSGMAP结构类型变量的地址) 和前面这个静态数组的地址,函数的最后把AFX_MSGMAP结构类型变量的地址返回。

关于GetMessageMap函数:

它是一个虚函数,内部就是调用了静态函数GetThisMessageMap,这样一来,就建立了一个虚表,该虚表中记录了所有父类及自身类中的那个静态函数GetThisMessageMap的地址。