【API Function】


線分の描画
 線分を描画するには、一般的にLineメソッドが使われますが、これは高速な 描画や複雑な図形を描くのには不適なものです。それを補うものとして、 直線描画APIがあります。直線描画APIは、その用途に合わせて複数 用意されています。

API関数 用途 使用例
MoveToEx
LineTo
連続した線分 MoveToEx Picture1.hdc, sx, sy, p
LineTo Picture1.hdc, sx + pw, sy
Polyline 図形的な線分 Polyline Picture1.hdc, p(0), UBound(p) + 1
MoveToEx
PolylineTo
図形的な線分 MoveToEx Picture1.hdc, sx, sy, pt
PolylineTo Picture1.hdc, p(0), UBound(p) + 1
PolyPolyline 複数の図形 PolyPolyline Picture1.hdc, p(0), pc(0), UBound(pc) + 1


 どの関数もそれほどかわりないのですが、MoveTo-LineTo関数が 一本一本線分を引いていくのに対し、Polyline等は配列に格納された点を 一括して線分として描画するので、後者の方がより高速に描け、また図形 描画に優れているといえます。
 MoveTo関数は、描画開始点を設定するための関数なので、描画開始点が無関係 なPolylineとPolyPolylineでは呼び出す必要はありません。なお、LineTo 関数を呼び出した後の描画開始点はLineTo関数で指定した点になります。  宣言コードと引数についての説明は以下に示すとおりです。

'POINT構造体
Private Type POINTAPI
    x As Long
    y As Long
End Type

'直線描画API
'===========================================================
'MoveToEx    描画開始点を新しい点に設定する
'---------引数----------------------------------------------
'hdc:描画先デバイスコンテキスト
'x,y:新しい座標
'lpPoint:以前の描画開始点が格納される
'===========================================================
Private Declare Function MoveToEx Lib "gdi32" (ByVal _
        hdc As Long, ByVal x As Long, _
        ByVal y As Long, lpPoint As POINTAPI) As Long

'===========================================================
'LineTo    描画開始点から指定された終点までの線分を描画する
'---------引数----------------------------------------------
'hdc:描画先デバイスコンテキスト
'x,y:終点座標
'(関数が成功すると、指定した終点が描画開始点に)
'===========================================================
Private Declare Function LineTo Lib "gdi32" (ByVal _
        hdc As Long, ByVal x As Long, _
        ByVal y As Long) As Long

'===========================================================
'Polyline    指定された点を結ぶ連続した線分を、一括して描画
'---------引数----------------------------------------------
'hdc:描画先デバイスコンテキスト
'lpPoint:点の座標の配列
'nCount:点の数
'(現在の描画開始点を使用しない)
'===========================================================
Private Declare Function Polyline Lib "gdi32" ( _
        ByVal hdc As Long, lpPoint As POINTAPI, _
        ByVal nCount As Long) As Long

'===========================================================
'PolylineTo    指定された点を結ぶ連続した線分を、一括して描画
'---------引数----------------------------------------------
'hdc:描画先デバイスコンテキスト
'lppt:点の座標の配列
'nCount:点の数
'(現在の描画開始点を使用する)
'===========================================================
Private Declare Function PolylineTo Lib "gdi32" ( _
        ByVal hdc As Long, lppt As _
        POINTAPI, ByVal cCount As Long) As Long

'===========================================================
'PolyPolyline    連続した線分を、複数個描画画
'---------引数----------------------------------------------
'hdc:描画先デバイスコンテキスト
'lppt:点の座標の配列
'lpdwPolyPoints:それぞれの連続した線分が持つ点の数
'cCount:連続した線分の数
'===========================================================
Private Declare Function PolyPolyline Lib "gdi32" _
        (ByVal hdc As Long, lppt As POINTAPI, _
        lpdwPolyPoints As Long, _
        ByVal cCount As Long) As Long

 上記の関数の中でPolyPolylineは少し難しいので、以下に使用例を示しました。 引数lpptには座標データが格納された配列変数、lpdwPolyPointsには 描く連続した線分図形の各頂点数、cCountには連続した線分図形の数を指定する ことに注意します。Picture1オブジェに黄色の三角形2つが描かれ、星形のようにみえます。

    Dim p(8 - 1) As POINTAPI
    Dim pc(2 - 1) As Long
    Dim sx As Long, sy As Long
    Dim pw As Long, ph As Long
    Dim i As Long
    Dim oldForeColor As Long
    oldForeColor = Picture1.ForeColor
    Picture1.ForeColor = RGB(255, 255, 0)
    sx = 150&: sy = 100&
    pw = 30&: ph = 60&
    p(0).x = sx: p(0).y = sy
    p(1).x = sx + pw: p(1).y = sy + ph
    p(2).x = sx - pw: p(2).y = sy + ph
    p(3).x = sx: p(3).y = sy
    p(4).x = sx - pw: p(4).y = sy + ph \ 3&
    p(5).x = sx + pw: p(5).y = sy + ph \ 3&
    p(6).x = sx: p(6).y = sy + ph + ph \ 3&
    p(7).x = sx - pw: p(7).y = sy + ph \ 3&
    pc(0) = 4&: pc(1) = 4&
    PolyPolyline Picture1.hdc, p(0), pc(0), UBound(pc) + 1
    Picture1.ForeColor = oldForeColor


API Functionインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.