Agn*_*ian 7 winapi windows-messages
我以前认为WM_CREATE是窗口收到的第一条消息.但是,在顶级窗口上测试此假设时,结果却是错误的.在我的测试中,WM_MINMAXINFO显示为第一条消息.
那么,窗口保证收到的第一条消息是什么?
gav*_*inb 15
WM_NCCREATE实际上是您的窗口将收到的第一条消息,它将在之前到达WM_CREATE.它与创建非客户区域(例如标题栏,系统菜单等)有关,因此也与NC前缀有关.
WM_GETMINMAXINFO在窗口大小/位置发生变化之前发送,并且可能在之前到达WM_CREATE(有关详细信息,请参阅下文).
该WM_CREATE消息之前发送CreateWindow()的回报,这样就可以保证每个窗口初始化已经由点执行.您的窗口过程将WM_CREATE在创建窗口后但在窗口变为可见(WM_SHOWWINDOW)之前收到.
实际上,MSDN文档中存在一个有趣的不一致 - 创建消息似乎取决于您是否调用,CreateWindow()或者CreateWindowEx()它没有指定消息必须按调度顺序列出.
CreateWindow():WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATECreateWindowEx():WM_NCCREATE,WM_NCCALCSIZE,和WM_CREATE我强烈怀疑所描述的消息顺序CreateWindow()应该是WM_NCCREATE第WM_CREATE一个,而是常规的最后一个,这与通知文档和CreateWindowEx()引用一致(并且与您描述的内容一致).
Raymond Chen也有一些有关窗口创建/销毁的有趣信息.
它只是表明,即使看似简单的东西也会越复杂,你看它们就越多.
小智 7
你是在自问自答.在CreateWindowEx()甚至将句柄返回到正在创建的窗口之前,我也在Windows XP SP3上看到WM_GETMINMAXINFO,然后是WM_NCCREATE,WM_NCCALCSIZE,最后是WM_CREATE.什么garabage'
一般的答案是,在有序创建和销毁对象时,Microsoft是无能的.他们弄错了Windows,COM和设备驱动程序.总有一些捕获物22,其中物体是半成品或半摧毁的,需要一些圆形的复杂解决方案才能生产出可靠的产品.
实验的结果比仅仅信任源代码要好,特别是因为源代码是由大量程序员编写的,而且没有人知道所有代码。那是说:
我收到的第一条消息是 0x24 (WM_GETMINMAXINFO)。
我可以假设它永远是第一条消息吗?否,因为 Windows 版本之间的代码发生了变化,并且 Microsoft 尚未记录保证是第一个收到的消息。
底线:不要假设 WM_CREATE 在另一条消息之前被调用。
| 归档时间: |
|
| 查看次数: |
7803 次 |
| 最近记录: |