[HMC]年間5250円で独自ドメイン付属、ウィルスチェックありのレンタルサーバ!
Last update : 1999/09/01
DirectDraw基礎 第11回
画像転送時にDirectDraw側でクリッピングする
サンプルコードのダウンロード
  では、まずサンプルコードをダウンロードし、解凍して下さい。 私はVisual C++6.0でコンパイルしているので、をお持ちの方は Visual C++でプロジェクトファイルを開いて下さい(「ddraw_11.dsw」をダブルクリックすれば開けます)。 圧縮ファイルに含まれる「ddraw_11.exe」をダブルクリックし、実行してみて下さい。どうでしょう?画面が切り替わり、フルスクリーン化し、 SLIME(?)と書かれた画像がタイル状に敷き詰められ、どんどん小さくなりながら左上へスクロールするのが解ると思います。
  というわけで今回は、DirectDraw側で画像転送時にクリッピングしたいと思います。
DirectDrawクリッパー
  DirectDrawにクリッピングをさせるには、DirectDrawクリッパーというものを 使用します。クリッパー作成は、自作関数「StartDirectDraw」内に追加してあります。
  意外とソースは短いですかねぇ(^^;。では、順番に説明していきたいと思います。 まず、DirectDrawオブジェクト(lpDD)のメンバ関数である「CreateClipper」を呼び出し、 DirectDrawクリッパーオブジェクトを作成します。構文は以下の通りです。

書式HRESULT CreateClipper( DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR *lplpDDClipper, IUnknown FAR *pUnkOuter );
dwFlagsこのフラグは使用していないらしく、0を指定する必要があるらしい
*lplpDDClipper新しいDirectDrawClipperオブジェクトを示すポインタへのポインタ。 例によって、LPDIRECTDRAWCLIPPER型自体がポインタ型になっているので、「ポインタへのポインタ」と言っています(たぶん)。
*pUnkOuter将来拡張のために使用するらしいので今はNULLを指定。
戻り値 成功した場合はDD_OKが返ってくるらしい。

  これで、DirectDrawClipperオブジェクトが出来ました。で次にこいつのメンバ関数である「SetHWnd」を呼び出します。 これは、クリッピング範囲をウィンドウハンドルを参照して設定するというものです。つまり、プライマリサーフェイスと同じ範囲に設定されるわけです。 というわけで、構文。

書式HRESULT SetHWnd( DWORD dwFlags, HWND hWnd );
dwFlagsこのフラグは使用していないらしく、0を指定する必要があるらしい
hWndクリッピング情報を含むウィンドウ ハンドル
戻り値 成功した場合はDD_OKが返ってくるらしい。

  これで、クリッピング範囲を設定し終えたら、次にサーフェイスのメンバ関数である「SetClipper」を呼び出します。 SetClipperによってサーフェイスへクリッパーを関連付けさせれば、そのサーフェイスに対し、クリッピングが可能となります。 一応構文も載せておきます。

書式HRESULT SetClipper( LPDIRECTDRAWCLIPPER lpDDClipper );
lpDDClipper関連づけさせるクリッパー。ここを0にしてやると、今まで関連付けられていたクリッパーが外されるらしい(未確認)。
hWndクリッピング情報を含むウィンドウ ハンドル
戻り値 成功した場合はDD_OKが返ってくるらしい。

  設定は以上です。このクリッパーは、関連づけさせたサーフェイスへ、サーフェイスのメンバ関数「Blt」(自作関数の方では無いので注意して下さい)で転送した場合にのみ 有効となります。それと、クリッパーが関連づけさせられているサーフェイスへBltFast(自作関数Blt)による転送は出来ません。

  今回は、クリッパーをバックバッファ(lpBack)に関連づけさせていますが、ここへBlt(自作関数BltStretch)による転送をしたときにだけ、クリッピングされます。まぁ、このクリッパーによる クリッピングは私の環境では速度が遅いので使用していません。ですから詳しいこたぁ、よくわかりましぇ〜ん。
後始末
  いつも通り、終了する時にはlpClipper->Release();を実行してやらなければなりません。 マクロ使用ではRELEASE(lpClipper);ですけど。