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)による転送をしたときにだけ、クリッピングされます。まぁ、このクリッパーによる
クリッピングは私の環境では速度が遅いので使用していません。ですから詳しいこたぁ、よくわかりましぇ〜ん。