处理多个窗口WIN32 API

dan*_*dan 3 winapi message loops

我正在尝试在包含多个窗口的Win32环境中创建一个应用程序.我怎么做?Web上的所有Win32教程我发现只展示了如何管理一个窗口.我如何创建第二个窗口,以及如何处理它们的消息?(我知道我应该只有一个消息循环)

Thankslot!

Chr*_*cke 7

您的消息循环为当前线程上创建的所有窗口提取和分派消息.

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

MSG msg;
while(GetMessage(&msg,0,0,0,0)>0)
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)

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

警告:在许多简单程序中看到的常见模式是WM_DESTROY在WindowProc中处理以调用PostQuitMessage().PostQuitMessage()向线程发布消息,告诉消息循环退出.这将终止应用程序,破坏线程上的所有窗口.如果你有一个主应用程序窗口,如果关闭,应该退出应用程序,只有那个窗口应该调用PostQuitMessage.如果有两个(或更多)的窗户,可以按任意顺序被关闭,那么你需要保持开放的窗口的数量,并调用PostQuitMessage只有当最后一个窗口被用户关闭.

说真的,这表明一个对话框中的任何示例程序还展示了如何在一个线程创建多个窗口,作为一个对话框,每个控制也用的WindowProc的窗口.

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

  while(GetMessage(&msg,hwnd,0,0,0)...
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为它会阻止任何子窗口收到他们的消息.许多实用库将在线程上创建隐藏窗口,并使用它们接收来自其他进程/线程的消息 - 仅过滤应用程序窗口的消息,这将导致消息队列增长,其他事情以奇怪的方式失败.为hwnd传递NULL,直到您明白为什么您可能希望过滤特定窗口的消息一段时间.