ここから本文です
ベランダ菜園とWindows用アプリ作成とExcel用アプリ(アドイン)作成

書庫全体表示

Windows FormアプリをVisual Basicで
イメージ 1
マウスドラッグでラベルコントロールの移動と直線の描画


2014/12/19は5年前
マウスドラッグでラベルコントロールの移動と直線の描画 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/12509328.html
このときと同じなんだけど、書き直してみた



イメージ 3
直線はGraphicsクラスのDrawLinesを使って描画
DrawLinesはPointの配列を渡すと、各Point間を直線で描画してくれる

各Pointの■はLabelを使って表示、これをマウスドラッグで移動できるようにして、移動させたら直線も再描画

LabelとPointの関連付けは、LabelのTagプロパティに通し番号を入れて、Pointの配列のindexと合わせるようにしている

ここまでは5年前と同じ

書き直したところ
5年前はPictureBoxを継承したクラスを作成して、そこに各Pointの情報を記録していたけど、今回のは新しいクラスを作成しないで書いてみた



Form1.vb

'直線の描画
'頂点はLabelコントロールで表示して、マウスドラッグで移動できるように


Public Class Form1
Private beginPoint As Point 'マウスドラッグ開始点記録用
Private myPen As New Pen(Brushes.Magenta, 5) '直線用のPen
Private myPoints As New List(Of Point) '頂点座標群記録用

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Call MyInitialize()
End Sub

'初期化
Private Sub MyInitialize()
'初期座標設定
myPoints = New List(Of Point)(New Point() {
  New Point(0, 0),
  New Point(150, 40),
  New Point(80, 100),
  New Point(100, 150)})
'頂点表示用のLabel作成
For i = 0 To myPoints.Count - 1
Call MakeLabel(myPoints(i), i)
Next

'直線を描画
Call MyDrawLines()

End Sub

'左クリック時の処理
Private Sub MyMouseDown(sender As Object, e As MouseEventArgs)
beginPoint = e.Location
End Sub

'マウスドラッグ中処理
Private Sub MyMouseMove(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim myLabel = DirectCast(sender, Label)
Dim newLocate As Point
newLocate = New Point(e.X - beginPoint.X + myLabel.Location.X,
  e.Y - beginPoint.Y + myLabel.Location.Y)
myLabel.Location = newLocate
myPoints(myLabel.Tag) = newLocate
Call MyDrawLines()
End If
End Sub

'直線を描画
Private Sub MyDrawLines()
Dim canvas As New Bitmap(Me.PictureBox1.Width, Me.PictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
g.DrawLines(myPen, myPoints.ToArray)
g.Dispose()
Me.PictureBox1.Image = canvas

End Sub

''' <summary>
''' 頂点表示用のLabel作成
''' </summary>
''' <param name="locate">頂点座標</param>
''' <param name="number">通し番号(何番目の頂点なのか識別用)</param>
''' <returns></returns>
Private Function MakeLabel(locate As Point, number As Integer) As Point
Dim myLabel = New Label()
With myLabel
.Width = 10
.Height = 10
.BackColor = Color.Black
.Location = locate
.Tag = number 'Tagに通し番号を記録
End With
Me.PictureBox1.Controls.Add(myLabel)
'マウスイベント時の処理追加
AddHandler myLabel.MouseDown, AddressOf MyMouseDown
AddHandler myLabel.MouseMove, AddressOf MyMouseMove

End Function

End Class


デザイン画面
イメージ 2
PictureBox1を追加しただけ




ギットハブ




関連記事
マウスクリックでCanvasに直線を描画その2、Polyline、WPFとC# ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/15540488.html






ブログ
平均室温が32度を超えたあたりで睡眠不足で頭が休眠状態になるけど
今日は珍しく涼しい(今の室温30.9度)ので、なんとか動けて
配列の初期化の方法をググるところから開始
このまま涼しくなってくれるといいねえ






わてん@午後
わてん@午後
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

スマートフォンで見る

モバイル版Yahoo!ブログにアクセス!

スマートフォン版Yahoo!ブログにアクセス!

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最新のコメント最新のコメント

すべて表示

Yahoo!からのお知らせ

検索 検索

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ

[PR]お得情報

ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!
数量限定!イオンおまとめ企画
「無料お試しクーポン」か
「値引きクーポン」が必ず当たる!
お肉、魚介、お米、おせちまで
おすすめ特産品がランキングで選べる
ふるさと納税サイト『さとふる』

その他のキャンペーン

みんなの更新記事