Platform SDK: DirectX

協調レベルのテスト

開発者は、アプリケーションで使用するサーフェスをリストアしたり再作成すべきことを通知するために、WM_ACTIVATEAPP や WM_DISPLAYCHANGE などのメッセージを使用することがある。このような場合、アプリケーションでは不必要なときにアクションを取得し、必要なときにはアクションを取得しない。C++ のIDirectDraw7::TestCooperativeLevel メソッドまたは Visual Basic のDirectDraw7.TestCooperativeLevel メソッドにより、アプリケーションは DirectDraw オブジェクトの協調レベルにおける詳細情報を取得でき、何事もなく実行を続けられる適切なステップを取得できる。

アプリケーションがサーフェスをリストアでき (既にリストアが行われていない場合)、実行を続けられると、TestCooperativeLevel メソッドは DD_OK を返して成功する。また、失敗のコードは、アプリケーションで使用する協調レベルとは異なって判断される。

フルスクリーン アプリケーション

排他的なデバイス アクセスを失う場合 (たとえば、ユーザーが ALT + TAB を押して現在のアプリケーションを切り替える場合)、フルスクリーン アプリケーションは DDERR_NOEXCLUSIVEMODE 戻り値を受け取る。この場合、アプリケーションは、メソッドが DD_OK (排他モードが返されたことを意味する) を返すときだけ終了するループ内の TestCooperativeLevel を呼び出す。アプリケーションでは、ループ内の不必要なサイクルを阻止するために CPU を制御しない。このため、Windows では、WaitMessage Sleep Win32 関数といった関数をサポートする。

あらゆる既存のサーフェスは、IDirectDrawSurface7::Restore、C++ の IDirectDraw7::RestoreAllSurfaces メソッドまたは Visual Basic の DirectDrawSurface7.Restore メソッドを呼び出すことでリストアされ、サーフェスが表示される前にコンテンツが再ロードされなくてはならない。

ウィンドウ アプリケーション

ウィンドウ アプリケーション以外のアプリケーションで排他的なデバイス アクセスを取得している場合、ウィンドウ アプリケーション (標準協調レベルを使用している) は、DDERR_EXCLUSIVEMODEALREADYSET を受け取る。この場合、排他アクセスのあるアプリケーションがそのアクセスを失うまで、アクションは取得されない。この状況は、フルスクリーン アプリケーションの場合と類似する。ウィンドウ アプリケーションは、TestCooperativeLevel がサーフェスのリストアや再ロードの前に DD_OK を返すまで、ループする。前述したように、このアプリケーションのようなループでは、ループ中に CPU の制御を周期的に行わず、不必要な CPU サイクルの使用を避けるべきである。

ディスプレイ モードが変更されると、TestCooperativeLevel メソッドは DDERR_WRONGMODE をウィンドウ アプリケーションに返す。この場合、このアプリケーションでは、実行を続ける前にあらゆるサーフェスを破棄して再作成しなくてはならない。