クリッピング領域とパスを結合(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