Platform SDK: DirectX

協調レベルについて

協調レベルは、DirectDraw がどのようにディスプレイと相互作用し、ディスプレイに影響を与えるイベントに対してどのように反応するかを記述する。DirectDraw の協調レベルを設定するには、C++ の IDirectDraw7::SetCooperativeLevel メソッドまたは Visual Basic の DirectDraw7.SetCooperativeLevel メソッドを使用する。大部分のアプリケーションでは DirectDraw の協調レベルを使用して、ディスプレイへ排他アクセスを行うフルスクリーン プログラムとして実行するか、またはウィンドウ アプリケーションとして実行するかを決める。ただし、DirectDraw の協調レベルには、次のようなエフェクトもある。

標準協調レベルは、DirectDraw アプリケーションがウィンドウ アプリケーションとして動作することを示す。この協調レベルでは、プライマリ サーフェスのパレットを変更したり、ページ フリッピングを実行することはできない。

アプリケーションは、複数のウィンドウで DirectDraw を使用することができるので、アプリケーションが DDSCL_NORMAL モードを要求している場合、IDirectDraw7::SetCooperativeLevel および DirectDraw7.SetCooperativeLevel にはウィンドウ ハンドルを指定する必要はない。C++ では ウィンドウ ハンドルに NULL を、Visual Basic では Nothing を渡すことで、通常の Windows モードですべてのウィンドウを同時に使用することができる。

フルスクリーンかつ排他協調レベルでは、ハードウェアを最大限利用できる。このモードでは、カスタム パレットや動的パレットの設定、ディスプレイ解像度の変更、およびページ フリッピングの実現ができる。排他 (フルスクリーン) モードでは、他のアプリケーションがサーフェスを割り当てることを防ぐ必要がなく、DirectDraw や GDI を使用することも排除しなくていい。ただし、排他モードでは、排他アクセスを持つ現在のアプリケーション以外のアプリケーションがディスプレイ モードやパレットを変更することを防ぐ。

DirectDraw は、必要な SetCooperativeLevel メソッドから登録されたウィンドウ ハンドルに WM_ACTIVATEAPP メッセージを送りながら、フルスクリーン (排他モードのアプリケーション) に対するウィンドウ起動イベントのコントロールを取得する。DirectDraw は、起動イベントを最上位ウィンドウだけに送る。アプリケーションが起動イベント メッセージを要求する子ウィンドウを作成する場合、作成者の責任で子ウィンドウをサブクラス化する。

SetCooperativeLevel は、プロセスとウィンドウ ハンドル間の結合を保持する。プロセスで SetCooperativeLevel を呼び出すと、そのプロセスとウィンドウ間に結合ができる。同じプロセス内で異なるゼロ以外のウィンドウ ハンドルを与えて再び呼び出すと、DDERR_HWNDALREADYSET エラー値が返される。アプリケーションによっては、DirectSound® が DirectDraw と異なるウィンドウ ハンドルを指定したときにこのエラーを受け取ることがある。どちらも、同一の最上位アプリケーションのウィンドウ ハンドルを指定しなければならない。

[C++]

 :  Microsoft Foundation Classes (MFC) を使用している開発者は、SetCooperativeLevel メソッドに与えられるウィンドウ ハンドルが、そのアプリケーションの最上位ウィンドウ (子ウィンドウから派生したウィンドウではない) を識別しなくてはならないことに注意する。MFC アプリケーションの最上位ウィンドウ ハンドルを取得するには、以下のコードを使用できる。

    HWND hwndTop = AfxGetMainWnd()->GetSafeHwnd();  

マルチモニタ システム」も参照すること。

[C++,Visual Basic]