windows - Visual C++ MFC 中窗口启动时的事件顺序

标签 windows visual-studio-2010 events visual-c++ mfc

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

最佳答案

消息到达的顺序尚未完全定义和记录。然而,某些消息是相对于其他消息排序的。 MSDN 明确指出 WM_NCCREATEWM_CREATE 之前发送。 WM_CREATE 的文档还有一些关于顺序的提示(重点是我的):

Sent when an application requests that a window be created by calling the CreateWindowEx or CreateWindow 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_CREATEWM_SIZEWM_PAINT

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

投反对票者请注意:如果您认为此答案不准确或需要改进,请留言以帮助 future 的访问者。

关于windows - Visual C++ MFC 中窗口启动时的事件顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18258668/

相关文章:

c++ - FileObject->FileName 不返回文件的完整路径

c - 为什么 64 位 Windows 上原生 long 原语的大小只有 4 个字节?

c# - 如何将自定义窗口窗体置于安装项目窗口顶部?

javascript - 在Javascript程序中无法理解?

c# - 无法使用 asp.net mvc 3 获得事件模糊

sql-server - Windows 2003 中 JDBC 连接可用的套接字数

windows - 使用 Chocolatey 创建自己的包

visual-studio-2010 - 如何将配色方案导入 Visual Studio 2010?

c++ - 我可以将我的项目指向本地存储的 glut.dll 吗?

c# - 如何中断事件处理程序