1

我听说要在我的 C++ 应用程序中创建多个窗口,我需要做的就是创建尽可能多HWND的 s,并且对于每个窗口,使用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对不同的窗口使用不同的 s 不好,这是真的吗?如果是,为什么?(以及如何只使用一个,如果我想要每个窗口的行为有点不同?)

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

4

1 回答 1

4

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

hWnd [输入,可选]

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

如果 hWnd 为 NULL,则 PeekMessage 检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中 hwnd 值为 NULL 的任何消息(参见 MSG 结构)。因此,如果 hWnd 为 NULL,则窗口消息和线程消息都会被处理。

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

问:

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

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

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

不真实。

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

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

于 2013-01-28T21:25:10.250 回答