假设我有一个从 CWnd 派生的类,它具有事件处理函数 OnPaint
、OnCreate
和 OnSize
。如您所知,所有这些都是在窗口启动时发生的,但我想看看它们之间的顺序是什么。
当我在其中一个中设置断点时,在结束函数后,控制不会传递给另一个,而是转到 MFC 的内置 .cpp 文件之一,例如 wincore.cpp
?
我怎样才能理解这个顺序?任何链接或教我一种方法来防止控件进入 MFC 内置类?
最佳答案
消息到达的顺序尚未完全定义和记录。然而,某些消息是相对于其他消息排序的。 MSDN 明确指出 WM_NCCREATE
在 WM_CREATE
之前发送。 WM_CREATE
的文档还有一些关于顺序的提示(重点是我的):
Sent when an application requests that a window be created by calling the
CreateWindowEx
orCreateWindow
function. (The message is sent before the function returns.) The window procedure of the new window receives this message after the window is created, but before the window becomes visible.
应该立即清楚的是,必须存在一个窗 Eloquent 能接收其他消息。因此,第一个WM_SIZE
将在 WM_CREATE
之后发送。至于WM_PAINT
它要求有一个可见的窗口。另外,它是一个低优先级消息,仅在消息队列为空时才会生成。
在窗口创建期间,顺序为 WM_CREATE
、WM_SIZE
、WM_PAINT
。
如果您只对观察消息感兴趣,您可以使用 Visual Studio 附带的 Spy++ (spyxx.exe) 等工具。它可以记录任意消息并为您提供详细信息。如果这是出于教育目的(而不是推断行为),那么它是一个非常有用的工具。
投反对票者请注意:如果您认为此答案不准确或需要改进,请留言以帮助 future 的访问者。
关于windows - Visual C++ MFC 中窗口启动时的事件顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18258668/