DIRECTX1 DirectDraw 4 クリッパー
ここでの実験は、クリッパーを作って見ることです。クリッパーというのは、切る人、という意味です。ここで作るクリッパーは、人手はありませんが、描画範囲を指定すると、そこからはみ出た部分を切り取ってくれるオブジェクトです。
では、CDxDrawクラスに以下のようにクリッパー作成関数を作成してみます。
void CDxDraw::MakeClipper()
{
//*-----クリッピング領域を作る OK
lpDD->CreateClipper(0,&pClipper,NULL);
RGNDATAHEADER* pRgn;
RECT* pRect;
int i;
pRgn = (RGNDATAHEADER*)GlobalAlloc(GPTR,sizeof(RGNDATAHEADER) + sizeof(RECT)
* 20);
pRect = (RECT*)(pRgn + 1);
pRgn->dwSize = sizeof(RGNDATAHEADER);
pRgn->iType = RDH_RECTANGLES;
pRgn->nCount = 2;
pRgn->nRgnSize = sizeof(RECT);
POINT pt; // ClientToScreen に渡すためのPoint変数
pt.x=0;
pt.y=0;
ClientToScreen(hwnd,&pt);//クライアントの座標を計算する
SetRect(pRect,
pt.x, // 一個目のクリッピング領域範囲設定
pt.y,
pt.x+100,
pt.y+200);
SetRect(pRect+1,
pt.x+110, // 2個めのクリッピング領域範囲設定
pt.y+110,
pt.x+200,
pt.y+300);
// }
pClipper->SetClipList((RGNDATA*)pRgn,0);
lpDDSFrontBuffer->SetClipper(pClipper);
GlobalFree(pRgn);
//---------------------------------------------*/
}
キー入力の右でこれを呼び出します。
if(nChar == VK_RIGHT){
ddx.MakeClipper(m_hWnd);
}
再び描画すると、画面全体ではなく、四角が2つになります。これはクリッパーで指定した領域しか描画できなくなるからです。
また、Windowを移動すると、クリッパーもセットし直さないと正しい位置に描画されません。OnDrawなどでセットしなおす必要があります。
このような描画領域などは自分でコントロールするのが普通です。
裏に持っているサーフェスを大き目にとって描画し、それから必要部分を表に転送するというような方法です。Direct3Dを使用するようになるとクリッパーが必要なので説明しました。