左側に表示されているピクチャボックスは、イメージの描画領域である。この描画領域をクリックしていくことにより、直線やベジエ曲線を描画していく。右側のオプションボタンは、描画モードを表す。“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”で保存したファイルを読み込み、描画領域へ描画する。
右側に表示されているラベルは、現在描画しているイメージに含まれる点の数である。
************** 以下は、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