【API Function】


[色々なウィンドウスタイル]
 通常四角いウィンドウを異なる形にするには、 まず、リージョンと呼ばれる描画領域を作らなければなりません。そし て、そのリージョンをSetWindowRgn関数によってウィンドウの リージョンに指定する必要があります。
そこで、まずリージョンを作るコードから解説します。

(これもウインドウです)


(リージョン作成方法−主な処理)

作成できるリージョンは、長方形,角の丸い長方形,楕円(円), 多角形,複数の多角形の5つで、それぞれCreateRectRgnCreateRoundRectRgnCreateEllipticRgnCreatePolygonRgn CreatePolyPolygonRgn関数を使用して作成します。以下に、 これら5つすべての関数の宣言を記述してあります。 また、以下の宣言コードにそれぞれの引数や戻り値の 説明も付加してあるので、それらについての詳しい説明は省略します。

'*****長方形のリージョンを作る関数*****
Private Declare Function CreateRectRgn Lib "gdi32" _
        (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
         ByVal Y2 As Long) As Long
    '-------------------引数--------------------
    '(X1) 長方形の左上隅の x 座標を指定
    '(Y1) 長方形の左上隅の y 座標を指定
    '(X2) 長方形の右下隅の x 座標を指定
    '(Y2) 長方形の右下隅の y 座標を指定
    '------------------戻り値-------------------
    '関数が成功すると、リージョンのハンドルが返り、
    '関数が失敗すると、0が返る

'*****角の丸い長方形のリージョンを作る関数*****
Private Declare Function CreateRoundRectRgn Lib "gdi32" _
        (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
         ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) _
         As Long
    '-------------------引数--------------------
    '(X1) 長方形の左上隅の x 座標を指定
    '(Y1) 長方形の左上隅の y 座標を指定
    '(X2) 長方形の右下隅の x 座標を指定
    '(Y2) 長方形の右下隅の y 座標を指定
    '(X3) 長方形の角の丸みの幅を指定
    '(Y3) 長方形の角の丸みの高さを指定
    '------------------戻り値-------------------
    '関数が成功すると、リージョンのハンドルが返り、
    '関数が失敗すると、0が返る

'*****指定した四角形に内接する楕円のリージョンを作る関数*****
Private Declare Function CreateEllipticRgn Lib "gdi32" _
        (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
         ByVal Y2 As Long) As Long
    '-------------------引数--------------------
    '(X1) 楕円に外接する長方形の左上隅の x 座標を指定
    '(Y1) 楕円に外接する長方形の左上隅の y 座標を指定
    '(X2) 楕円に外接する長方形の右下隅の x 座標を指定
    '(Y2) 楕円に外接する長方形の右下隅の y 座標を指定
    '------------------戻り値-------------------
    '関数が成功すると、リージョンのハンドルが返り、
    '関数が失敗すると、0が返る

'構造体の定義
Private Type POINT
    x As Long
    y As Long
End Type

'*****多角形から構成されるリージョンを作る関数*****
Private Declare Function CreatePolygonRgn Lib "gdi32" _
        (lpPoint As POINT, ByVal nCount As Long, _
        ByVal nPolyFillMode As Long) As Long
    '-------------------引数--------------------
    '(lpPoint) POINT構造体の配列。この配列に、多角形の各頂点の座標を格納
    '(nCount) 多角形の頂点の数(lpPoint 配列の要素の数)を指定
    '(nPolyFillMode) 多角形塗りつぶしモード。次の値のいずれかを指定
    Private Const ALTERNATE = 1& '交互モードで塗りつぶす
    Private Const WINDING = 2& '全域モードで塗りつぶす
    '------------------戻り値-------------------
    '関数が成功すると、リージョンのハンドルが返り、
    '関数が失敗すると、0が返る

