クリッピング領域とパスを結合(T)          <TOP>


SetPolyFillMode 多角形塗りつぶしモードを設定

CreatePen 論理ペンを作成

SelectObject 指定されたデバイスコンテキストのオブジェクトを選択

BeginPath 指定されたデバイスコンテキストのパスを指定

MoveToEx 現在位置を受け取るバッファを参照で指定

LineTo 現在の位置から終点までを直線で描画

CloseFigure パス内で現在開いている図形を閉じる

EndPath パスの作成を終了

SelectClipPath 指定したデバイスコンテキストのクリッピング領域とパスを結合

WidenPath パスを塗りつぶしの対象領域として再定義

DeleteObject システムリソースの解放

GetDC デバイスコンテキストのハンドルを取得

ReleaseDC デバイスコンテキストのハンドルを解放

 

左:(0,0)から放射状に直線を描画    右:太い(25ピクセル)三角領域の中に直線を描画

 

'================================================================
'= クリッピング領域とパスを結合
'=    (SearchClipPath.bas)
'================================================================
#include "Windows.bi"

' 多角形塗りつぶしモードを設定
Declare Function Api_SetPolyFillMode& Lib "gdi32" Alias "SetPolyFillMode" (ByVal hDC&, ByVal nPolyFillMode&)

' 論理ペンを作成
Declare Function Api_CreatePen& Lib "gdi32" Alias "CreatePen" (ByVal nPenStyle&, ByVal nWidth&, ByVal crColor&)

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

' hDCで指定されたデバイスコンテキストのパスの作成
Declare Function Api_BeginPath& Lib "gdi32" Alias "BeginPath" (ByVal hDC&)

' 現在位置を受け取るバッファを参照で指定
Declare Function Api_MoveToEx& Lib "gdi32" Alias "MoveToEx" (ByVal hDC&, ByVal x&, ByVal y&, ByVal lpPoint&)

' 現在の位置から終点までを直線で描画
Declare Function Api_LineTo& Lib "gdi32" Alias "LineTo" (ByVal hDC&, ByVal x&, ByVal y&)

' パス内で現在開いている図形を閉じる
Declare Function Api_CloseFigure& Lib "gdi32" Alias "CloseFigure" (ByVal hDC&)

' BeginPathで開始したパスの作成を終了
Declare Function Api_EndPath& Lib "gdi32" Alias "EndPath" (ByVal hDC&)

' 指定したデバイスコンテキストのクリッピング領域とパスを結合
Declare Function Api_SelectClipPath& Lib "gdi32" Alias "SelectClipPath" (ByVal hDC&, ByVal iMode&)

' 指定されたデバイスコンテキストの現在ペンを使ってパスが描かれている場合、そのパスを塗りつぶしの対象領域として再定義
Declare Function Api_WidenPath& Lib "gdi32" Alias "WidenPath" (ByVal hDC&)

' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
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 WINDING 2                       '全域塗りつぶしモード
#define RGN_COPY 5                      'HRGNSRC1のコピーを作成
#define PS_SOLID 0                      '実線のペンを作成
#define vbWhite &HFFFFFF                '白のカラーコード
#define vbBlack &H000000                '黒のカラーコード
#define vbRed &H0000FF                  '赤のカラーコード

Var Shared Picture1 As Object
Var Shared Picture2 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

Picture1.Attach GetDlgItem("Picture1")
Picture2.Attach GetDlgItem("Picture2")
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hDC1 As Long
    Var hPen As Long
    Var hOldPen As Long
    Var i As Long
    Var Ret As Long

    'Picture1のデバイスコンテキストを取得
    hDC1 = Api_GetDC(Picture1.GethWnd)

    '多角形塗りつぶしモードを設定
    Ret = Api_SetPolyFillMode(hDC1, WINDING)

    '論理ペンを作成
    hPen = Api_CreatePen(PS_SOLID, 1, vbBlack)

    'オブジェクトを選択
    hOldPen = Api_SelectObject(hDC1, hPen)

    For i = 1 To 400 Step 5
        '座標(0,0)から直線を描画
        Ret = Api_MoveToEx(hDC1, 0, 0, 0)
        Ret = Api_LineTo(hDC1, i, 400 - i)
    Next

    '論理オブジェクトを削除
    Ret = Api_DeleteObject(hPen)

    'デバイスコンテキストを解放
    Ret = Api_ReleaseDC(Picture1.GethWnd, hDC1)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var hDC2 As Long
    Var hPen As Long
    Var hOldPen As Long
    Var i As Long
    Var Ret As Long

    'Picture2のデバイスコンテキストを取得
    hDC2 = Api_GetDC(Picture2.GethWnd)

    Ret = Api_SetPolyFillMode(hDC2, WINDING)

    'パス用ペンを設定
    hPen = Api_CreatePen(PS_SOLID, 25, vbWhite)
    hOldPen = Api_SelectObject(hDC2, hPen)

    'パスブラケットをオープン
    Ret = Api_BeginPath(hDC2)
   
    'Pictureに三角形を描画
    Ret = Api_MoveToEx(hDC2, 80, 20, 0)   '三角形頂点    ・
    Ret = Api_LineTo(hDC2, 20, 140)       '底辺左へ     /
    Ret = Api_LineTo(hDC2, 140, 140)      '底辺右へ     __
    Ret = Api_CloseFigure(hDC2)           '図形を閉じる   \

    'パスブラケットをクローズ
    Ret = Api_EndPath(hDC2)
 
    '三角形をクリッピングパスとして設定
    Ret = Api_WidenPath(hDC2)

    'クリッピング領域とパスを結合
    Ret = Api_SelectClipPath(hDC2, RGN_COPY)

    'オブジェクトを選択
    Ret = Api_SelectObject(hDC2, hOldPen)

    'パス用ペンを設定
    hPen = Api_CreatePen(PS_SOLID, 1, vbRed)
    hOldPen = Api_SelectObject(hDC2, hPen)

    For i = 1 To 400 Step 5
        '座標(0,0)から直線を描画
        Ret = Api_MoveToEx(hDC2, 0, 0, 0)
        Ret = Api_LineTo(hDC2, i, 400 - i)
    Next

    '論理オブジェクトを削除
    Ret = Api_DeleteObject(hPen)

    'デバイスコンテキストを解放
    Ret = Api_ReleaseDC(Picture2.GethWnd, hDC2)
End Sub

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