PolyDrawの例(VB)

説明:

PolyDrawを使用した簡単なペイントツールを例示する。本サンプルは、直線およびベジエ曲線を描画できる。また、描画した図形をファイルへ保存したり、ファイルから読み込んだりすることが可能である。

左側に表示されているピクチャボックスは、イメージの描画領域である。この描画領域をクリックしていくことにより、直線やベジエ曲線を描画していく。右側のオプションボタンは、描画モードを表す。“MoveTo”は、イメージの描画を開始する点の指定を行う。“LineTo”は、直線を描画する。“BezierTo”は、ベジエ曲線を描画する。

描画モードが“MoveTo”の時に描画領域をクリックすると、イメージの描画開始点ができる。

描画モードが“LineTo”の時に描画領域をクリックすると、クリックした位置を終点とする直線が描画される。始点は、“MoveTo”モードで指定した点、または最後に描画した直線の終点、または最後に描画したベジエ曲線の終点である。“LineTo”モードで、描画領域を連続してクリックすることにより、連続した折れ線を描画することができる。新たな折れ線を描画したい場合は、再び“MoveTo”で描画開始点を指定する。

描画モードが“BezierTo”の時は、ベジエ曲線を描画することができる。ベジエ曲線の描画には少なくとも三点の指定が必要なため、ベジエ曲線を描画するには少なくとも描画領域を三回クリックしなければならない。三回クリックするまでの間は、描画領域には何も描画されない。

“BezierTo”モードで一回、または二回描画領域をクリックした時点で、モードを変更してはならない。“BezierTo”モードの途中で他のモードの描画を行った場合、動作は保証されない。

閉じた図形を描画するには、“CloseFig”というチェックボックスを利用することも可能である。“CloseFig”は、最後に“MoveTo”で指定した描画開始点へ、直線を描画する機能である。“LineTo”モードの時に、“CloseFig”をチェックしてから描画領域をクリックすると、クリックした位置への直線が描画されると同時に、クリックした位置から最後に“MoveTo”で指定した描画開始点への直線も描画される。同様に、“BezierTo”モードでベジエ曲線の最後の点を指定しようとしているときに、“CloseFig”をチェックしてから描画領域をクリックすると、クリックした位置までのベジエ曲線が描画されると同時に、クリックした位置から最後に“MoveTo”で指定した描画開始点への直線も描画される。

“BezierTo”モードで、一回目、または二回目の描画領域クリックの際に“CloseFig”をチェックしてはならない。“BezierTo”モードのときは、三回目の描画領域クリックの際のみ“CloseFig”をチェックできる。

右側に表示されている“New”“Save”“Load”の三つのボタンは、それぞれ新規、保存、読み込みを表す。

“New”ボタンを押下すると、描画領域がクリアされ、新規にイメージを作成することができる。

“Save”ボタンを押下すると、描画したイメージがファイルへ保存される。保存されるディレクトリはアプリケーションのディレクトリであり、ファイル名は“TinyDraw.dat”と命名される。

“Load”ボタンを押下すると、上記“Save”で保存したファイルを読み込み、描画領域へ描画する。

右側に表示されているラベルは、現在描画しているイメージに含まれる点の数である。

キーワード:

PolyDraw

サンプルコード:

************** 以下は、modDecls.bas **************

Attribute VB_Name = "modDecls"
Option Explicit

Public Type POINT
    X As Long
    Y As Long
End Type

Declare Function PolyDraw Lib "gdi32" ( _
    ByVal hDC As Long, _
    ByRef Points As POINT, _
    ByRef Types As Byte, _
    ByVal PointNum As Long) As Long

Public Const PT_MOVETO As Long = &H6
Public Const PT_LINETO As Long = &H2
Public Const PT_BEZIERTO As Long = &H4
Public Const PT_CLOSEFIGURE  As Long = &H1

'オプションボタンの種別を表す定数
Public Const DRAWTYPE_MOVETO As Long = 0
Public Const DRAWTYPE_LINETO As Long = 1
Public Const DRAWTYPE_BEZIERTO As Long = 2


************** 以下は、frmMain.frm **************

