選択されているパスを線分の集合に変換(T) <TOP>
FlattenPath
デバイスコンテキストに選択されているパスのすべての曲線を、一連の直線に変換
BeginPath
hDCで指定されたデバイスコンテキストのパスの作成
Ellipse
楕円の描画
EndPath
BeginPathで開始したパスの作成を終了
GetPath
指定されたデバイスコンテキスト内で選択されたパス内の直線の端点および曲線の制御点を定義する座標を取得
GetDC
デバイスコンテキストのハンドルを取得
ReleaseDC
デバイスコンテキストを解放
領域を指定して楕円を描画しています。その楕円のパスを線分群に変換し、更に線上を基点とした乱数を発生させて点を描画しています。
'================================================================ '= 選択されているパスを線分の集合に変換(T) '= (FlattenPath.bas) '================================================================ #include "Windows.bi" Type POINTAPI x As Long y As Long End Type ' 現在のデバイスコンテキストに選択されているパスのすべての曲線を、一連の直線に変換 Declare Function Api_FlattenPath& Lib "gdi32" Alias "FlattenPath" (ByVal hDC&) ' hDCで指定されたデバイスコンテキストのパスの作成 Declare Function Api_BeginPath& Lib "gdi32" Alias "BeginPath" (ByVal hDC&) ' 楕円の描画 Declare Function Api_Ellipse& Lib "gdi32" Alias "Ellipse" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&) ' BeginPathで開始したパスの作成を終了 Declare Function Api_EndPath& Lib "gdi32" Alias "EndPath" (ByVal hDC&) ' 指定されたデバイスコンテキスト内で選択されたパス内の直線の端点および曲線の制御点を定義する座標を取得 Declare Function Api_GetPath& Lib "gdi32" Alias "GetPath" (ByVal hDC&, ByRef Points As POINTAPI, ByRef Types As Byte, ByVal PointNum&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 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 Var Shared Picture1 As Object Picture1.Attach GetDlgItem("Picture1") Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Static PI As Single Var hDC As Long Var PointNum As Long Var pa(10000) As POINTAPI Var Types(10000) As Byte Var i As Long Var j As Long Var x As Long Var y As Long Var a As Single Var b As Single Var r As Single Var Ret As Long PI = 3.14159 hDC = Api_GetDC(Picture1.GethWnd) 'パス作成 Ret = Api_BeginPath(hDC) Ret = Api_Ellipse(hDC, 10, 10, 150, 90) Ret = Api_EndPath(hDC) '元のEllipseを確認 Ret = Api_Ellipse(hDC, 10, 10, 150, 90) '線分の集合に変換 Ret = Api_FlattenPath(hDC) '線分の座標を取得 PointNum = Api_GetPath(hDC, pa(0), Types(0), 10000) If PointNum = 0 Then Z% = MessageBox("", "座標を取得できません!", 0, 2) Exit Sub End If '点描 For i = 0 To PointNum - 2 For j = 1 To 20 a = Rnd b = Rnd * PI * 2 r = Rnd * 10 x = pa(i).x * a + pa(i + 1).x * (1 - a) + r * Cos(b) y = pa(i).y * a + pa(i + 1).y * (1 - a) + r * Sin(b) Picture1.PSet(x, y), 5 Next Next End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End