円弧を描画          <TOP>


円弧を描画します。

GetSysColorシステムの背景色を取得

AngleArc 中心点と半径を指定して円・円弧を描画

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

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

ArcTo 楕円弧を描画

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

 

例ではリサイズする毎に、楕円弧・円弧を描画しています。

  

 

'================================================================
'= 円弧を描画
'================================================================
#include "Windows.bi"

Type POINTAPI
    x As Long
    y As Long
End Type

' システムの背景色を取得
Declare Function Api_GetSysColor& Lib "user32" Alias "GetSysColor" (ByVal nIndex&)

' 中心点と半径を指定して円・円弧を描画
Declare Function Api_AngleArc& Lib "gdi32" Alias "AngleArc" (ByVal hDC&, ByVal x&, ByVal y&, ByVal dwRadius&, ByVal eStartAngle!, ByVal eSweepAngle!)

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

' デバイスコンテキストに設定されている、円弧の現在の方向を設定
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&, lpPoint As POINTAPI)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

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

#define COLOR_BTNFACE 15       'コマンドボタンの表面色
#define AD_CLOCKWISE 2         '時計回り
#define AD_COUNTERCLOCKWISE 1  '反時計回り

'================================================================
'=
'================================================================
Declare Sub MainForm_Resize edecl ()
Sub MainForm_Resize()
    Var rgbColor As Long
    Var PT As POINTAPI
    Var hDC As Long
    Var Ret As Long

    rgbColor = Api_GetSysColor(COLOR_BTNFACE)

    SetBackColor rgbColor
    Cls
    ShowWindow -1

    hDC = Api_GetDC(GethWnd)

    If APi_GetArcDirection(hDC) = AD_CLOCKWISE Then
        Ret = Api_SetArcDirection(hDC, AD_COUNTERCLOCKWISE)
    End If

    Ret = Api_MoveToEx(hDC, GetWidth - 20, GetHeight / 2, PT)

    Ret = Api_AngleArc(hDC, GetWidth / 2, GetHeight / 2, GetHeight / 2 - 20, 0, 180)

    Ret = Api_SetArcDirection(hDC, AD_CLOCKWISE)

    Ret = Api_ArcTo(hDC, 20, 0, GetWidth - 20, GetHeight, 0, GetHeight / 2, GetWidth, GetHeight / 2)

    Ret = Api_ReleaseDC(GethWnd, hDC)
End Sub

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