Platform SDK: DirectX |
ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「DirectDraw Visual Basic チュートリアル」を参照すること。
大部分のディスプレイ ハードウェアは、オーバーレイ サーフェスの表示に制限を課す。オーバーレイ サーフェスをうまく表示するには、注意深くこれらの制限を見ていかなくてはならない。これらの制限についての情報を取得するには、IDirectDraw7::GetCaps メソッドを呼び出す。このメソッドが埋め込む DDCAPS 構造体には、オーバーレイ能力やその使用法の制限についての情報が含まれている。ハードウェア制限はさまざまなので、常に dwFlags メンバのフラグを調べ適用する制限を決定する。
Mosquito サンプルでは、ハードウェア能力の取得から開始し、次に最小伸縮係数に基づいてアクションを行う。次にこのコードを示す
// ドライバ能力を取得する。 ddrval = g_lpdd->GetCaps(&capsDrv, NULL); if (FAILED(ddrval)) return FALSE; // 最小伸縮を調べ、それに対応して // ローカル変数を設定する。 if(capsDrv.dwCaps & DDCAPS_OVERLAYSTRETCH) uStretchFactor1000 = (capsDrv.dwMinOverlayStretch>1000) ? capsDrv.dwMinOverlayStretch : 1000; else uStretchFactor1000 = 1000;
上記のコードでは、ハードウェア能力のみを取得するために GetCaps を呼び出す。この呼び出しで、最初のパラメータは、デバイス ドライバ能力の情報を埋め込む DDCAPS 構造体へのポインタとなる。2 番目のパラメータは、エミュレーション情報を取得しないことを示すために NULL とする。
この例では、後で使用するため、一時変数に最小伸縮係数を保持する (伸縮係数は 1000 を掛けて報告されるので、1300 は実際には 1.3 を意味することに注意すること)。ドライバが 1000 以上の値を報告する場合、ドライバは、報告された比率だけすべての転送先矩形が x 軸に沿って伸縮されなければならない。たとえば、ドライバが伸縮係数 1.3 を報告し、転送元矩形の幅が 320 ピクセルである場合、転送先矩形の幅は少なくとも 416 ピクセルなくてはならない。ドライバが 1000 以下の値を報告する場合、ドライバは転送元矩形より小さなオーバーレイを表示できるが、必要に応じてオーバーレイを伸縮できる。
次に、ドライバのサイズ アライメント制限を記述する値を調べる。次に例を示す。
// アライメント制限を取得し、それに対応して // ローカル変数を設定する。 uSrcSizeAlign = (capsDrv.dwCaps & DDCAPS_ALIGNSIZESRC)?capsDrv.dwAlignSizeSrc:0; uDestSizeAlign= (capsDrv.dwCaps & DDCAPS_ALIGNSIZESRC)?capsDrv.dwAlignSizeDest:0;
このサンプルでは、より多くの一時変数を使用して、dwAlignSizeSrc および dwAlignSizeDest メンバから報告されるサイズ アライメント制限を保持する。これらの値は、ピクセル幅アライメント制限についての情報を提供し、後でこれらの制限を反映させるために、転送元および転送先矩形の寸法を設定する際に必要となる。転送元および転送先矩形には、これらのメンバ値の倍数となるピクセル幅がなくてはならない。
最後に、転送先矩形の境界アライメントを記述する値を調べる。
// "転送先位置アライメント" グローバルを設定して // オーバーレイ サーフェスを動かすたびに GetCaps() を呼び出す // 必要がないようにする。 if (capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST) g_dwOverlayXPositionAlignment = capsDrv.dwAlignBoundaryDest; else g_dwOverlayXPositionAlignment = 0;
上記のコードでは、dwAlignBoundaryDest メンバから取得した転送先矩形の境界アライメントに対する値を保持するために、グローバル変数を使用している。この値は、プログラムが後でオーバーレイを再配置するときに使用される (詳細情報は、「ステップ 5 : オーバーレイ表示位置の更新」を参照すること)。転送先矩形の左上角の x 座標は、ピクセル単位でこの値と連続するように設定しなくてはならない。つまり、指定された値が 4 であれば、転送先矩形の左上角の x 座標は、ピクセルで 0、4、8、12 などに指定することしかできない。Mosquito アプリケーションでは、最初にオーバーレイを 0,0 に表示する。したがって、アライメント準拠であると仮定し、オーバーレイが最初に表示されるまで制約情報を取得する必要はない。実装方法はさまざまなので、おそらく、この情報を調べて、オーバーレイを表示する前に転送先矩形を調整する必要がある。