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を使用するようになるとクリッパーが必要なので説明しました。