矩形領域を塗る          <TOP>


指定した矩形領域を純色(SOLID)、ハッチ(HATCHED)で塗るテスト

CreateBrushIndirect ブラシを作成する関数

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

IsWindow ウィンドウハンドルが有効か調べる

SetRectEmpty 空の長方形を作成する

SetRect オブジェクトの矩形を設定

IsRectEmpty 指定された長方形が空であるかどうかを判断

IntersectRect 矩形が重なっているか調べる

RedrawWindow 領域内の指定の範囲を再描画

GetRgnBox リージョンの境界長方形の取得

DeleteObject オブジェクトの削除

FillRect 四角形を塗りつぶす

GetDC デバイスコンテキストの取得

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

 

 

 

'================================================================
'= 矩形領域を塗る
'=    (CreateBrushIndirect.bas)
'================================================================
#include "Windows.bi"

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

Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type

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

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

' 指定されたウィンドウ ハンドルが既存のウィンドウを識別しているどうかを判断
Declare Function Api_IsWindow& Lib "user32" Alias "IsWindow" (ByVal hWnd&)

' RECT構造体の値を全て0にする
Declare Function Api_SetRectEmpty& Lib "user32" Alias "SetRectEmpty" (lpRect As RECT)

' RECT構造体の値を設定
Declare Function Api_SetRect& Lib "user32" Alias "SetRect" (lpRect As RECT, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' CRectが空かどうかを調べる
Declare Function Api_IsRectEmpty& Lib "user32" Alias "IsRectEmpty" (lpRect As RECT)

' 2つの矩形が重なっているとき、重なっている部分の座標値を返す
Declare Function Api_IntersectRect& Lib "user32" Alias "IntersectRect" (lpDestRect As RECT, lpSrc1Rect As RECT, lpSrc2Rect As RECT)

' リージョンの境界長方形の取得
Declare Function Api_GetRgnBox& Lib "gdi32" Alias "GetRgnBox" (ByVal hRgn&, lpRect As RECT)

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

' ブラシで矩形領域を塗りつぶす
Declare Function Api_FillRect& Lib "user32" Alias "FillRect" (ByVal hDC&, ByRef r As RECT, ByVal hBrush&)

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

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

#define RDW_INVALIDATE &H1              '再描画領域を無効化
#define BS_SOLID 0                      'ソリッドブラシ
#define BS_HATCHED 2                    'ハッチング(スタイルはlbHatchで指定)
#define HS_CROSS 4                      '水平と垂直クロスハッチ

Var Shared Radio1 As Object
Var Shared Radio2 As Object
Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var lb As LOGBRUSH
    Var rc As RECT
    Var RgnRect As RECT
    Var Rgn As Long
    Var hBrush As Long
    Var hDC As Long
    Var Ret As Long

    hDC = Api_GetDC(GethWnd)

    Randomize Val(Right$(Time$, 1))
    lb.lbColor = RGB(Int(Rnd * 256), Int(Rnd * 256), Int(Rnd * 256))

    If Radio1.GetCheck = 1 Then
        lb.lbStyle = BS_SOLID
    Else
        lb.lbStyle = BS_HATCHED
    End If

    lb.lbHatch = HS_CROSS

    hBrush = Api_CreateBrushIndirect(lb)
    Ret = Api_SetRect(rc, 0, 0, 220, 60)
    Rgn = Api_CreateRectRgn(15, 10, 215, 50)
    Ret = Api_GetRgnBox(Rgn, RgnRect)
    Ret = Api_IntersectRect(rc, RgnRect, rc)
    Ret = Api_SetRectEmpty(RgnRect)
    Ret = Api_FillRect(hDC, rc, hBrush)

    Ret = Api_DeleteObject(hBrush)
    Ret = Api_ReleaseDC(GethWnd, hDC)
    Ret = Api_IsRectEmpty(RgnRect)
    If Ret <> 0 Then Ret = Api_SetRectEmpty(RgnRect)
End Sub

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