WinForms拖放:标签在跟随鼠标前“跳开”

问题描述:

请原谅我,如果这是一个愚蠢的问题,但我没有经验,并且没有找到对此问题的答案。WinForms拖放:标签在跟随鼠标前“跳开”

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事件我想拖动标签上:

我在面板上的代码依赖于存储在一个DataTable(treedata)数据扣帽子(Form8.Panel1)面板跟随鼠标:

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

原来相当简单,只是MousePosition没有给出相对于面板的位置。这工作:

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

不幸的是,VB.NET编译器允许这样做,真的非常适合使用正确的标识符名称。它是Control.MousePosition,使得它更加明显,PointToClient是必需的,它返回的位置与窗体坐标无关。 –