二つの領域を結合し塗りつぶす <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