二つの領域を結合し塗りつぶす          <TOP>


二つの領域を結合し、指定したブラシで塗りつぶします。

PaintRgn 現在のブラシで領域を塗りつぶす

GetStockObject ストックオブジェクトのハンドルを取得

CreateRectRgn 長方形のリージョンを作成

CombineRgn 既存の二つの領域を結合して新しい領域を作成

SelectObject 指定されたデバイスコンテキストのオブジェクトを選択

DeleteObject 論理オブジェクトを削除

CreateBrushIndirect LOGBRUSH構造体を定義して論理ブラシを作成

GetDC デバイスコンテキストのハンドルを取得

ReleaseDC デバイスコンテキストを解放

 

例では、二つの領域(20, 20)-(110, 110)と(50, 50)-(140, 140)を結合(CombineRgn)し、ランダムに作成したブラシ(CreateBrushIndirect)で塗りつぶしています。

RGN_AND、RGN_OR、RGN_XORでの状態も確認しています。

  

 

'================================================================
'= 二つの領域を結合し塗りつぶす
'=    (PaintRgn.bas)
'================================================================
#include "Windows.bi"

Type LOGBRUSH
    lbStyle As Long
    lbColor As Long
    lbHatch As Long
End Type

' 現在のブラシで領域を塗りつぶす
Declare Function Api_PaintRgn& Lib "gdi32" Alias "PaintRgn" (ByVal hDC&, ByVal hRgn&)

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

' 長方形のリージョンを作成
Declare Function Api_CreateRectRgn& Lib "gdi32" Alias "CreateRectRgn" (ByVal nLeftRect&, ByVal nTopRect&, ByVal nRightRect&, ByVal nBottomRect&)

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

' 指定されたデバイスコンテキストのオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' LOGBRUSH構造体を定義して論理ブラシを作成
Declare Function Api_CreateBrushIndirect& Lib "gdi32" Alias "CreateBrushIndirect" (lpLogBrush As LOGBRUSH)

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

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

#define BS_SOLID 0                      'ソリッドブラシ
#define WHITE_BRUSH 0                   '白
#define LTGRAY_BRUSH 1                  '明るい灰色
#define GRAY_BRUSH 2                    '灰色
#define BLACK_BRUSH 4                   '黒
#define RGN_AND 1                       'リージョン同士のAND結合
#define RGN_OR 2                        'リージョン同士のOR結合
#define RGN_XOR 3                       'リージョン同士のXOR結合

Var Shared Picture1 As Object
Var Shared Radio1 As Object
Var Shared Radio2 As Object
Var Shared Radio3 As Object
Var Shared Button1 As Object

Picture1.Attach GetDlgItem("Picture1")
Radio1.Attach GetDlgItem("Radio1") : Radio1.SetFontSize 14
Radio2.Attach GetDlgItem("Radio2") : Radio2.SetFontSize 14
Radio3.Attach GetDlgItem("Radio3") : Radio3.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14


'================================================================
'=
'================================================================
Declare Function Rgn bdecl () As Integer
Function Rgn()
    Rgn = Val(Mid$(GetDlgRadioSelect("Radio1"), 6))
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var LB As LOGBRUSH
    Var hDC As Long
    Var hRgn1 As Long
    Var hRgn2 As Long
    Var hOldBrush As Long
    Var hBrush As Long
    Var Ret As Long

    Picture1.cls

    Randomize Val(Right$(time$, 1))
    LB.lbColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))
    LB.lbStyle = BS_SOLID

    'ピクチャボックスのハンドル取得
    hDC = Api_GetDC(Picture1.GethWnd)
    
    'ブラシの取得
'   hBrush = Api_GetStockObject(GRAY_BRUSH)        '灰色ブラシの場合
    hBrush = Api_CreateBrushIndirect(LB)
    
    'リージョンの作成
    hRgn1 = Api_CreateRectRgn(20, 20, 110, 110)
    hRgn2 = Api_CreateRectRgn(50, 50, 140, 140)
    
    'リージョンの結合
    Ret = Api_CombineRgn(hRgn1, hRgn1, hRgn2, Rgn)
    
    'リージョンの描画
    hOldBrush = Api_SelectObject(hDC, hBrush)
    Ret = Api_PaintRgn(hDC, hRgn1)
    Ret = Api_SelectObject(hDC, hOldBrush)

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

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