選択されているパスを線分の集合に変換(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