2

假设我有一个从 CWnd 派生的具有事件处理函数的类OnPaintOnCreate并且OnSize。如您所知,所有这些都是在窗口启动时发生的,但我想看看它们之间的顺序是什么。
例如,当我在其中一个中设置断点时,在结束函数后,控件不会传递给另一个,而是转到 MFC 的内置 .cpp 文件之一wincore.cpp
我如何理解订单?任何链接或教我一种方法来防止控件进入 MFC 内置类?

4

1 回答 1

5

消息到达的顺序没有完全定义和记录。但是,某些消息相对于其他消息是有序的。MSDN 明确声明WM_NCCREATEWM_CREATE. 就订单而言,文档WM_CREATE还有一些提示(强调我的):

CreateWindowEx当应用程序通过调用orCreateWindow函数请求创建窗口时发送。(该消息在函数返回之前发送。)新窗口的窗口过程在窗口创建后、窗口变为可见之前收到该消息。

应该立即清楚,必须存在一个窗口才能接收附加消息。因此,第一个WM_SIZE将在 之后发送WM_CREATE。至于WM_PAINT它要求一个窗口是可见的。另外,它是一个低优先级的消息,只有在消息队列为空时才会生成。

在窗口创建期间,顺序是WM_CREATE, WM_SIZE, WM_PAINT

如果您只对观察消息感兴趣,您可以使用 Visual Studio 附带的 Spy++ (spyxx.exe) 等工具。它可以记录任意消息并为您提供详细信息。如果这是出于教育目的(而不是推断行为),它是一个非常有用的工具。

投票者注意事项:如果您认为此答案不准确或需要改进,请留言以帮助未来的访客。

于 2013-08-15T18:33:22.977 回答