'*****複数の多角形から構成されるリージョンを作る関数*****
Private Declare Function CreatePolyPolygonRgn Lib "gdi32" _
        (lpPoint As POINT, lpPolyCounts As Long, _
         ByVal nCount As Long, ByVal nPolyFillMode As Long) _
         As Long
    '-------------------引数--------------------
    '(lpPoint) POINT構造体の配列。この配列に、多角形の各頂点の座標を格納
    '(lpPolyCounts) 配列変数。各要素に、各多角形の頂点の数を入れておく
    '(nCount)  多角形の総数を指定
    '(nPolyFillMode) 多角形塗りつぶしモード。上の値のいずれかを指定
    '------------------戻り値-------------------
    '関数が成功すると、リージョンのハンドルが返り、
    '関数が失敗すると、0が返る

次に、リージョンを作成のコードです。ここで紹介しているものでは、 多角形リージョンとして三角形,複数多角形リージョンとして横棒グラフ的なものを作っています。 (デザイン的に全然面白くないですが・・・)
下のコードは、リージョン作成の主な処理です

'*****長方形のリージョンを作る*****
wRgn = CreateRectRgn(LEFT_X, TOP_Y, RIGHT_X, BOTTOM_Y)

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

'*****楕円のリージョンを作る*****
wRgn = CreateEllipticRgn(LEFT_X, TOP_Y, RIGHT_X, BOTTOM_Y)

'*****多角形(三角形)のリージョンを作る*****
'各頂点の座標
Pos(0).x = 0&: Pos(0).y = 0&
Pos(1).x = 200&: Pos(1).y = 0&
Pos(2).x = 100&: Pos(2).y = 200&
'頂点の数
P_Count = UBound(Pos) + 1&
wRgn = CreatePolygonRgn(Pos(0), P_Count, ALTERNATE)

'*****複数多角形リージョンの作成*****      
'多角形の数
N_Count = UBound(P_Count2) + 1&
'多角形の頂点の座標を格納
For i = 0 To CInt(N_Count) - 1
    Nu = i * (CInt(N_Count) - 1)
    Pos2(Nu + 0).x = 0&: Pos2(Nu + 0).y = PW * i + 0& + PH
    Pos2(Nu + 1).x = PW * (i + 1): Pos2(Nu + 1).y = PW * i + 0& + PH
    Pos2(Nu + 2).x = PW * (i + 1): Pos2(Nu + 2).y = PW * (i + 1)
    Pos2(Nu + 3).x = 0&: Pos2(Nu + 3).y = PW * (i + 1)
    '各多角形の頂点の数−この場合どれも一緒
    P_Count2(i) = CInt(N_Count) - 1
Next i
wRgn = CreatePolyPolygonRgn(Pos2(0), P_Count2(0), _
                            N_Count, ALTERNATE)   

この上のコードの中で、wRgnがリージョンのハンドルにあたり、 このハンドルをSetWindowRgn関数の引数に指定すると ウインドウが新しいウィンドウリージョンになります。

(リージョン設定)

SetWindowRgn関数は次のようなものです。

'*****指定されたウィンドウのウィンドウリージョンを設定*****
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd _
        As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) _
        As Long
    '-------------------引数--------------------
    'hWnd    ウィンドウのハンドルを指定
    '        このウィンドウのウィンドウリージョンを設定する
    'hRgn    リージョンのハンドルを指定
    '        このリージョンが、新しいウィンドウリージョンになる
    'bRedraw ウィンドウリージョンを設定した後に、
    '        ウィンドウを再描画するかどうかを指定
    '------------------戻り値-------------------
    '関数が成功すると、0以外が返り、
    '関数が失敗すると、0が返る

先ほどのリージョンのハンドルwRgnを引数にして関数を呼び出すと、 ウィンドウが指定されたリージョンになります。

    '新しいリージョンをFormに設定
    SetWindowRgn Form.hWnd, wRgn, True


API Functionインデックス トップ


Copyright(C)1999 Tomoya. All rights reserved.