楕円弧を描画(V)          <TOP>


グラフでよく見かけます。楕円の一部を切り取り右にずらして描画しています。

数値の位置関係を把握するため、10ドット間隔の線を引いています。

SetArcDirection デバイスコンテキストに設定されている、円弧の現在の方向を設定

ArcTo 楕円弧を描画

MoveToEx 現在位置を受け取るバッファを参照で指定

LineTo 現在の位置から終点までを直線で描画

 

  

 

'================================================================
'= 楕円弧を描画(V)
'=    (SetArcDirection.bas)
'================================================================
#include "Windows.bi"

' デバイスコンテキストに設定されている、円弧の現在の方向を設定
Declare Function Api_SetArcDirection& Lib "gdi32" Alias "SetArcDirection" (ByVal hDC&, ByVal ArcDirection&)

' 楕円弧を描画
Declare Function Api_ArcTo& Lib "gdi32" Alias "ArcTo" (ByVal hDC&, ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&, ByVal X3&, ByVal Y3&, ByVal X4&, ByVal Y4&)

' 現在位置を受け取るバッファを参照で指定
Declare Function Api_MoveToEx& Lib "gdi32" Alias "MoveToEx" (ByVal hDC&, ByVal x&, ByVal y&, ByVal lpPoint As Any)

' 現在の位置から終点までを直線で描画
Declare Function Api_LineTo& Lib "gdi32" Alias "LineTo" (ByVal hDC&, ByVal x&, ByVal y&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得。その後、GDI 関数を使って、返されたデバイスコンテキスト内で描画を行える
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define AD_COUNTERCLOCKWISE 1  '反時計回り
#define AD_CLOCKWISE 2         '時計回り

Var Shared Picture1 As Object
Picture1.Attach getDlgItem("Picture1")

Var Shared hDC As Long
Var Shared hWnd As Long

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var x As Integer
    Var y As Integer

    hWnd = Picture1.GethWnd

    For x = 0 To Picture1.GetWidth Step 10
        Picture1.Line(x, 0) - (x, picture1.GetHeight), , 14
    Next

    For y = 0 To Picture1.GetHeight Step 10
        Picture1.Line(0, y) - (Picture1.GetWidth, y), , 14
    Next
End Sub

'================================================================
'= 反時計回り
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Ret As Long

    hDC = Api_GetDC(hWnd)

    Ret = Api_SetArcDirection(hDC, AD_COUNTERCLOCKWISE)
    Ret = Api_MoveToEx(hDC, 110, 100, 0)
    Ret = Api_ArcTo(hDC, 10, 30, 210, 180, 210, 30, 210, 180)
    Ret = Api_LineTo(hDC, 110, 100)

    Ret = Api_ReleaseDC(hWnd, hDC)
End Sub

'================================================================
'= 時計回り
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var Ret As Long

    hDC = Api_GetDC(hWnd)

    Ret = Api_SetArcDirection(hDC, AD_CLOCKWISE)
    Ret = Api_MoveToEx(hDC, 120, 100, 0)
    Ret = Api_ArcTo(hDC, 20, 30, 220, 180, 220, 30, 220, 180)
    Ret = Api_LineTo(hDC, 120, 100)

    Ret = Api_ReleaseDC(hWnd, hDC)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End