前回
gogowaten.hatenablog.com
マウスクリックでPictureBoxに直線を描く
クリックしたところを頂点にして直線を描くテスト完成図
はじめにもっと単純なものから作っていく
直線を描くには座標が二つ必要
1回めのマウスクリック座標と2回めのマウスクリック座標を取得して
これを元にして直線を描いてみる
デザイン画面
用意するのはPictureBoxだけ
変更するプロパティはBorderStyle=NoneをFixedSingle
これはただ見た目のためだけ
コードはこれ
Public Class Form1
Private PP(1) As Point’(Point)頂点座標の配列
Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
PP(0) = e.Location
End If
End Sub
Private Sub マウスムーブ(sender As PictureBox, e As MouseEventArgs) Handles PictureBox1.MouseMove
PP(1) = e.Location
Dim canvas As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
g.DrawLines(Pens.Red, PP)
Me.PictureBox1.Image = canvas
g.Dispose()
End Sub
End Class
マウスダウンイベントで1個目の座標を変数PPの0番目に入れて
マウスムーブイベントで2個めの座標を変数PPの1番目に入れる
と同時に赤色(Pens.red)で二つの頂点座標(PP)で直線描画して
PictureBox1に画像として表示
画像だとこう
これを実行すると
↓
クリックした場所からマウスカーソルのところまで直線が描かれる
クリックするたびに直線の始点は変更されて
以前の直線は消える
描いた直線は消えてほしくないので書き加えて
Public Class Form1
Private mp As New List(Of Point)
Private PP(1) As Point
Private LastP As Point
Private isDraw As Boolean = False
Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
isDraw = True
If e.Location <> LastP Then
LastP = e.Location
PP(0) = e.Location
mp.Add(e.Location)
If mp.Count >= 2 Then
Dim canvas As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
Dim mpp() As Point = DirectCast(mp.ToArray, Point())
g.DrawLines(Pens.Red, mpp)
Me.PictureBox1.BackgroundImage = canvas
g.Dispose()
End If
End If
End If
End Sub
Private Sub ダブルクリック(sender As PictureBox, e As MouseEventArgs) Handles PictureBox1.DoubleClick
isDraw = False
End Sub
Private Sub マウスムーブ(sender As PictureBox, e As MouseEventArgs) Handles PictureBox1.MouseMove
If isDraw Then
PP(1) = e.Location
Dim canvas As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
g.DrawLines(Pens.Red, PP)
Me.PictureBox1.Image = canvas
g.Dispose()
End If
End Sub
End Class
画像だとこう、これで完成で
実行して動かしているのが一番上のアニメーションgif
どんどんクリックしても線が消えないのは
今までクリックした座標を変数にどんどん追加して記録していって
クリックした(クリックダウンイベント)時に描画して
出来上がった画像をPictureBox1の
背景(BackgroundImage)に指定しているから
一方、マウスを動かしている(マウスムーブイベント)時は
最後にクリックした場所から今のマウスカーソルまでの直線だけを描画していて
出来上がった画像はPictureBox1の背景ではなく画像(Image)に指定している
これでなんとなくわかった
これを元にしてPixtack紫陽花の図形2の線の描画にうまく取り込めるかどうか
実行ファイルとソース
関連記事
2015/01/22は1日後
2018/06/06は3年5ヶ月後