WM_CREATE消息的处理过程

本文探讨了在MFC中CreateWindowEx函数如何处理WM_CREATE消息。通过分析源码和实验,作者发现WM_CREATE并非通过消息队列而是直接调用WndProc进行处理,整个过程都在主线程中顺序执行。这一发现与MSDN文档的描述有所出入,引发作者对Windows消息处理机制的深入思考。
摘要由CSDN通过智能技术生成

今天在看<深入浅出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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值