ベジェ曲線の描画(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