MFC消息处理调用过程

1.窗口创建的时候调用CWnd::CreateEx()
CWnd::CreateEx()
-->AfxHookWindowCreate()  //安装一个WH_CBT钩子
-->_AfxCbtFilterHook()  //::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook, NULL, ::GetCurrentThreadId());

2.钩子安装成功以后,窗口有以下行为都将调用钩子设置函数_AfxCbtFilterHook()
a.窗口激活(HCBT_ACTIVATE)
b.产生或销毁一个窗口(HCBT_CREATEWND,HCBT_DESTROYWND)
c.最小化或最大化窗口时(HCBT_MINMAX)
d.移动窗口或改变窗口尺寸(HCBT_MOVESIZE)
e.来自系统菜单的系统命令(HCBT_SYSTEMCOMMAND)
f.从系统队列中移去一个鼠标或键盘消息(HCBT_KEYSKIPPED,HCBT_CLICKSKIPPED)

3.窗口有上述行为都将调用钩子函数_AfxCbtFilterHook()

_AfxCbtFilterHook()-->AfxGetAfxWndProc()-->AfxWndProc()-->AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam)-->CWnd::WindowProc(nMsg, wParam, lParam);

4.CWnd::WindowProc(nMsg, wParam, lParam); //这一步开始进入mfc类(CWnd)的窗口过程
 CWnd::WindowProc()内部调用OnWndMsg()函数,而OnWndMsg()函数在内部又调用OnCommand()或OnNotify()等虚函数。

5.因为CWnd::OnCommand()、OnNotify()、OnCmdMsg()等等函数都是虚函数,所以它的子类如CFrameWnd,CView,CDocument,CMDIFrameWnd,CSplitterWnd,CPropertyySheet,COlePropertyPage等等子多次重写覆盖,形成多个消息处理路径分支。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值