如何一次创建、处理和删除多个窗口

How to create, handle and destory multiple windows at once?

本文关键字:删除 窗口 处理 何一次 创建      更新时间:2023-10-16

我听说要在我的C++应用程序中创建多个窗口,我需要做的就是根据需要创建任意数量的HWND,然后为每个窗口使用CreateWindowEx(),以及适当的窗口类等。
我已经做到了,所以这不是问题。

现在,通常,我会为我的应用程序制作这种消息循环:

MSG msg;
while(1)
{
    while(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(msg.message == WM_QUIT)
        break;
}

(这应该是正确的,是吗?

但是现在我有 3 个窗口,我的消息循环如下所示:

MSG msg;
while(1)
{
    while(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE) || PeekMessage(&msg, hConWnd, 0, 0, PM_REMOVE) || PeekMessage(&msg, hStatWnd, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(msg.message == WM_QUIT)
        break;
}

所以它会检查所有窗口的消息,对吧?

现在我的问题是,这是获取多个窗口消息的正确方法吗?
另外,我听说对不同的窗口使用不同的WndProc是不好的,这是真的吗,如果是这样,为什么?(如果我想每个窗口的行为略有不同,如何只使用一个?

最后,如何退出我的应用程序,以便在其中一个窗口关闭(任何窗口)时,所有窗口都将适当地关闭?

PeekMessage(&msg, NULL, ...会做你需要的。 msg将接收需要调度消息的窗口句柄,因此单个 API 调用适用于所有现有窗口。

hWnd [在,可选]

要检索其消息的窗口的句柄。该窗口必须属于当前线程。

如果 hWnd 为 NULL,则 PeekMessage 将检索属于当前线程的任何窗口的消息,以及当前线程上的任何消息 线程的消息队列,其 hwnd 值为 NULL(请参阅消息 结构)。因此,如果 hWnd 为 NULL,则窗口消息和线程 处理消息。

也就是说,您可以保留原始消息泵送循环,只是不要将其限制在特定窗口。

问:

现在我的问题是,这是获取多个窗口消息的正确方法吗?

消息

循环,由您或某人发送消息。您可以在窗口的WndProc上处理它们,而无需过多考虑究竟是谁传递消息并致电您的WndProc。它同样适用于单个窗口和多个窗口。

另外,我听说对不同的窗口使用不同的 WndProcs 不好,这是真的吗,如果是这样,为什么?(如果我想每个窗口的行为略有不同,如何只使用一个?

假。

最后,如何退出我的应用程序,以便在其中一个窗口关闭(任何窗口)时,所有窗口都将适当地关闭?

在示例中发布WM_QUIT时,消息循环会中断。然后你应该摧毁窗户并退出。