3

こんにちは、複数のウィンドウを含む Win32 環境でアプリケーションを作成しようとしています。それ、どうやったら出来るの?私が見つけたWeb上のすべてのWin32チュートリアルは、1つのウィンドウを管理する方法しか示していませんでした。2 番目のウィンドウを作成するにはどうすればよいですか? また、両方のウィンドウのメッセージを一緒に処理するにはどうすればよいですか? (メッセージループは1つしかないはずだと理解しました)

色々ありがとう!

ダン

4

2 に答える 2

7

メッセージ ループは、現在のスレッドで作成されたすべてのウィンドウのメッセージをフェッチしてディスパッチします。

このような単純なメッセージ ループで十分です。

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 を渡します。

于 2009-11-10T13:36:40.650 に答える
1

では、子ウィンドウを作成しますよね? 作成するウィンドウの種類を決定する必要があります。モーダル (ダイアログ ボックスとも呼ばれます) とモードレスの 2 種類があります。

CreateDialog、DialogBox、CreateWindow関数を探すだけです

モードレス ウィンドウはメイン ウィンドウと同じ wndproc を使用しますが、新しいモーダル ウィンドウには wndproc を提供する必要があります。

私が何かを間違えていたら申し訳ありません.生のWinAPIをプログラムしたのはずっと前のことです..

于 2009-11-10T13:32:56.330 に答える