【API Function】


[リージョンの結合]
 多角形などのリージョンを駆使しただけでは、面白みのあるウインドウ作る のはなかなか難しいと思います。そんな時、CombineRgn関数を 使用すると、比較的簡単に味のあるウィンドウリージョンを作ることができます。

(穴あきウインドウ)


(CombineRgn 関数の使用方法−主な処理)

宣言コード

Private Declare Function CombineRgn Lib "gdi32" (ByVal _
        hDestRgn As Long, ByVal hSrcRgn1 As Long, _
        ByVal hSrcRgn2 As Long, ByVal nCombineMode _
        As Long) As Long
    '-------------------引数--------------------
    'hDestRgn  リージョンのハンドルを指定
    '          このリージョンに、結合されたリージョンが割り当てられる
    '          リージョンは既存のものでなければならない
    'hSrcRgn1  一方のリージョンのハンドルを指定
    'hSrcRgn2  もう一方のリージョンのハンドルを指定
    'nCombineMode  2つのリージョンの結合方法を指定
    '次の値のいずれかを指定
    '描画関数と同じ扱い
    Private Const RGN_AND = 1& 'リージョン同士のAND結合
    Private Const RGN_OR = 2& 'リージョン同士のOR結合
    Private Const RGN_XOR = 3& 'リージョン同士のXOR結合
    Private Const RGN_DIFF = 4& 'hSrcRgn1から、hSrcRgn2を除いた領域
    Private Const RGN_COPY = 5& 'hSrcRgn1のコピーを作成
    Private Const RGN_MIN = RGN_AND
    Private Const RGN_MAX = RGN_COPY
    '------------------戻り値-------------------
    '関数が終了すると、リージョンの複雑度が返る
    '次の値のいずれかになる
    Private Const ERRORAPI = 0& 'リージョンは作成されていない
    Private Const NULLREGION = 1& 'リージョンは空
    Private Const SIMPLEREGION = 2& 'リージョンは単一の長方形
    Private Const COMPLEXREGION = 3& 'リージョンは単一の長方形よりも複雑な形

2つのリージョンを結合するわけですから、あらかじめ2つのリージョンを 作成しておく必要があります。そしてこの関数を呼び出し、2つのリージョンを 指定された結合方法(下記)で結合します。その結合されたリージョンの ハンドルが1つ目の引数に格納されます。ここで注意しておかなければならない ことは、この1つ目の引数についてです。一見、この引数は新しいリージョンの 格納先であるので、変数の初期の状態(宣言されただけ)であっても問題がない ように見えますが、この変数は既存のリージョンの ハンドルでなければならないというきまりがあります。そのため、 この変数をCombineRgn関数の格納先に指定する前に、何らかの形で既存 のリージョンのハンドルを得ておく必要があります。

///結合方法///

リージョンのAND結合2つのリージョンが重なり合っている部分のみ
新しいリージョンになります
リージョンのOR結合2つのリージョンのすべての領域が
新しいリージョンになります
リージョンのXOR結合2つのリージョンが重なり合っている部分以外が
新しいリージョンになります
リージョンのDIFF結合リージョン1に重っているリージョン2の部分を除いた
リージョン1が新しいリージョンになります

下に、この関数の使用例を示します。

    Dim wRgn1 As Long '結合リージョンサンプル
    Dim wRgn2 As Long
    Dim wRgn As Long '結合後のリージョン

    '角の丸い長方形のリージョンを作る
    wRgn1 = CreateRoundRectRgn(LEFT_X, TOP_Y, RIGHT_X, _
                               BOTTOM_Y, Round_X, Round_Y)
    '楕円のリージョンを作る
    wRgn2 = CreateEllipticRgn(LEFT_X, TOP_Y, _
                              RIGHT_X, BOTTOM_Y)
    '長方形のリージョンを作る
    wRgn = CreateRectRgn(LEFT_X, TOP_Y, RIGHT_X, _
                         BOTTOM_Y)

    'リージョンを結合して新しいリージョンをwRgnに格納
    CombineRgn wRgn, wRgn1, wRgn2, RGN_XOR

結合で得られたリージョンをまた他のリージョンと組み合わせて、そして 得られたリージョンをまた他のリージョンと結合させて・・・・・
というように繰り返し結合させていくと面白いんじゃないでしょうか?


API Functionインデックス トップ


Copyright(C)1999 Tomoya. All rights reserved.