我试图在Win32环境中创建一个包含多个窗口的应用程序。
我怎么做?我在网上找到的所有Win32教程都只显示了如何管理一个窗口。
如何创建第二个窗口,以及如何一起处理它们的消息?
(我知道我应该只有一个消息循环)

谢谢!

最佳答案

您的消息循环为当前线程上创建的所有窗口获取并分发消息。

像这样的简单消息循环就足够了。

MSG msg;
while(GetMessage(&msg,0,0,0,0)>0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}


否则,要在线程上创建窗口,只需根据需要/需要多次调用CreateWindow(...)来构建UI。

警告:在许多简单程序中常见的模式是在WindowProc中处理WM_DESTROY来调用PostQuitMessage()。 PostQuitMessage()将消息发布到线程,告诉消息循环退出。这将终止应用程序,并破坏线程上的所有窗口。如果您有一个主应用程序窗口,如果关闭了该窗口,则应退出该应用程序,只有该窗口才能调用PostQuitMessage。如果您有两个(或更多)可以任意顺序关闭的窗口,则需要保持打开窗口的数量,并仅在用户关闭最后一个窗口时才调用PostQuitMessage。

实际上,任何演示对话框的示例程序也都在演示如何在线程上创建许多窗口,因为对话框上的每个控件也是带有windowproc的窗口。

许多新的Windows开发人员陷入了尝试为特定窗口过滤消息的陷阱:

  while(GetMessage(&msg,hwnd,0,0,0)...


这是错误的,因为它阻止任何子窗口获取其消息。许多实用程序库会在线程上创建隐藏的窗口,并使用它们来接收来自其他进程/线程的消息-像这样仅过滤应用程序窗口中的消息,这将导致消息队列增加,而其他事情则以奇怪的异常方式失败。将hwnd传递为NULL,直到您确切了解为什么要一段时间过滤特定窗口的消息。

08-25 02:42