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

書庫全体表示

マウスドラッグでラベルコントロールの移動と直線の描画
イメージ 7
4つの点を通過する直線をPictureBoxに表示
点をマウスドラッグで移動して線もそれに合わせて描画しているところ

線を描画するにはPoint(点)が必要
そのPointの情報をPictureBoxに持たせたかったので
クラスの継承っていう機能を使ってexPictureBoxってのを新たに作った
イメージ 1
クラスの追加
ソリューションエクスプローラーから右クリックメニューで
追加→クラス
↓が開いて
イメージ 2
名前はexPictureBoxにしてみた

イメージ 3
exPictureBoxに書いたのはこれだけ
Public Class exPictureBox
    Inherits PictureBox
    'Public PointN As New ArrayList
    Public PointN As New Generic.List(Of Point)

    Public Property exPoint() As Generic.List(Of Point)
        Get
            Return PointN
        End Get
        Set(value As Generic.List(Of Point))
            PointN = value
        End Set
    End Property

End Class

このクラスの目的はPictureBoxの機能+Pointを複数持たせること
Pointの情報は読み書きができること
解説サイトVB中学校を見ながら見よう見まねで書いてみた
よくわかっていないけど期待通りに動いている

2番目のPoint情報にPoint(1,1)を書き込む(書き換え)時は
Me.ExPictureBox1.PointN(2) = New Point(1, 1)
これでいいみたい、楽ちん

2番めのPoint情報を読み込む(取得する)時は
Dim pn As New Point(Me.ExPictureBox1.PointN(2))


作ったクラスはデザイン画面のツールボックスにも表示されるようになる
イメージ 5
面白い
ここから追加できる

新しく作ったプロパティの名前はexPointにしてみた
これがデザイン画面のプロパティの画面でも表示されるみたいなのはさっき気づいた
イメージ 4
なのでここからでも設定できるみたい
今回は気づかなかったので中に書いた
        With Me.ExPictureBox1.PointN
            .Add(New Point(0, 0))
            .Add(New Point(150, 40))
            .Add(New Point(80, 100))
            .Add(New Point(100, 150))
        End With

ここでデザイン画面全体図
イメージ 6
今回使っているのは
exPictureBox1と点表示ボタンだけ

これでexPictureBoxには複数のPointを持たせることができたので
あとはこの情報を元に線を描画
Dim canvas As New Bitmap(Me.ExPictureBox1.Width, Me.ExPictureBox1.Height)
Dim g As Graphics = Graphics.FromImage(canvas)
Dim pss() As Point
pss = DirectCast(Me.ExPictureBox1.PointN.ToArray, Point())
g.DrawLines(Color.Aqua, pss)
Me.ExPictureBox1.Image = canvas
↑の中で見慣れないのが
pss = DirectCast(Me.ExPictureBox1.PointN.ToArray, Point())
これ
exPictureBoxのPoint(PointN)はCollectionのArrayListなんだけど
線を描画するときに使うPointは1次元配列なので変換する必要がある
もっとめんどくさい方法を想像していたけどこんな方法があった
今気づいたけどexPictureBoxって名前つけたんだけど
最初のeがEに変換されているなあExPictureBox1
最初の文字は大文字じゃないといけないのかしら


点表示ボタン
Dim iLabel as Label
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim exp As Generic.List(Of Point)
exp = Me.ExPictureBox1.PointN
Me.iLabel = New Label()
With Me.iLabel
.Width = 5
.Height = 5
.BackColor = Color.Black
.Location = exp(i)
'Name = "exL" & i 'Withの中だとName、tag、textが空白になる
'Tag = i
'Text = i
End With
Me.iLabel.Name = i
Me.iLabel.Tag = i
iLabel.Text = i

Me.ExPictureBox1.Controls.Add(iLabel)
AddHandler iLabel.MouseDown, AddressOf マウスダウンドラッグ開始
AddHandler iLabel.MouseMove, AddressOf マウスムーブドラッグ中

end sub
点の表示はLabelコントロールにしてみた
大きさは5x5、色は黒
マウスドラッグで移動するイベントに関連付け
うまくいかないのが名前とタグとテキストの指定
これは動かすときにどのラベルをクリックしたのか判別するのに使う用
目印だからどれでもいいんだけどWithを使ったなかだと空白になってしまう

マウスドラッグでラベルを移動して、線を描画する
Dim Pen2 As New Pen(Color.Aqua, 3)
Dim startP as Point
    Private Sub マウスダウンドラッグ開始(ByVal sender As Object, ByVal e As MouseEventArgs)’マウスをおした時、MouseDown
        startP = New Point(e.Location)
    End Sub

