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で、リージョンオブジェクトを破棄します。これが終わった時点で今回の作業は一応すべて完了です。 |