今天抽空再次看了一下深入浅出MFC,从中又学到了新的东西!
时间有限,很晚了,简单写一下:
MFC中消息的WinMain函数实际上是被编译器自己添加进去的,MFC中我们看不到WinMain函数!
大概的代码如下:
CWinApp theApp;
BOOL AFXAPI AfxWinMain(....)
{
CWinApp * pApp = AfxGetApp();
AfxWinInit(..........);
pApp->InitApplication();
pApp->InitInstance();
nReturnCode = pApp->Run();
AfxWinTerm();
}
在AfxWinInit中,我们可以看到在其中设置了以消息钩子函数
通过调用AfxInitThread()
再调用 SetWindowsHookEx(WH_MSGFILTER, _AfxMsgFilterHook,NULL,::GetCurrentThreadId());
而在InitInstance中在创建主窗口之前,MFC也通过SetWindowsHookEx 设置了一个WH_CBT 类型的钩子
并且他的钩子过程是_AfxCbtFilterHook
这个类型的钩子,当有窗口创建的时候他就会触发这个钩子过程,所以在每个窗口(不论是主窗口还是子窗口) 都会触发这个过程。
在 _AfxCbtFilterHook中,
又通过SubclassWindow讲所有的窗口的过程替换成了AfxWndProc,
这样所有窗口的消息都要经过MFC的消息映射了。很强大!!!!!!