こんにちは、複数のウィンドウを含む Win32 環境でアプリケーションを作成しようとしています。それ、どうやったら出来るの?私が見つけたWeb上のすべてのWin32チュートリアルは、1つのウィンドウを管理する方法しか示していませんでした。2 番目のウィンドウを作成するにはどうすればよいですか? また、両方のウィンドウのメッセージを一緒に処理するにはどうすればよいですか? (メッセージループは1つしかないはずだと理解しました)
色々ありがとう!
ダン
メッセージ ループは、現在のスレッドで作成されたすべてのウィンドウのメッセージをフェッチしてディスパッチします。
このような単純なメッセージ ループで十分です。
MSG msg;
while(GetMessage(&msg,0,0,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
それ以外の場合、スレッドでウィンドウを作成するには、UI を構築する必要があるたびに CreateWindow(...) を呼び出すだけです。
警告: 多くの単純なプログラムで見られる一般的なパターンWM_DESTROY
は、WindowProc で処理して PostQuitMessage() を呼び出すことです。PostQuitMessage() は、スレッドにメッセージを投稿し、メッセージ ループに終了を指示します。これによりアプリが終了し、スレッド上のすべてのウィンドウが破棄されます。閉じた場合にアプリを終了するメイン アプリケーション ウィンドウがある場合は、そのウィンドウのみが PostQuitMessage を呼び出す必要があります。任意の順序で閉じることができる 2 つ (またはそれ以上) のウィンドウがある場合は、開いているウィンドウの数を維持し、最後のウィンドウがユーザーによって閉じられたときにのみ PostQuitMessage を呼び出す必要があります。
実際、ダイアログ ボックスのすべてのコントロールは windowproc を持つウィンドウでもあるため、ダイアログ ボックスを示すサンプル プログラムは、スレッド上に多くのウィンドウを作成する方法も示しています。
多くの新しい Windows 開発者は、特定のウィンドウのメッセージをフィルター処理しようとする罠に陥ります。
while(GetMessage(&msg,hwnd,0,0,0)...
これは、子ウィンドウがメッセージを取得できないため、間違っています。多くのユーティリティ ライブラリは、スレッド上に非表示のウィンドウを作成し、それらを使用して他のプロセス/スレッドからメッセージを受信します。このようにアプリ ウィンドウのメッセージのみをフィルタリングすると、メッセージ キューが大きくなり、その他のことが奇妙で異常な方法で失敗します。 . しばらくの間、特定のウィンドウのメッセージをフィルタリングする理由が正確に理解できるまで、hwnd に NULL を渡します。
では、子ウィンドウを作成しますよね? 作成するウィンドウの種類を決定する必要があります。モーダル (ダイアログ ボックスとも呼ばれます) とモードレスの 2 種類があります。
CreateDialog、DialogBox、CreateWindow関数を探すだけです
モードレス ウィンドウはメイン ウィンドウと同じ wndproc を使用しますが、新しいモーダル ウィンドウには wndproc を提供する必要があります。
私が何かを間違えていたら申し訳ありません.生のWinAPIをプログラムしたのはずっと前のことです..