1031 消息从接受到处理,其中参数的传递情况
这是一个单击button的调用栈。
CDlgSmbList::OnButtonSearch() line 118
_AfxDispatchCmdMsg(CCmdTarget * 0x0013fd50 {CDlgSmbList hWnd=0x00010a08}, unsigned int 1028, int 0, void (void)* 0x004012b2 CDlgSmbList::OnButtonSearch(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
CCmdTarget::OnCmdMsg(unsigned int 1028, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
CDialog::OnCmdMsg(unsigned int 1028, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
CWnd::OnCommand(unsigned int 1028, long 68130) line 2099
CWnd::OnWndMsg(unsigned int 273, unsigned int 1028, long 68130, long * 0x0013f0e4) line 1608 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 1028, long 68130) line 1596 + 30 bytes
AfxCallWndProc(CWnd * 0x0013fd50 {CDlgSmbList hWnd=0x00010a08}, HWND__ * 0x00010a08, unsigned int 273, unsigned int 1028, long 68130) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x00010a08, unsigned int 273, unsigned int 1028, long 68130) line 379
1、AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
第一个参数:hWnd 窗口句柄。
CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);//根据窗口句柄查窗口指针。
{CDlgSmbList hWnd=0x00010a08} pWnd指向对话框。
第二个参数:nMsg 消息号。
第三个参数:wParam,依据高低字传递两个实参。
第四个参数:lParam,通常是一个指向结构体的指针,更多的实参得以扩展。
2、LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
WPARAM wParam = 0, LPARAM lParam = 0)
与AfxWndProc的参数只多一个“冗余”的pWnd。
3、CWnd::WindowProc (UINT message, WPARAM wParam, LPARAM lParam)
削减掉只剩下3个,通知调用栈的值可以看出,就是自AfxWndProc而来的3个实参。
4、CWnd::OnWndMsg (UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
加了一个出参。
5、CWnd::OnCommand (WPARAM wParam, LPARAM lParam)
更精简了。原因是pWnd已经是调用函数的主语,不需要再通过参数体现。
6、CDialog::OnCmdMsg (UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
多了两个参数,由于实际在这个栈里面,pExtra和pHandlerInfo都是NULL,其含义还不确定。
7、CCmdTarget::OnCmdMsg (UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
是上面虚函数的原型,参数自然一样。
8、BOOL AFXAPI _AfxDispatchCmdMsg(CCmdTarget* pTarget, UINT nID, int nCode,
AFX_PMSG pfn, void* pExtra, UINT nSig, AFX_CMDHANDLERINFO* pHandlerInfo)
多了几个参数,
第一,pTarget,实际上填入了this,还是指向Dlg的,其值就是AfxCallWndProc的参数CWnd* pWnd。
第二,AFX_PMSG pfn
第三,UINT nSig
这两个都是从消息映射链表中来的。
9、CDlgSmbList::OnButtonSearch()
Button按下时没有传入任何参数。