我试图了解 WTL 的工作方式,而消息循环现在让我感到困惑。
例如这个代码片段:link
首先创建窗口,然后启动消息泵。它是如何工作的?CreateEx、UpdateWindow 等不应该发送自己的不可见消息,如 WM_CREATE/WM_PAINT/WM_NCPAINT?如果消息泵未初始化,它们会被扔到哪里?如果你创建一个窗口,启动消息循环,然后关闭窗口,但又想在它的位置创建一个新窗口,会发生什么?PostQuit 退出循环,您必须创建一个新循环?
了解发布消息 (PostMessage) 和发送消息 (SendMessage) 之间的区别在这里很重要。Windows 直接为发送的消息调用窗口过程,它们不是由消息循环调度的。这是在消息循环开始之前如何处理 WM_CREATE 和 WM_SHOWWINDOW 的。WM_QUIT、WM_PAINT、WM_KEYDOWN 和 WM_MOUSEMOVE 是发布消息的示例。
对于消息发送,CreateWindow
直接发送消息,好像SendMessage
被使用了一样。如果你做过很多 Windows 编程,你可能已经通过这种方式直接向控件发送消息,并且事情会立即发生,而无需消息泵运行;Windows 自己也会这样做。
至于这个PostQuitMessage
问题,通常的策略是在消息循环中进行一些其他检查,以查看应用程序是否应该退出。例如,与其在窗口关闭时发布退出消息并WM_QUIT
在消息循环中等待,您可以维护一个打开窗口的计数器,然后在有 0 个打开的窗口时退出。
没有什么神奇之处WM_QUIT
,除了可以方便地发布它并使用(等)功能PostQuitMessage
轻松检查它。GetMessage
您可以不使用它并出于其他原因决定退出您的程序。