2017-09-05 1 views
0

Pardonnez-moi si c'est une question stupide, mais je ne suis pas expérimenté et je n'ai pas trouvé de réponse à ce problème.WinForms Glisser-déposer: Etiquettes "sauter" avant de suivre la souris

Je mets des étiquettes sur un panneau (Form8.Panel1) dans le code en fonction des données stockées dans une table de données (treedata):

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 

Utilisation de l'événement MouseMove je veux faire glisser les étiquettes autour de la panneau suivant la souris:

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 

ce qui se passe maintenant est que lorsque je clique sur une étiquette et que vous souhaitez pour suivre la souris d'abord « saute loin » signifie se déplace tout à fait un peu loin de l'emplacement de la souris et seulement puis suit la souris. Est-ce que quelqu'un sait ce que je dois changer afin d'éviter ce saut initial des étiquettes?

+0

'MousePosition' n'est pas ce que vous voulez, vous devez traduire ces coordonnées en coordonnées de contrôle. – DonBoitnott

+0

Quelque chose comme ceci: https://stackoverflow.com/questions/28531058/find-position-of-mouse-relative-to-control-rather-than-screen#28533224. La partie sur 'PointToClient' pourrait être la plus pertinente. – DonBoitnott

+0

Merci, j'ai compris! – dunkleosteus

Répondre

0

Il s'est avéré être assez facile, juste MousePosition n'a pas donné la position par rapport au panneau. Cela fonctionne:

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

Il est regrettable que le compilateur VB.NET le permette, plutôt préférable d'utiliser le nom d'identifiant correct. C'est Control.MousePosition, il est beaucoup plus évident que PointToClient est requis et la position qu'il renvoie n'a rien à voir avec les coordonnées du formulaire. –