弓形の図形の描画          <TOP>


弓形の図形を描画します。

Chord 円周の一部を切り取り、切り取った部分を直線で結んだ形の図形を描画

 

円を包含する矩形(赤で示しています)を指定して、その中に開始点と終点を指定することで円・円弧を描画します。

(Left, Top)、(Right, Bottom)を対角とする矩形領域に内接する楕円を用意し、円周とその中心から(XRadial1,YRadial1)への直線との交点を開始点、円周とその中心から(XRadial2,YRadial2)への直線との交点を終了点とした時、開始点から終了点への直線、開始点から終了点への円弧を描画します。

位置関係を把握するため、10ピクセル毎に線を引いています。

ラジオボタンで描画開始および終了の値を変え描画される図形を確認しています。

  

 

'================================================================
'= 弓形の図形の描画
'=     (Chord.bas)
'================================================================
#include "Windows.bi"

' 円周の一部を切り取り、切り取った部分を直線で結んだ形の図形を描画
Declare Function Api_Chord& Lib "gdi32" Alias "Chord" (ByVal hDC&, ByVal Left&, ByVal Top&, ByVal Right&, ByVal Bottom&, ByVal XRadial1&, ByVal YRadial1&, ByVal XRadial2&, ByVal YRadial2&)

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

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

Type RECT
    x  As Long
    y  As Long
    dx As Long
    dy As Long
End Type

Var Shared Picture1 As Object
Var Shared Radio1 As Object
Var Shared Radio2 As Object
Var Button1 As Object

Picture1.Attach GetDlgItem("Picture1")
Radio1.Attach GetDlgItem("Radio1") : Radio1.SetFontSize 12
Radio2.Attach GetDlgItem("Radio2") : Radio2.SetFontSize 12
Button1.Attach GetDLgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Function Index bdecl () As Integer
Function Index()
    Index = val(Mid$(GetDlgRadioSelect("Radio1"), 6)) -1
End Function

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var rct As RECT
    Var hWnd As Long
    Var hDC As Long
    Var Ret As Long

    hWnd = Picture1.GethWnd
    hDC = Api_GetDC(hWnd)

    rct.x = 20
    rct.y = 30
    rct.dx = 220
    rct.dy = 170

    Picture1.line(rct.x, rct.y)-(rct.dx, rct.dy),,5,bf
    For x = 0 To Picture1.GetWidth Step 10
        Picture1.line(x, 0)-(x, Picture1.GetHeight),, 1
    Next
    For y = 0 To Picture1.GetHeight Step 10
        Picture1.line(0, y)-(Picture1.GetWidth, y),, 1
    Next

    If Index = 0 Then
        Ret = Api_Chord(hDC, rct.x, rct.y, rct.dx, rct.dy, 120, 220, 60, 40)
    Else
        Ret = Api_Chord(hDC, rct.x, rct.y, rct.dx, rct.dy, 60, 40, 120, 220)
    End If

    Ret = Api_ReleaseDC(hWnd, hDC)
End Sub

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