VERSION 5.00
Begin VB.Form frmMain 
   BorderStyle     =   3  '固定ダイアログ
   Caption         =   "Tiny Draw"
   ClientHeight    =   5280
   ClientLeft      =   1125
   ClientTop       =   2370
   ClientWidth     =   6720
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   5280
   ScaleWidth      =   6720
   ShowInTaskbar   =   0   'False
   Begin VB.CommandButton cmdNew 
      Caption         =   "New"
      Height          =   255
      Left            =   5160
      TabIndex        =   8
      Top             =   3000
      Width           =   1215
   End
   Begin VB.CommandButton cmdLoad 
      Caption         =   "Load"
      Height          =   255
      Left            =   5160
      TabIndex        =   7
      Top             =   3720
      Width           =   1215
   End
   Begin VB.CommandButton cmdSave 
      Caption         =   "Save"
      Height          =   255
      Left            =   5160
      TabIndex        =   6
      Top             =   3360
      Width           =   1215
   End
   Begin VB.PictureBox picView 
      AutoRedraw      =   -1  'True
      Height          =   4695
      Left            =   360
      ScaleHeight     =   309
      ScaleMode       =   3  'ピクセル
      ScaleWidth      =   301
      TabIndex        =   4
      Top             =   240
      Width           =   4575
   End
   Begin VB.CheckBox chkClose 
      Caption         =   "CloseFig"
      Height          =   180
      Left            =   5160
      TabIndex        =   3
      Top             =   1440
      Width           =   1335
   End
   Begin VB.OptionButton optDrawType 
      Caption         =   "BezierTo"
      Height          =   255
      Index           =   2
      Left            =   5160
      TabIndex        =   2
      Top             =   720
      Width           =   1335
   End
   Begin VB.OptionButton optDrawType 
      Caption         =   "LineTo"
      Height          =   255
      Index           =   1
      Left            =   5160
      TabIndex        =   1
      Top             =   480
      Width           =   1335
   End
   Begin VB.OptionButton optDrawType 
      Caption         =   "MoveTo"
      Height          =   255
      Index           =   0
      Left            =   5160
      TabIndex        =   0
      Top             =   240
      Value           =   -1  'True
      Width           =   1335
   End
   Begin VB.Label lblPointNum 
      BorderStyle     =   1  '実線
      Height          =   255
      Left            =   5160
      TabIndex        =   5
      Top             =   4680
      Width           =   1215
   End
End
Attribute VB_Name = "frmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Dim Points() As POINT
Dim Types() As Byte
Dim PointNum As Long

'マウスカーソルの座標
Dim MouseX As Long
Dim MouseY As Long

'描画モード
Dim DrawType As Long

' ファイルからイメージを読み込む
Private Sub cmdLoad_Click()
    
    Dim FileName As String 'ファイル名
    
    ' ファイル名の設定
    If Right(App.Path, 1) <> "\" Then FileName = FileName + "\"
    FileName = FileName = "TinyDraw.dat"

    'データの読み込み
    Open FileName For Binary As #1
    
    Get #1, , PointNum
    
    ReDim Points(PointNum - 1) As POINT
    ReDim Types(PointNum - 1) As Byte
    
    Get #1, , Points()
    Get #1, , Types()
    Close #1
    
    ' 読み込み結果を描画
    lblPointNum.Caption = PointNum
    picView.Cls
    PolyDraw picView.hDC, Points(0), Types(0), PointNum
    picView.Refresh
    
End Sub

' イメージをクリアする
Private Sub cmdNew_Click()

    PointNum = 0
    picView.Cls
    lblPointNum.Caption = PointNum

End Sub

' ファイルへイメージを保存
Private Sub cmdSave_Click()

    Dim FileName As String
    
    If PointNum = 0 Then
        MsgBox "no data found."
        Exit Sub
    End If
    
    ' ファイル名の設定
    If Right(App.Path, 1) <> "\" Then FileName = FileName + "\"
    FileName = FileName = "TinyDraw.dat"

    ' データの書き込み
    Open FileName For Binary As #1
    Put #1, , PointNum
    Put #1, , Points()
    Put #1, , Types()
    Close #1
    
    MsgBox "Complete."
    
End Sub

' ロード時処理
Private Sub Form_Load()

    optDrawType(DRAWTYPE_MOVETO).Value = True

End Sub

' 描画モード選択時処理
Private Sub optDrawType_Click(Index As Integer)

    DrawType = Index

End Sub

' ピクチャボックスクリック時処理
Private Sub picView_Click()

    ReDim Preserve Points(PointNum) As POINT
    ReDim Preserve Types(PointNum) As Byte
    
    ' クリックした座標の設定
    Points(PointNum).X = MouseX
    Points(PointNum).Y = MouseY
    
    ' 描画モードの設定
    Select Case DrawType
        Case DRAWTYPE_MOVETO: Types(PointNum) = PT_MOVETO
        Case DRAWTYPE_LINETO: Types(PointNum) = PT_LINETO
        Case DRAWTYPE_BEZIERTO: Types(PointNum) = PT_BEZIERTO
    End Select

    If chkClose.Value = vbChecked Then
        Types(PointNum) = Types(PointNum) Or PT_CLOSEFIGURE
        chkClose.Value = vbUnchecked
    End If
    
    PointNum = PointNum + 1
    
    ' 描画
    lblPointNum.Caption = PointNum
    PolyDraw picView.hDC, Points(0), Types(0), PointNum
    picView.Refresh

End Sub

' マウスカーソル移動時処理
Private Sub picView_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    ' 現在のマウスカーソルの座標を覚えておく
    MouseX = X
    MouseY = Y

End Sub

(original text:1999/02/23 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。