ベジェ曲線の描画(V) <TOP>
ベジェ曲線を描画します。
PolyBezier ベジェ曲線を描画
BeginPath デバイスコンテキストのパスを作成
EndPath BeginPathの終了
FillPath 選択されているブラシでパスの内部を塗りつぶす
StrokeAndFillPath パスを描画し、その内部を選択されているブラシで塗りつぶす
GetStokObject ストックオブジェクトのハンドルを取得
SelectObject 指定したデバイスコンテキストのオブジェクトを解放
GetDC デバイスコンテキストを取得
ReleaseDC デバイスコンテキストを解放
ポイント(Pts)値を変えたときのベジェ曲線がどのように変化するのかを確認しています。
'================================================================ '= ベジェ曲線の描画(V)
'= (PolyBezier2.bas) '================================================================ #include "Windows.bi" Type POINTAPI X As Long Y As Long End Type ' ベジェ曲線を描画 Declare Function Api_PolyBezier& Lib "gdi32" Alias "PolyBezier" (ByVal hDC&, lppt As POINTAPI, ByVal cPoints&) ' hDCで指定されたデバイスコンテキストのパスの作成 Declare Function Api_BeginPath& Lib "gdi32" Alias "BeginPath" (ByVal hDC&) ' BeginPathで開始したパスの作成を終了 Declare Function Api_EndPath& Lib "gdi32" Alias "EndPath" (ByVal hDC&) ' 選択されているブラシによってパスの内部を塗りつぶす Declare Function Api_FillPath& Lib "gdi32" Alias "FillPath" (ByVal hDC&) ' パスを描画し、その内部を選択されているブラシによって塗りつぶす Declare Function Api_StrokeAndFillPath& Lib "gdi32" Alias "StrokeAndFillPath" (ByVal hDC&) ' ストックオブジェクトのハンドルを取得 Declare Function Api_GetStockObject& Lib "gdi32" Alias "GetStockObject" (ByVal nIndex&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, 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 BLACK_BRUSH 4 '黒 #define DKGRAY_BRUSH 3 '暗い灰色 #define GRAY_BRUSH 2 '灰色 #define LTGRAY_BRUSH 1 '明るい灰色 #define WHITE_BRUSH 0 '白 #define BLACK_PEN 7 Var Shared Timer1 As Object Var Shared Picture1 As Object Var Shared Edit(7) As Object Var Shared Text1 As Object Timer1.Attach GetDlgItem("Timer1") Picture1.Attach GetDlgItem("Picture1") For i = 0 To 7 Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) Edit(i).SetFontSize 14 Next Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Timer1.SetInterval 100 Timer1.Enable -1 End Sub '================================================================ '= '================================================================ Declare Sub Timer1_Timer edecl () Sub Timer1_Timer() Var hDC As Long Var Pts(3) As POINTAPI Var Cnt As Long Var OldPen As Long Var OldBrush As Long Var Ret As Long Picture1.cls hDC = Api_GetDC(Picture1.GethWnd) For Cnt = 0 To 3 Pts(Cnt).X = Val(Edit(Cnt).GetWindowText) Pts(Cnt).Y = Val(Edit(Cnt + 4).GetWindowText) Picture1.SetDrawWidth 5 Picture1.Pset(Pts(Cnt).X, Pts(Cnt).Y), Cnt + 2 Picture1.SetDrawWidth 0 Picture1.Symbol(Pts(Cnt).X + 5, Pts(Cnt).Y - 6), Trim$(Str$(Pts(Cnt).X)) & "," & Trim$(Str$(Pts(Cnt).Y)), 1, 1, Cnt + 2 Next OldPen = Api_SelectObject(hDC, Api_GetStockObject(BLACK_PEN)) OldBrush = Api_SelectObject(hDC, Api_GetStockObject(LTGRAY_BRUSH)) Ret = Api_BeginPath(hDC) Ret = Api_PolyBezier(hDC, Pts(0), 4) Ret = Api_EndPath(hDC) Ret = Api_StrokeAndFillPath(hDC) 'オフセット(右側ベジェ曲線) For Cnt = 0 To 3 Pts(Cnt).X = Pts(Cnt).X + 100 Next Ret = Api_BeginPath(hDC) Ret = Api_PolyBezier(hDC, Pts(0), 4) Ret = Api_EndPath(hDC) Ret = Api_FillPath(hDC) Ret = Api_PolyBezier(hDC, Pts(0), 4) Ret = Api_SelectObject(hDC, OldPen) Ret = Api_SelectObject(hDC, OldBrush) Ret = Api_ReleaseDC(Picture1.GethWnd, hDC) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End