我听说要在我的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
并不好,这是真的,如果是这样,为什么呢? (如果我想为每个窗口做一些不同的行为,如何只使用一个?)
最后,如何退出我的应用程序,以便在关闭其中一个窗口(任何窗口)时,所有窗口都将被关闭?
答案 0 :(得分:4)
PeekMessage(&msg, NULL, ...
会做你需要的。 msg
将收到需要调度消息的窗口句柄,因此单个API调用适用于所有现有窗口。
hWnd [in,optional]
要检索其消息的窗口句柄。该窗口必须属于当前线程。
如果hWnd为NULL,PeekMessage将检索属于当前线程的任何窗口的消息,以及当前线程上的任何消息 线程的消息队列,其hwnd值为NULL(参见MSG 结构体)。因此,如果hWnd为NULL,则为窗口消息和线程 消息被处理。
也就是说,您可以继续使用原始消息循环,只是不将其限制在特定窗口。
Qs:
现在我的问题是,这是获取多个窗口消息的正确方法吗?
消息循环,您或某人发送消息。您可以在窗口WndProc
上处理它们,而不必过多考虑确切传递邮件的人并致电WndProc
。它同样适用于单窗口和多窗口。
另外,我听说在不同的窗口使用不同的WndProcs并不好,这是真的,如果是这样,为什么呢? (如果我想为每个窗口做一些不同的行为,如何只使用一个?)
不真实的。
最后,如何退出我的应用程序,以便在关闭其中一个窗口(任何窗口)时,所有窗口都将被关闭?
在您的示例中发布WM_QUIT
时,消息循环会中断。然后你应该摧毁窗户并退出。