多角形などのリージョンを駆使しただけでは、面白みのあるウインドウ作る のはなかなか難しいと思います。そんな時、CombineRgn関数を 使用すると、比較的簡単に味のあるウィンドウリージョンを作ることができます。
(穴あきウインドウ)
(CombineRgn 関数の使用方法−主な処理)
宣言コード 2つのリージョンを結合するわけですから、あらかじめ2つのリージョンを 作成しておく必要があります。そしてこの関数を呼び出し、2つのリージョンを 指定された結合方法(下記)で結合します。その結合されたリージョンの ハンドルが1つ目の引数に格納されます。ここで注意しておかなければならない ことは、この1つ目の引数についてです。一見、この引数は新しいリージョンの 格納先であるので、変数の初期の状態(宣言されただけ)であっても問題がない ように見えますが、この変数は既存のリージョンの ハンドルでなければならないというきまりがあります。そのため、 この変数を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& 'リージョンは単一の長方形よりも複雑な形
///結合方法///
下に、この関数の使用例を示します。
リージョンの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
というように繰り返し結合させていくと面白いんじゃないでしょうか?