今天在看<深入浅出MFC>的时候, 有一个小问题困扰了我很长时间.书中写到在CreateWindowEx函数中会发出WM_CREATE消息, 之后会在CmainFrame::OnCreate中处理. 我突然想到, 在CreateWindowEx返回之前,WM_CREATE能被处理吗?如果能处理,那么此时岂不是有另外一个线程(非主线程)在处理消息? 如果不能被处理,那么此时发出WM_CREATE消息的意义何在?(还要等到函数返回,而返回后Create过程应该已经结束了).
其实答案非常的简单(如果我没分析错的话), 但是在网上搜寻答案的时候真是花样百出,个人觉得比较靠谱的答案(也是对我有启发的答案)是这个:
http://www.debugease.com/vc/2007523.html
其中最后一个说法应该是正确的, 也就是说, 在CreateWindowEx的时直接调用了WndProc来处理WM_CREATE而不是通过SendMessage或者函数返回之类.
结论很简单, 重要的是思考和分析过程中的收获, 现记录如下.
试验程序使用的是MDI, 因为框架结构比较清晰.
从AfxWinMain开始, 一路调用到InitInstance, 之后是CframeWnd::LoadFrame,在这个函数中将一路进行到CWnd::CreateEx->AfxCtxCreateWindowEx.(这部分都是主线程在处理).之后WM_CREATE发送, 实际上是CreateWindowEx发送, 但是可能我工程设置的不太对,这里跟踪不到了.
对于WM_CREATE的处理, 首先, 我想到的是有其他线程在处理消息(显然这与MFC的设计相违背, 因为消息处理是在窗口过程函数中,也就是主线程中),通过设置断点发现,在调用AfxCtxCreateWindowEx之后, 立刻就会跳转到OnCreat