指定領域の周囲にブラシで境界線を描画          <TOP>


CreateEllipticRgn 楕円形のリージョンを作成
Ellipse 楕円の描画
CombineRgn 既存の二つの領域を結合して新しい領域を作成
FrameRgn 指定の領域の周囲に指定のブラシで境界線を描く
GetDC デバイスコンテキストのハンドルを取得
GetStockObject ストックオブジェクトのハンドルを取得
ReleaseDC デバイスコンテキストを解放
DeleteObject システムリソースを解放

 

 

'================================================================
'= 指定領域の周囲にブラシで境界線を描画
'=    (FrameRgn.bas)
'================================================================
#include "Windows.bi"

' 楕円形のリージョンを作成
Declare Function Api_CreateEllipticRgn& Lib "gdi32" Alias "CreateEllipticRgn" (ByVal nLeftRect&, ByVal nTopRect&, ByVal nRightRect&, ByVal nBottomRect&)

' 楕円の描画
Declare Function Api_Ellipse& Lib "gdi32" Alias "Ellipse" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' 既存の二つの領域を結合して新しい領域を作成
Declare Function Api_CombineRgn& Lib "gdi32" Alias "CombineRgn" (ByVal hRgnDest&, ByVal hRgnSrc1&, ByVal hRgnSrc2&, ByVal nCombineMode&)

' 指定の領域の周囲に指定のブラシで境界線を描く
Declare Function Api_FrameRgn& Lib "gdi32" Alias "FrameRgn" (ByVal hDC&, ByVal hRgn&, ByVal hBrush&, ByVal nWidth&, ByVal nHeight&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' ストックオブジェクトのハンドルを取得
Declare Function Api_GetStockObject& Lib "gdi32" Alias "GetStockObject" (ByVal nIndex&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

#define RGN_COPY 5                      'HRGNSRC1のコピーを作成
#define RGN_DIFF 4                      'HRGNSRC1からHRGNSRC2を除いた領域
#define RGN_OR 2                        'リージョン同士のOR結合
#define RGN_XOR 3                       'リージョン同士のXOR結合

#define BLACK_BRUSH 4                   '黒
#define DKGRAY_BRUSH 3                  '暗い灰色
#define GRAY_BRUSH 2                    '灰色
#define LTGRAY_BRUSH 1                  '明るい灰色
#define WHITE_BRUSH 0                   '白

Var Shared Picture1 As Object
Var Shared Combo1 As Object
Var Shared Button1 As Object

Picture1.Attach GetDlgItem("Picture1") : Picture1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Combo1.AddString "RGN_DIFF"
    Combo1.AddString "RGN_OR"
    Combo1.AddString "RGN_XOR"
    Combo1.AddString "Ellipse"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC As Long
    Var hRgn1 As Long
    Var hRgn2 As Long
    Var Ret As Long

    hDC = Api_GetDC(Picture1.GethWnd)
    
    'リージョンを作成
    hRgn1 = Api_CreateEllipticRgn(50, 0, 160, 80)
    hRgn2 = Api_CreateEllipticRgn(0, 40, 210, 140)

    Picture1.Cls
    
    'リージョンを結合・楕円描画
    Select Case Combo1.GetCursel
        Case 0
            Ret = Api_CombineRgn(hRgn1, hRgn1, hRgn2, RGN_DIFF)
            Ret = Api_FrameRgn(hDC, hRgn1, Api_GetStockObject(DKGRAY_BRUSH), 10, 10)
        Case 1
            Ret = Api_CombineRgn(hRgn1, hRgn1, hRgn2, RGN_OR)
            Ret = Api_FrameRgn(hDC, hRgn1, Api_GetStockObject(GRAY_BRUSH), 2, 10)
        Case 2
            Ret = Api_CombineRgn(hRgn1, hRgn1, hRgn2, RGN_XOR)
            Ret = Api_FrameRgn(hDC, hRgn1, Api_GetStockObject(WHITE_BRUSH), 10, 2)
        Case Else
            Ret = Api_Ellipse(hDC, 50, 0, 160, 80)
            Ret = Api_Ellipse(hDC, 0, 40, 210, 140)
    End Select

    '後処理
    Ret = Api_DeleteObject(hRgn1)
    Ret = Api_DeleteObject(hRgn2)
    Ret = Api_ReleaseDC(Picture1.GethWnd, hDC)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End