Canvasに描画する際、全体ではなく、ある矩形領域の中にだけ描画したいときがあります。こういう処理をクリッピングといいます。たとえばグラフを描画する際など、枠外にはみ出した部分は描画されると困るので必須の処理になります。ところがVCLにはクリッピングを行う機能が用意されていません。そこでWindows APIの助けを借りることになります。ソースコードは次のような感じです。
Graphics::TBitmap* bitmap = new Graphics::TBitmap(); bitmap->SetSize(400, 400); HRGN hrgn = CreateRectRgn(100, 100, 300, 300); // クリッピング領域を作成 SelectClipRgn(bitmap->Canvas->Handle, hrgn); // クリッピング領域を設定 DeleteObject(hrgn); // ハンドルを解放 // 描画処理 SelectClipRgn(bitmap->Canvas->Handle, NULL); // クリッピング領域を解除 // 別の描画処理 delete bitmap;
上記の例ではクリッピング領域を(100, 100)と(300, 300)を対角線とする矩形に設定しています。CreateRectRgn関数でクリッピング領域のハンドルを作成し、SelectClipRgn関数でCanvasにクリッピング領域を設定するという流れになります。
CreateRectRgn関数の4つの引数にはクリッピングしたい領域を左・上・右・下の座標で指定します。この関数は設定した領域のハンドルを返します。
SelectClipRgn関数の第1引数にはCanvasのHandleプロパティを指定します。第2引数にはCreateRectRgn関数で作成した領域のハンドルを指定します。領域のハンドルは用が済んだらDeleteObject関数で解放しなければなりません。
SelectClipRgn関数の第2引数にNULLを指定すると、クリッピングを解除することができます。