Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。
ドライバがオーバーレイ サーフェスをサポートすることがわかったので、オーバーレイ サーフェスを作成できる。デバイスがオーバーレイ サーフェスをサポートするうえで標準となる方法がないので、特定のサイズやピクセル フォーマットのオーバーレイを常に作成できるとは限らない。さらに、1 度でオーバーレイ サーフェスを作成できるとも限らない。したがって、最も望ましい特性を持つオーバーレイ サーフェスから作成し始め、機能するオーバーレイ サーフェスを作成できるまで、構成の特性を落としながら (おそらく、ハードウェア依存ではない) 何度も作成を試みる。
注 : IDirectDraw7::GetFourCCCodes メソッドを呼び出すことにより、ドライバがオーバーレイ サーフェスをサポートしそうな非 RGB ピクセル フォーマットを記述する FOURCC コードのリストを取得できる。ただし、RGB オーバーレイ サーフェスを使用する場合には、最初にさまざまな共通 RGB フォーマットでサーフェスの作成を試み、うまくいかなければ他のフォーマットで試みるとよい。
Mosquito サンプルでは、" 最良の場合から最悪の場合 " という考えに従ってオーバーレイ サーフェスを作成する。Mosquito では、最初にトリプルバッファのページ フリッピング複合オーバーレイ サーフェスの作成を試みる。その作成に失敗した場合、次に他の共通ピクセル フォーマットで構成を試みる。この場合のコードを次に示す。
ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay)); ddsdOverlay.dwSize = sizeof(ddsdOverlay); ddsdOverlay.dwFlags= DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_BACKBUFFERCOUNT| DDSD_PIXELFORMAT; ddsdOverlay.ddsCaps.dwCaps = DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY; ddsdOverlay.dwWidth =320; ddsdOverlay.dwHeight =240; ddsdOverlay.dwBackBufferCount=2; // グローバル リストにあるピクセル フォーマットの 1 つを用いて、 // オーバーレイ サーフェスの作成を試みる。 i=0; do{ ddsdOverlay.ddpfPixelFormat=g_ddpfOverlayFormats[i]; // オーバーレイ サーフェスの作成を試みる。 ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL); } while( FAILED(ddrval) && (++i < NUM_OVERLAY_FORMATS) );
上記の例では、DDSURFACEDESC2 構造体の範囲内にフラグと値を設定して、トリプルバッファのページ フリッピング複合オーバーレイ サーフェスを反映する。次に、さまざまな共通ピクセル フォーマットで要求するサーフェスを作成するために、もっとも望ましいものから望ましくないピクセル フォーマットの順にループを実行する。サーフェスが作成できると、ループは終了する。サーフェスを作成する試みがすべて失敗した場合、ディスプレイ ハードウェアにトリプルバッファ スキームをサポートするための十分なメモリがないか、フリッピング オーバーレイ サーフェスをサポートしない可能性がある。この場合、このサンプルでは、単一の非フリッピング オーバーレイ サーフェスを使う要求度の低い構成で作成を試みる。次にこの例を示す。
// トリプルバッファ複合オーバーレイ サーフェスが作成されない // 場合、単一の非フリッピング バッファイで再び作成を試みる。 if(FAILED(ddrval)) { ddsdOverlay.dwBackBufferCount=0; ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT; // オーバーレイ サーフェスの作成を試みる。 ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL); i=0; do{ ddsdOverlay.ddpfPixelFormat=g_ddpfOverlayFormats[i]; ddrval = g_lpdd->CreateSurface(&ddsdOverlay, &g_lpddsOverlay, NULL); } while( FAILED(ddrval) && (++i < NUM_OVERLAY_FORMATS) ); // オーバーレイ サーフェスを作成できない。失敗を返して終了する。 if (FAILED(ddrval)) return FALSE; }
直前のコードでは、DDSURFACEDESC2 構造体のフラグと値をリセットして、単一の非フリッピング オーバーレイ サーフェスを反映する。サーフェスを作成するために、再度ピクセル フォーマットからループする。作成に成功すると、ループは終了する。この場合でも作成できなければ、サンプルは失敗を示す FALSE を返す。
オーバーレイ サーフェスまたはサーフェスの作成に成功すると、そのサーフェスにビットマップをロードして表示を準備できる。