1

私の 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、これは本当ですか? もしそうなら、なぜですか? (そして、ウィンドウごとに少し異なる動作が必要な場合は、1 つだけを使用する方法は?)

最後に、ウィンドウの 1 つ (任意のウィンドウ) が閉じられた場合にすべてのウィンドウが適切に閉じられるように、アプリケーションを終了するにはどうすればよいでしょうか?

4

1 に答える 1

4

PeekMessage(&msg, NULL, ...あなたが必要とすることをします。msgメッセージをディスパッチする必要があるウィンドウのハンドルを受け取るため、既存のすべてのウィンドウに対して単一の API 呼び出しが適しています。

hWnd [入力、オプション]

メッセージを取得するウィンドウへのハンドル。ウィンドウは現在のスレッドに属している必要があります。

hWnd が NULL の場合、PeekMessage は、現在のスレッドに属するウィンドウのメッセージと、現在のスレッドのメッセージ キューにある hwnd 値が NULL のメッセージを取得します (MSG 構造体を参照してください)。したがって、hWnd が NULL の場合、ウィンドウ メッセージとスレッド メッセージの両方が処理されます。

つまり、特定のウィンドウに限定せずに、元のメッセージ ポンピング ループをそのまま使用してもかまいません。

Q:

今私の質問は、これは複数のウィンドウのメッセージを取得する正しい方法ですか?

メッセージループ、あなたまたは誰かのディスパッチメッセージ。WndProc誰が正確にメッセージを配信し、あなたのWndProc. 単一のウィンドウでも複数のウィンドウでも同様に機能します。

また、ウィンドウごとに異なる WndProcs を使用するのは良くないと聞きましたが、これは本当ですか? もしそうなら、なぜですか? (そして、ウィンドウごとに少し異なる動作が必要な場合は、1 つだけを使用する方法は?)

真実ではありません。

最後に、ウィンドウの 1 つ (任意のウィンドウ) が閉じられた場合にすべてのウィンドウが適切に閉じられるように、アプリケーションを終了するにはどうすればよいでしょうか?

あなたWM_QUITの例に投稿されると、メッセージループが発生します。次に、ウィンドウを破棄して終了することになっています。

于 2013-01-28T21:25:10.250 に答える