弓形の図形の描画 <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