↓MouseMoveイベント
    Private Sub マウスムーブドラッグ中(sender As Object, e As MouseEventArgs)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim newL As Point
            Dim oBj As Control
            oBj = DirectCast(sender, Label)
            newL = New Point(e.X - startP.X + oBj.Location.X, e.Y - startP.Y + oBj.Location.Y)
            oBj.Location = newL 'ラベルの表示場所決定

            '線の描画
            Dim canvas As New Bitmap(Me.ExPictureBox1.Width, Me.ExPictureBox1.Height)
            Dim g As Graphics = Graphics.FromImage(canvas)
            Dim i = oBj.Tag ' sender.tag
            Me.ExPictureBox1.PointN(i) = newL
            Dim pss() As Point
            pss = DirectCast(Me.ExPictureBox1.PointN.ToArray, Point())
            g.DrawLines(Pen2, pss)
            Me.ExPictureBox1.Image = canvas
        End If
    End Sub
これもよくわかっていないけど動いている
Pixtack紫陽花でも折れ線や曲線をかけるようにしたいなあ
ダウンロード

参照したところ
VB コレクション - ArrayList, Hashtableなど
VB 中級講座 - 継承, Inherits, Overridable, Overrides
線を描く: .NET Tips: C#, VB.NET
VB.NETで作る! | ドラッグで移動できるコントロールを作る





関連記事
2019/08/23は5年後
DrawLinesで直線の描画と、その頂点を表示してマウスドラッグ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
https://blogs.yahoo.co.jp/gogowaten/16000619.html
継承を使わずに書いてみた結果、スッキリかけた気がする



  • 顔アイコン

    おっ。シェアが押されているっ(≧▽≦)やはり分かっている人はいるいる♪
    私は難しくって(ヾノ・∀・`)ムリムリでもいつも偉いなーって思うんですよ(*^^)v理解度が低いオバチャンですみません(^▽^;)

    あっ。今日、ブロ友さんに帽子渡して来ました。案の定ザリガニです(笑)色とデザインをちょっと変えただけです(^▽^;)
    私も後で載せようと思ったのですが、取りあえずザリガニパンチさんと言う方の記事貼っておきますね。

    http://blogs.yahoo.co.jp/zaryganipunch/46025679.html

    次は何を作ろうかと思っている所です♪
    変な物が良いなぁ〜( ̄ー ̄)ニヤリ

    [ 小梅ママ ]

    2014/12/19(金) 午後 9:43

  • 顔アイコン

    今回のようなプログラムの記事はわかっている人が見たら、うーん、そこはそうじゃないよーとか思っていそう…
    逆に知らない人が見たら、点を動かして何が面白いの?ってなりそう
    でも本人は楽しくてしょうがない状態w

    ザリガニだったwザリガニ帽子職人w
    前から見てもザリガニ後ろ姿も尻尾までザリガニしてますねえ
    これはかぶったらテンション上がりますね!
    次はザリガニ帽子以上に変なもの?…(゚A゚;)ゴクリ

    [ わてん@午後 ]

    2014/12/20(土) 午後 0:36

  • 顔アイコン

    > GIMPさん
    この記事がGIMPさんのソフト作りに少しでも参考になったようで、とても嬉しいです!
    何かを作るのって楽しいですよね
    コメントありがとうございました。

    [ わてん@午後 ]

    2018/3/18(日) 午前 10:34

  • 顔アイコン

    初めまして。仕事で使おうと思って参考にさせていただいています。プログラム歴は長いですが、VB.NETというか、オブジェクト指向のプログラムに慣れていないので、苦戦しています。

    expicutureboxというものを新たに作って、クラス継承をされていますが、picturebox1だけで、できないものなのでしょうか?

    もしよろしければ教えていただけると大変助かります。

    [ fin*erp*ck*r_ka**an ]

    2019/8/22(木) 午後 3:24

  • 顔アイコン

    > fin*erp*ck*r_ka**anさん
    コメントありがとうございます

    継承を使わずに普通のPictureBoxで書いてみました

    DrawLinesで直線の描画と、その頂点を表示してマウスドラッグ ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
    https://blogs.yahoo.co.jp/gogowaten/16000619.html

    [ わてん@午後 ]

    2019/8/23(金) 午後 0:57

  • 顔アイコン

    > わてん@午後さん
    返信、遅くなりまして申し訳ございません。
    わざわざ書き直していただいて感謝、感謝です。
    これから、じっくりと拝見させていただきます。
    本当にありがとうございました。

    [ fin*erp*ck*r_ka**an ]

    2019/8/29(木) 午前 11:54

  • 顔アイコン

    > fin*erp*ck*r_ka**anさん
    WindowsForm+VBは久しぶりだったんですけど、なんとか書いてみました。何かの助けになれば嬉しいです!

    [ わてん@午後 ]

    2019/8/31(土) 午前 10:34

開くトラックバック(1)

本文はここまでですこのページの先頭へ
みんなの更新記事