マウスドラッグでラベルコントロールの移動と直線の描画その2、頂点の追加と削除
続き
頂点の追加と削除
移動させたLabelには右クリックした場所の色を表示している
線の色はアクアでARGB(255,0,255,255)
線以外の場所の色は無色ARGB(0,0,0,0)
右クリックした場所の色がアクアなら頂点追加のメニューを表示するようにしている
右クリックした場所が頂点(ラベル)なら削除のメニューを表示
頂点を右クリックした時用と線を右クリックした時用の二つ追加
プロパティのItemsのコレクションの右のボタンを押すと
項目を追加したり設定の画面↓
一個追加して
右クリックメニュー自体の名前はめんどくさくてそのままの
ContextMenuStrip1
項目の名前はToolStripMenuItemPointDeleteにしてみた(長い)
項目の表示は「点の削除」にしてみた
こっちもメニュー自体の名前はそのまま
項目の名前は「ToolStripMenuItem頂点の追加」にした
やっぱり日本語入れたほうがいいな
項目の表示名は「頂点の追加」
線は画像なので画像を表示するexPictureBoxの上にあることになる
なのでこの右クリックメニューはexPictureBoxに関連付ける
これでexPictureBoxのどこを右クリックしてもメニューが表示されるようになる
でも今回はexPictureBoxのどこでもではなく線の上だけで表示したいので
ここは「なし」のままにしておく
exPictureBoxを右クリックした時にその場所が線の上か
線の上ではないのかを判定して
線の上なら右クリックメニューを設定して
線の上ではないなら右クリックメニューを「なし」にする
処理をMouseDownイベントように書いた
MouseDownはクリックボタンを押し下げた時でボタンを上げる前の状態
Private Sub クリックした位置で右クリックメニューの有無(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Right Then
Dim bmp As New Bitmap(Me.ExPictureBox1.Image)
Dim col As Color = bmp.GetPixel(e.X, e.Y)
Me.Label1.Text = col.ToString
If col <> Color.FromArgb(0, 0, 0, 0) Then 'ライン上なら右クリックメニュー表示
Me.ExPictureBox1.ContextMenuStrip = Me.ContextMenuStrip2
mousePoint = e.Location 'クリックした位置を記憶(expicturebox上の座標)
focusPic = Me.ExPictureBox1 'sender
Else
Me.ExPictureBox1.ContextMenuStrip = Nothing 'ライン外なら何も表示しない
End If
bmp.Dispose()
End If
End Sub
exPictureBoxの画像をBitmapで読み込んでGetPixelで色の判定をする
クリックした位置の取得はマウスイベントの引数?のeからできる
色がARGB(0,0,0,0)なら色が付いていないってことだから線の上ではないことになる
のでexPictureBoxに右クリックメニューを「なし」にする
Me.ExPictureBox1.ContextMenuStrip = Nothing
「なし」にする場合はNothingでいいみたい
逆に色がARGB(0,0,0,0)以外なら線の上なのでメニューを指定する
Me.ExPictureBox1.ContextMenuStrip = Me.ContextMenuStrip2
↑はexPictureBox1って決め打ちしてるけどsenderとかにすればいいのかも
mousePointとfocusPicの変数はそれぞれクリックした座標と
クリックしたexPictureBoxを入れておくもので後で使う
exPictureBoxのMouseDownイベント用なので設定
この処理はアプリの起動時の
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
に↓を追加
AddHandler ExPictureBox1.MouseDown, AddressOf クリックした位置で右クリックメニューの有無
exPictureBox1のMouseDownイベントに直接設定する場合
exPictureBoxを動的作成しないならこっちのほうがわかりやすい
頂点の追加をクリックした時に実行する処理
頂点の追加
新しい頂点の座標はさっきの右クリックメニューのところで取得した
mousePointに入っているのでこれでわかる
問題はどの頂点とどの頂点の間に入れればいいのか
頂点の順番で線は引かれる、4つ頂点があれば1から2、2から3、3から4
今のところはこれがうまくできなくて、変なところに入ってしまうことがある
すべての頂点の座標がわかっているんだから
たぶん中学生(小学生?)レベルの算数だと思うんだけどコレガワカラナイ
1次関数ってやつだと思う、直線のグラフを書くやつ
恥ずかしいけど載せていくスタイル、エクセルでなんかやってるところ
新しい頂点の座標が二つの頂点のx,yそれぞれの値の間にあれば
そこでいいんじゃないかってひねり出した方法で処理している
これはあとでググってみる