【问题标题】:How to create, handle and destory multiple windows at once?如何一次创建、处理和销毁多个窗口?
【发布时间】:2013-01-28 21:16:01
【问题描述】:

我听说要在我的 C++ 应用程序中创建多个窗口,我需要做的就是尽可能多地创建 HWNDs,并为每个窗口使用 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;
}

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

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

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

【问题讨论】:

    标签: c++ windows winapi window


    【解决方案1】:

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

    hWnd [输入,可选]

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

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

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

    问题:

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

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

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

    不真实。

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

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

    【讨论】:

    • 我自己的窗口是否可以属于当前线程?
    • Windows“属于”创建它的线程,所以如果您在一个线程中创建了所有它们,那么是的,这个单一的消息泵将为所有它们提供服务。将NULL 作为第二个参数传递,甚至可以将消息发送到不属于您的窗口,例如尤其是属于 COM 子系统的“服务”窗口。
    • 如果我的WndProc 处理其他窗口的消息,那会不会导致各种问题?
    • 您的WndProc 只会被调用您的消息。 DispatchMessage 负责向适当的WndProc 投递。
    • PeekMessage 基本上将下一条消息读入msg 变量,包括消息所属的窗口。 DispatchMessage 调用在该窗口注册的相应 WndProc。这很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多