指定領域内をピクセルで描画          <TOP>


指定された矩形領域内のおよび円形領域内にポイントがあれば、ピクセルで描画します。

例では、矩形領域内を赤で、円形領域内を黄色で描画しています。

PtInRect ある点が指定の矩形領域内にあるかどうかを判定

PtInRegion 指定された点がリージョン内にあるかどうか判定

CreateEllipticRgnIndirect 円形・楕円形の領域をRECT構造体に基づいて作成

SetPixelV 指定の位置のピクセルを指定のカラーに最も近いカラー値に設定

SetRect RECT構造体の値を設定

DeleteObject オブジェクトに関連付けられていた全てのシステムリソースを解放

 

 

'================================================================
'= 指定領域内をピクセルで描画
'=    (PointIn.bas)
'================================================================
#include "Windows.bi"

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

' オブジェクトに関連付けられていた全てのシステムリソースを解放
Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&)

' ある点が指定の矩形領域内にあるかどうかを判定
Declare Function Api_PtInRect& Lib "user32" Alias "PtInRect" (lpRect As RECT, ByVal x&, ByVal y&)

' 指定された点がリージョン内にあるかどうか判定
Declare Function Api_PtInRegion& Lib "gdi32" Alias "PtInRegion" (ByVal hRgn&, ByVal x&, ByVal y&)

' 円形・楕円形の領域をRECT構造体に基づいて作成
Declare Function Api_CreateEllipticRgnIndirect& Lib "gdi32" Alias "CreateEllipticRgnIndirect" (lpRect As RECT)

' 指定の位置のピクセルを指定のカラーに最も近いカラー値に設定
Declare Function Api_SetPixelV& Lib "gdi32" Alias "SetPixelV" (ByVal hDC&, ByVal x&, ByVal y&, ByVal crColor&)

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

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

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

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var hDC As Long
    Var mRGN As Long
    Var R As RECT
    Var x As Long
    Var y As Long
    Var Ret As Long

    '矩形領域を設定     L   T   R   B   
    Ret = Api_SetRect(R, 20, 20, 70, 70)

    'フォームのDCを取得
    hDC = Api_GetDC(GetHwnd)

    '円・楕円領域をRECT構造体に基づき作成
    mRGN = Api_CreateEllipticRgnIndirect(R)

    '領域内ポイントをスキャン
    For x = R.Left To R.Right
        For y = R.Top To R.Bottom

            'ポイントが領域内であれば黄色のピクセルで描画
            If Api_PtInRegion(mRGN, x, y) <> 0 Then
                Ret = Api_SetPixelV(hDC, x, y, rgb(255, 255, 0))

            '赤でピクセルを描画
            Else If Api_PtInRect(R, x, y) <> 0 Then
                Ret = Api_SetPixelV(hDC, x, y, rgb(255, 0, 0))
            End If
        Next y
    Next x

    Ret = Api_DeleteObject(mRGN)
    Ret = Api_ReleaseDC(GetWnd, hDC)
End Sub

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