領域内の色を反転する          <TOP>


領域内の色を反転します。

CreateEllipticRgn 楕円形のリージョンを作成

InvertRgn 指定されたリージョン領域の色を反転

CreateHatchBrush ハッチパターンの論理ブラシを作成

FillRgn 指定のブラシで領域を塗りつぶす

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

 

例では、起動時ハッチブラシで塗り潰した楕円形を表示させ、ボタンクリックでその領域の色を反転します。

 

 

'================================================================
'= 領域内の色を反転する
'=    (InvertRgn.bas)
'================================================================
#include "Windows.bi"

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

' 指定されたリージョン領域の色を反転
Declare Function Api_InvertRgn& Lib "gdi32" Alias "InvertRgn" (ByVal hDC&, ByVal hRgn&)

' ハッチパターンの論理ブラシを作成
Declare Function Api_CreateHatchBrush& Lib "gdi32" Alias "CreateHatchBrush" (ByVal nIndex&, ByVal crColor&)

' 指定のブラシで領域を塗りつぶす
Declare Function Api_FillRgn& Lib "gdi32" Alias "FillRgn" (ByVal hDC&, ByVal hRgn&, ByVal hBrush&)

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

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

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

#define HS_DIAGCROSS 5                  '45度のクロスハッチ

Var Shared Button1 As Object
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared hDC As Long
Var Shared FG As Integer

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var hRgn As Long
    Var hBr As Long
    Var Ret As Long

    FG = 0
    Button1.SetWindowText "現在 Normal"

    hDC = Api_GetDC(GethWnd)
    hRgn = Api_CreateEllipticRgn(20, 10, 210, 100)
    hBr = Api_CreateHatchBrush(HS_DIAGCROSS, RGB(255, 0, 0)) 
    Ret = Api_FillRgn(hDC, hRgn, hBr)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hRgn As Long
    Var Ret As Long

    FG = not FG
    If FG = 0 Then
        Button1.SetWindowText "現在 Normal"
    Else
        Button1.SetWindowText "現在 InvertRgn"
    End If

    hRgn = Api_CreateEllipticRgn(20, 10, 210, 100)
    Ret = Api_InvertRgn(hDC, hRgn)
    Ret = Api_DeleteObject(hRgn)
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    Var Ret As Long

    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

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