您的位置:首页 > 其它

消息定义结构详解

2013-09-13 09:54 316 查看
#define ON_WM_CREATE() \

{

WM_CREATE, 0, 0, 0, AfxSig_is, \

(AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))OnCreate \

},

WM_CREATE 是消息ID。后面3个0是针对不同的消息的。至于AfxSig_is么,说起来话就长了,还要往后看。

因为所有的消息最终要转换成函数指针,就是这个看上去很恐怖的

(AFX_PMSG)(AFX_PMSGW)(int (AFX_MSG_CALL CWnd::*)(LPCREATESTRUCT))OnCreate

实际上是把 一个CWnd类中的参数为(LPCREATESTRUCT),返回值为int的函数的函数指针进行强制类型转换,转换成AFX_PMSG,因为这些指针最终都要放到下面的结构中:

struct AFX_MSGMAP_ENTRY

{

UINT nMessage; // windows message

UINT nCode; // control code or WM_NOTIFY code

UINT nID; // control ID (or 0 for windows messages)

UINT nLastID; // used for entries specifying a range of control id's

UINT_PTR nSig; // signature type (action) or pointer to message #

AFX_PMSG pfn; // routine to call (or special value)

};

看到了吧。

因为pfn指向的函数的参数是不同的,因此需要设定一个标志,来指示FrameWork传什么参数进取,AfxSig_is就是干这个用的,实际上是返回值是int,参数是LPTSTR。再真正调用的时候,还要将LPTSTR转换成LPCREATESTRUCT,这一步编译器作了,其实就是一个32位地址,指向谁都一样。

lResult = (this->*mmf.pfn_i_s)(reinterpret_cast<LPTSTR>(lParam));

在SDK中,这个lParam中记录的就是类型为 CREATESTRUCT 的变量的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