Platform SDK: DirectX

ステップ 4 : システム メッセージを監視する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

アプリケーション ウィンドウの作成および DirectX オブジェクトの作成に続き、シーンの初期化を終了すると、いつでもシーンをレンダリングできる状態になる。通常、Windows アプリケーションはメッセージ ループのシステム メッセージを監視し、キューにメッセージがなければいつでもフレームのレンダリングを行う。サンプル Triangle も、同じようにメッセージ ループに対して次のコードを使用する。

    BOOL bGotMsg;
    MSG  msg;
    PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
    g_bReady = TRUE;
 
    while( WM_QUIT != msg.message  )
    {
        // アプリケーションがアクティブな場合は、PeekMessage() を使用する。これにより、アイドル時間を使用して、
        // シーンのレンダリングをすることができる。それ以外の場合には、GetMessage() を使用して、CPU 時間の浪費を避ける。
        if( g_bActive )
            bGotMsg = PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
        else
            bGotMsg = GetMessage( &msg, NULL, 0U, 0U );
 
        if( bGotMsg )
        {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
        }
        else
        {
            // アイドル時間の間にフレームをレンダリングする (待機中のメッセージなし)。
            if( g_bActive && g_bReady )
                Render3DEnvironment();
        }
    }

上記のコードでは、グローバル フラグ変数の g_bActive を使用してアクティブになる時点を追跡し、別の変数の g_bReady を使用して、すべてのシステム オブジェクトが、シーンのレンダリングの準備ができていることを示す。アプリケーションでは、ウィンドウが表示されていない場合は常に g_bActive を FALSE に設定し、シーンのレンダリングに使用するオブジェクトの再作成が必要な場合は常に g_bReady 変数を FALSE に設定する。(後者については、「ウィンドウのサイズ変更を処理する」で説明する)。

アプリケーションは、アクティブなときにメッセージ キューをチェックして、待機中のメッセージがないかどうかを確認する。キューにメッセージがある場合は、ほかの Windows アプリケーションと同様にメッセージをディスパッチする。キューにメッセージがない場合は、アプリケーション定義関数 Render3DEnvironment を呼び出して、シーンのフレームをレンダリングする。これが、「ステップ 5 : シーンをレンダリング、表示する」の説明内容である。