Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Windows消息循环和WTL_C++_Windows_Winapi_Wtl - Fatal编程技术网

C++ Windows消息循环和WTL

C++ Windows消息循环和WTL,c++,windows,winapi,wtl,C++,Windows,Winapi,Wtl,我试图理解WTL的工作方式,而消息循环现在让我困惑 例如,此代码片段: 首先创建窗口,然后启动消息泵。它是怎么工作的?CreateEx、UpdateWindow等不是应该发送自己的不可见消息,比如WM\u CREATE/WM\u PAINT/WM\u NCPAINT吗?如果消息泵未初始化,它们将抛出何处?如果创建一个窗口,启动消息循环,然后关闭该窗口,但要在该窗口中创建一个新窗口,会发生什么?PostQuit退出循环,您必须创建一个新循环?关于消息发送,CreateWindow直接发送消息,就像

我试图理解WTL的工作方式,而消息循环现在让我困惑

例如,此代码片段:


首先创建窗口,然后启动消息泵。它是怎么工作的?CreateEx、UpdateWindow等不是应该发送自己的不可见消息,比如WM\u CREATE/WM\u PAINT/WM\u NCPAINT吗?如果消息泵未初始化,它们将抛出何处?如果创建一个窗口,启动消息循环,然后关闭该窗口,但要在该窗口中创建一个新窗口,会发生什么?PostQuit退出循环,您必须创建一个新循环?

关于消息发送,CreateWindow直接发送消息,就像使用了SendMessage一样。如果你已经做了很多Windows编程,你可能已经用这种方式直接向控件发送了消息,并且在不需要运行消息泵的情况下立即发生了事情;Windows本身也会这样做

至于PostQuitMessage问题,通常的策略是在消息循环中进行一些其他检查,以查看应用程序是否应该退出。例如,与在窗口关闭时发布退出消息并在消息循环中等待WM_quit不同,您可以维护一个打开窗口的计数器,然后在有0个打开窗口时直接退出


WM_QUIT并没有什么神奇之处,除了可以方便地使用PostQuitMessage发布它,并使用GetMessage等函数轻松检查它。您可以自由地不使用它,并出于其他原因决定退出程序。

关于消息发送,CreateWindow直接发送消息,就像使用了SendMessage一样。如果你已经做了很多Windows编程,你可能已经用这种方式直接向控件发送了消息,并且在不需要运行消息泵的情况下立即发生了事情;Windows本身也会这样做

至于PostQuitMessage问题,通常的策略是在消息循环中进行一些其他检查,以查看应用程序是否应该退出。例如,与在窗口关闭时发布退出消息并在消息循环中等待WM_quit不同,您可以维护一个打开窗口的计数器,然后在有0个打开窗口时直接退出


WM_QUIT并没有什么神奇之处,除了可以方便地使用PostQuitMessage发布它,并使用GetMessage等函数轻松检查它。您可以自由地不使用它,并出于其他原因决定退出程序。

了解PostMessage和SendMessage之间的区别在这里很重要。Windows直接为已发送的消息调用窗口过程,而不是通过消息循环进行调度。这就是在消息循环启动之前,WM_CREATE和WM_SHOWWINDOW的处理方式。WM_QUIT、WM_PAINT、WM_KEYDOWN和WM_MOUSEMOVE是已发布消息的示例。

理解发布消息PostMessage和发送消息SendMessage之间的区别在这里很重要。Windows直接为已发送的消息调用窗口过程,而不是通过消息循环进行调度。这就是在消息循环启动之前,WM_CREATE和WM_SHOWWINDOW的处理方式。WM_QUIT、WM_PAINT、WM_KEYDOWN和WM_MOUSEMOVE都是已发布消息的示例。

所以在这种情况下,基本上所有已发布的消息都会丢失?从消息循环中创建窗口会更好吗?不,它们存储在消息队列中。您不能在消息循环中创建主窗口(鸡和蛋)。如果你想做这种编程,Petzold是必读的。好的,我今天就订购这本书。但是,是什么让主窗口如此特别呢?您可以启动循环,并将singleton init消息发布到线程以创建窗口,这会起到作用,不是吗?不太清楚为什么以非标准方式执行此操作对您如此重要。这条消息相当邪恶。读这本书。我只是想了解它的内部结构以及如何正确地解决问题。从消息循环直观地创建窗口似乎更为正确。但整个事情仍然令人困惑。更不用说MessageBoxW吃掉消息循环的疯狂案例了。所以在这种情况下,基本上所有发布的消息都会丢失?从消息循环中创建窗口会更好吗?不,它们存储在消息队列中。您不能在消息循环中创建主窗口(鸡和蛋)。如果你想做这种编程,Petzold是必读的。好的,我今天就订购这本书。但是,是什么让主窗口如此特别呢?您可以启动循环,并将singleton init消息发布到线程以创建窗口,这会起到作用,不是吗?不太清楚为什么以非标准方式执行此操作对您如此重要。这条消息相当邪恶。读这本书。我只是想了解它的内部结构以及如何正确地解决问题。从m直观地创建窗口 消息循环似乎更为正确。但整个事情仍然令人困惑。更不用说MessageBoxW吃掉消息循环的疯狂案例了。