クリップ領域を指定されたオフセット分移動          <TOP>


OffsetClipRgn デバイス コンテキストのクリップ領域を指定されたオフセット分移動
DeleteObject オブジェクトに関連付けられていたすべてのシステムリソースを解放
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
Rectangle 長方形の描画
CreateSolidBrush ソリッドカラーで論理ブラシを作成
SelectClipRgnクリッピング領域を設定
CreateEllipticRgn 楕円形のリージョンを作成
GetClientRect ウィンドウのクライアント領域の座標を取得
Sleep カレントスレッドの実行を指定の時間だけ中断
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放

例では、CreateEllipticRgnで作成された楕円形をOffsetClipRgnで1ドットずつ右方向へ移動させています。

 

'================================================================
'= クリップ領域を指定されたオフセット分移動
'=    (OffsetClipRgn.bas)
'================================================================
#include "Windows.bi"

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

' ウィンドウのクライアント領域の座標を取得
Declare Function Api_GetClientRect& Lib "user32" Alias "GetClientRect" (ByVal hWnd&, lpRect As RECT)

' 楕円形のリージョンを作成
Declare Function Api_CreateEllipticRgn& Lib "gdi32" Alias "CreateEllipticRgn" (ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' クリッピング領域を設定
Declare Function Api_SelectClipRgn& Lib "gdi32" Alias "SelectClipRgn" (ByVal hDC&, ByVal hRgn&)

' ソリッドカラーで論理ブラシを作成
Declare Function Api_CreateSolidBrush& Lib "gdi32" Alias "CreateSolidBrush" (ByVal crColor&)

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

' デバイス コンテキストのクリップ領域を指定されたオフセット分移動
Declare Function Api_OffsetClipRgn& Lib "gdi32" Alias "OffsetClipRgn" (ByVal hDC&, ByVal x&, ByVal y&)

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

' 長方形の描画
Declare Function Api_Rectangle& Lib "gdi32" Alias "Rectangle" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)

' カレントスレッドの実行を指定の時間だけ中断
Declare Sub Api_Sleep Lib "Kernel32" Alias "Sleep" (ByVal dwMilliseconds&)

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

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

Var Shared Button1 As Object

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

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC As Long
    Var rc As RECT
    Var Rgn As Long
    Var Brush As Long
    Var Prev As Long
    Var Cnt As Long
    Var Ret As Long

    Randomize Time

    Cls

    'デバイスコンテキスト取得
    hDC = Api_GetDC(GethWnd)

    'ウィンドウのクライアント領域の座標を取得
    Ret = Api_GetClientRect(GethWnd, rc)

    '楕円形のリージョンを作成
    Rgn = Api_CreateEllipticRgn(0, 8, 50, 70)

    'クリッピング領域を設定
    Ret = Api_SelectClipRgn(hDC, Rgn)

    'ソリッドカラーで論理ブラシを作成(ランダム)
    Brush = Api_CreateSolidBrush(RGB(Rnd(1) * 255, Rnd(1) * 255, Rnd(1) * 255))

    '指定されたデバイスコンテキストのオブジェクトを選択
    Prev = Api_SelectObject(hDC, Brush)

    '座標(0 〜 Right-50)の範囲
    For Cnt = 0 To rc.Right - 50 Step 1
        'デバイス コンテキストのクリップ領域を指定されたオフセット分移動
        Ret = Api_OffsetClipRgn(hDC, 1, 0)
        '長方形の描画
        Ret = Api_Rectangle(hDC, rc.Left, rc.Top, rc.Right, rc.Bottom)
        '時間調整
        Api_Sleep 8
    Next Cnt
    
    'オブジェクト・デバイスコンテキストの解放
    Ret = Api_SelectObject(hDC, Prev)
    Ret = Api_DeleteObject(Brush)
    Ret = Api_DeleteObject(Rgn)
    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

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