在 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 派生的类,它具有事件处理函数 OnPaint
、OnCreate
和 OnSize
。如您所知,所有这些都是在窗口启动时发生的,但我想看看它们之间的顺序是什么。
当我在其中一个中设置断点时,结束函数后,控件不会传递给另一个,而是转到 MFC 的内置 .cpp 文件之一,例如wincore.cpp
?
我如何理解订单?任何链接或教我一种方法来防止控件进入 MFC 内置类?
【问题讨论】:
我同意 edtheprogrammerguy 的评论,但出于调查目的,您始终可以处理这些事件并进行跟踪。 【参考方案1】:消息到达的顺序没有完全定义和记录。但是,某些消息相对于其他消息是有序的。 MSDN 明确声明WM_NCCREATE
在WM_CREATE
之前发送。就订单而言,WM_CREATE
的文档还有一些提示(强调我的):
当应用程序通过调用
CreateWindowEx
或CreateWindow
函数请求创建窗口时发送。 (消息在函数返回之前发送。)新窗口的窗口过程在窗口创建后,窗口变为可见之前收到此消息。。 p>
应该立即清楚,必须存在一个窗口才能接收附加消息。因此,第一个WM_SIZE
将在WM_CREATE
之后发送。至于WM_PAINT
,它要求一个窗口是可见的。另外,它是一个低优先级的消息,只有在消息队列为空时才会生成。
在窗口创建期间,顺序为WM_CREATE
、WM_SIZE
、WM_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++ 的对话框窗口程序的时候 该如何设置它的窗口类名?谢谢!