2017-09-05 12 views
0

これが愚かな質問であれば私には許してもらえますが、経験はなく、この問題に対する答えは見つかりませんでした。WinFormsドラッグ・アンド・ドロップ:マウスを追う前にラベルが「飛び去る」

私はデータテーブル(treedata)に格納されたデータに応じて、コード内でパネル(Form8.Panel1)のラベルを入れている:

For i = 0 To _tree.treedata.Rows.Count - 1 

     Dim tb As New Label 

     tb.Name = CStr(i) 

     tb.AutoSize = True 
     tb.MaximumSize = New Size(tb.Width, 70) 
     tb.MinimumSize = New Size(tb.Width, 0) 

     tb.Location = New Point(treedata.Rows(i)(11),treedata.Rows(i)(4)) 

     AddHandler tb.MouseMove, AddressOf obj1_MouseMove 
     AddHandler tb.MouseDown, AddressOf obj1_MouseDown 

     Form8.Panel1.Controls.Add(tb) 

    Next 

MouseMoveイベントを使用して、私は上の周りにラベルをドラッグしますマウス次のパネル:

Private Sub obj1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 

    If e.Button = MouseButtons.Left Then 
     sender.Location = New Point(Form8.MousePosition.X, Form8.MousePosition.Y) 

    End If 
End Sub 

今何が起こるかは、私がラベルをクリックしたいとき、それは最初かなり離れてマウスの位置からのみ移動を意味する「離れてジャンプ」マウスを追跡することですマウスをたどります。ラベルのこの最初のジャンプを避けるために、誰が私が何を変えなければならないかを知っていますか?

+0

'MousePosition'はあなたが望むものではありません、あなたはそれらの座標を制御座標に変換する必要があります。 – DonBoitnott

+0

このようなもの:https://stackoverflow.com/questions/28531058/find-position-of-mouse-relative-to-control-rather-than-screen#28533224 'PointToClient'に関する部分が最も関連性があります。 – DonBoitnott

+0

ありがとう、それを得た! – dunkleosteus

答えて

0

非常に簡単になりましたが、MousePositionはパネルに対して相対的な位置を指定しませんでした。これは動作します:

 Dim newloc As Point = Form8.Panel1.PointToClient(Form8.MousePosition) 
     sender.Location = newloc 
+1

VB.NETコンパイラがこれを許可するのは残念ですが、実際には正しい識別子名を使用するのが最適です。これはControl.MousePositionであり、PointToClientが必須であり、返される位置はフォーム座標とは関係がないことがはっきりしています。 –

関連する問題