最終更新日 :
VB Tips

クリップリージョン API

WindowsAPIの中には、描画範囲を限定する役割を持つ、クリップリージョン関係のAPIがあります。 デバイスコンテキストに対してクリップリージョンを設定すると、そのデバイスコンテキストへのあらゆる描画がクリップリージョン内のみで行われます。
ここでは、リージョン系のAPIは紹介を又の機会にしたいですが、リージョン系のAPIに加えて、パス-リージョン変換APIを使用することによって、さらに高度な描画が可能となります。

構文
' 長方形のリージョンを作成する関数
Declare Function CreateRectRgnIndirect Lib "gdi32" (lpRect As RECT) As Long
' デバイスコンテキストにクリップリージョンを設定する関数
Declare Function SelectClipRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As Long
' グラフィック(リージョン)オブジェクトを破棄する関数
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

クリップリージョンの利用
1.クリップリージョンを設定すると?
クリップリージョンとは、デバイスコンテキスト(DC)に描画可能な範囲のことです。
例えば右の絵のように、あるフォーム内にクリップリージョンをSetClipRgn()APIで設定すると、そのクリップリージョンが解除されるまで、 描画は常にそのクリップリージョン内のみに反映されます。
クリップリージョンに設定するリージョンは、GDIオブジェクトと言われるものです。GDIオブジェクトは、使用した後には必ず破棄しなければなりません。 つまり、新しくオブジェクトを作ったら、必ず自分で後始末をしなければいけない、ということです。この作業を忘れるたびに、リソースを消費したままの状態が続き、最終的にメモリ不足に陥ります。
2.クリップリージョンを設定する準備 - その1
RECT構造体を宣言し、それぞれのメンバを適当な値に設定します。
RECT.Left = 適当 : RECT.Top = 適当
RECT.Right = RECT.Left + 目標幅 : RECT.Bottom = RECT.Top + 目標の高さ
(当然単位はピクセル(:vbPixel)に変換すること)
3.クリップリージョンを設定する準備 - その2
長方形のリージョンを作成します。リージョンのハンドルを格納するLong型の変数を宣言します。

Dim hRgn As Long
hRgn = CreateRectRgnIndirect(RECT)


これでリージョンの作成は終わりました。もし、hRgnが0なら、CreateRectRgnIndirect()は失敗です。メモリなどが不足している可能性があります。
4.クリップリージョンを設定する
リージョンの作成が終わりました。とうとうクリップリージョンの設定です。

Dim ret As Long
ret = SelectClipRgn(hDC, hRgn)


これで、指定されたデバイスコンテキストへのクリップリージョンの設定が終わりました。戻り値は、失敗した場合-1が返ってきますが、成功した場合の戻り値は特に気にする必要はありません。
5.描画
これで、クリップリージョンの設定を掛けた範囲外には描画されなくなりました。思い思いに描画コードを書き込んでください。
6.描画の後処理
描画のコードが終了したならば、リージョンオブジェクトを破棄する手続きに入らなければなりません。
リージョンを破棄する前に、クリップリージョンを元に戻しておきましょう。

ret = SelectClipRgn(hDC, 0&)

リージョンハンドルとして0を渡すと、デバイスコンテキストの表示されている部分(AutoRedraw = False時)がクリップリージョンとして認識されます。
GetClipRgn()などで得た以前のリージョンオブジェクトを選択し直すことでも同じ事です。

DeleteObject hRgn

DeleteObject()APIで、リージョンオブジェクトを破棄します。これが終わった時点で今回の作業は一応すべて完了です。

Copyright (C) 1998 Satoshi Tadaフィードバックはこちら
Home