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

Posted

技术标签:

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

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

【问题讨论】:

我同意 edtheprogrammerguy 的评论,但出于调查目的,您始终可以处理这些事件并进行跟踪。 【参考方案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 我不知道对第一条消息是什么做出任何声明......我对其中一些相对于彼此下了订单。就是这样。

以上是关于在 Visual C++ MFC 中启动窗口时的事件顺序的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?

在不关闭子窗口的情况下从子窗口返回焦点到父窗口(在mfc visual studio中)

在Visual C++设计中,单文档应用程序中常用的MFC类如何相互获得类的指针?(如CView类获得CDoc类的指针等

我用 Microsoft Visual Studio 2010 新建一个 C++ 的对话框窗口程序的时候 该如何设置它的窗口类名?谢谢!

在 Visual C++ 中切换子进程窗口可见性而不重新启动子进程

如何从 MDI Visual C++ 2008 应用程序更改子窗口的背景