Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic サンプル」を参照すること。
このプログラムでは、複数のモニタを利用するアプリケーションのプログラミングに使用できるテクニックをいくつか示す。
ソース ファイル :(SDK ルート)\Samples\Multimedia\DDraw\Src\Multimon
実行可能ファイル :(SDK ルート)\Samples\Multimedia\DDraw\Bin\Multimon.exe
アプリケーションには、入力の必要はない。終了するには、任意の場所または Esc キーを押す。
GetMonitorInfo や MonitorFromRect といったマルチモニタ関数を Windows 95 で使用するため、Multimon.h. ファイルをインクルードすることができる。また、C ファイルまたは C++ ファイルの 1 つで COMPILE_MULTIMON_STUBS を定義してから Multimon.h をインクルードする必要がある。これにより、Windows 95 上で実行したときに、multimon 関数によって適切な値が返される。
DirectDraw デバイスを列挙するときは、DirectDrawEnumerate または DirectDrawEnumerateEx. のいずれかを使用することができる。DirectDrawEnumerateEx は、DirectX 5.0 およびそれ以降がインストールされている Windows 98 システム、DirectX 6.0 またはそれ以降がインストールされているその他のシステムで使用できる。
すべてのシステムに DirectDrawEnumerateEx が存在するとは限らないため、以前の DirectDraw では開発者が LoadLibrary と GetProcAddress を使用して DirectDrawEnumerateEx の有無をチェックしなければならないように設定されていた。DirectX 7.0 ではこのような制限がなくなり DirectDrawEnumerateEx を直接呼び出すことができるが、そうすると、DirectX 7.0 またはそれ以降がインストールされていない場合にプログラムを実行できなくなることに注意すること。このサンプルでは、DirectDrawEnumerateEx が利用できない場合の LoadLibrary/GetProcAddress テクニックの実行方法、および DirectDrawEnumerate の使用方法を示す。
フルスクリーンのマルチモニタ アプリケーションでは、フォーカス ウィンドウおよびデバイス ウィンドウの処理が必要となる。フォーカス ウィンドウは、ユーザー入力メッセージを受け取り、デバイス ウィンドウは各スクリーンをカバーする。このプログラムは、これらのウィンドウを適切に作成し割り当てるため IDirectDraw7::SetCooperativeLevel を呼び出す方法を示す。
スクリーンごとに専用の DirectDraw インターフェイスを取得するため、ある DirectDraw インターフェイスで作成された DirectDrawSurfaces を他の DirectDraw インターフェイスで使用することはできない。このため、複数モニタ上で使用されるグラフィックスを作成するには、追加のタスクが必要となる。
このサンプルでは 2 つのテクニックを紹介する。最適なパフォーマンスを得るには、ビデオ メモリ サーフェスを使用する必要がある。スクリーンごとに個別のビデオ メモリ DirectDrawSurface を作成しなければならない。システム メモリ サーフェスが必要とされる場合、または望ましい場合、スクリーンごとに個別の DirectDrawSurfaces を作成する必要があるが、同一のサーフェス データ メモリをポイントするように構成することができる。The IDirectDrawSurface7::SetSurfaceDesc メソッドは、この操作に使用できる。これを実行してもパフォーマンスに影響はないが、不必要なシステム メモリの消費を防止することができる。
IDirectDrawSurface7::Blt の呼び出しは、転送先サーフェスの境界の外側でデータを書き込みを行うと失敗するのが普通である。これを防止するには、転送先にクリッパー オブジェクトを付加する。このサンプルでは、各スクリーンのクリッパーを作成してフロント バッファとバック バッファに付加し、スプライト サーフェスをアプリケーションによって手動でクリップしなくてもブリットできるようにする方法を示す。