如何一次创建,处理和销毁多个窗口?

时间:2013-01-28 21:16:01

标签: c++ windows winapi window

我听说要在我的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个窗口,我的messageloop看起来像这样:

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并不好,这是真的,如果是这样,为什么呢? (如果我想为每个窗口做一些不同的行为,如何只使用一个?)

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

1 个答案:

答案 0 :(得分:4)

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

  

hWnd [in,optional]

     

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

     

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

也就是说,您可以继续使用原始消息循环,只是不将其限制在特定窗口。

Qs:

  

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

消息循环,您或某人发送消息。您可以在窗口WndProc上处理它们,而不必过多考虑确切传递邮件的人并致电WndProc。它同样适用于单窗口和多窗口。

  

另外,我听说在不同的窗口使用不同的WndProcs并不好,这是真的,如果是这样,为什么呢? (如果我想为每个窗口做一些不同的行为,如何只使用一个?)

不真实的。

  

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

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