【问题标题】:order of events when a window starts in Visual C++ MFC在 Visual C++ MFC 中启动窗口时的事件顺序
【发布时间】:2013-08-15 17:54:32
【问题描述】:

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

【问题讨论】:

  • 我同意 edtheprogrammerguy 的评论,但出于调查目的,您始终可以处理这些事件并进行跟踪。

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


【解决方案1】:

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

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

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

在窗口创建期间,顺序为WM_CREATEWM_SIZEWM_PAINT

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

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

【讨论】:

  • 注:如果您认为此答案不准确或需要改进,请留言以帮助未来的访问者。 ----- 对于顶级 Windows,第一条消息是 WM_GETMINMAXINFO,而不是 WM_NCCREATE,但我没有被否决。 :)
  • @Xearinox 我不知道对第一条消息是什么做出任何声明......我对其中一些相对于彼此下了订单。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多