2016-07-06 1 views
0

Lorsque MouseDown sur objetA puis mousemove sur objectB, l'objet B (handle de souris) ne peut pas appeler. Comment permettre à un autre objet de détecter la poignée de souris, lorsqu'elle est déplacée avant d'entrer dans la zone de l'objet.C# Winform - Garder MouseDown et joindre à un autre objet l'objet MouseMove ne fonctionne pas

public Test() 
    { 
     InitializeComponent(); 
     this.Size = new Size(500, 500); 
     Panel pl = new Panel(); 
     pl.Size = new Size(200, 200); 
     pl.Location = new Point(0, 0); 
     pl.BackColor = Color.Pink; 

     Label lb = new Label(); 
     lb.Text = "Keep MouseDown and move to Panel2 , Panel2 MouseMoveHandler not work"; 
     lb.Dock = DockStyle.Fill; 
     pl.Controls.Add(lb); 

     TextBox tb = new TextBox(); 
     tb.Multiline = true; 
     tb.Size = new Size(400, 100); 
     tb.Location = new Point(0,300); 

     Panel pl2 = new Panel(); 
     pl2.Size = new Size(100, 100); 
     pl2.Location = new Point(0, 0); 
     pl2.BackColor = Color.Red; 
     pl2.Location = new Point(300, 0); 
     pl2.MouseMove += new MouseEventHandler(delegate (object o, MouseEventArgs a) 
     { 
      tb.AppendText(a.X + "," + a.Y); 
     }); 

     this.Controls.Add(pl); 
     this.Controls.Add(pl2); 
     this.Controls.Add(tb); 
    } 
+0

qu'avez-vous essayé? – currarpickt

+0

@currarpickt ajouté le code de test – Kit22092

Répondre

1

Ce que vous voyez est le comportement standard. C'est la seule façon d'obtenir des événements MouseMove pour un objet tout en ayant la souris enfoncée si vous déplacez la souris en dehors de cet objet.

Si vous voulez savoir quel contrôle est sous le curseur à tout moment (vous pouvez le faire dans votre cas MouseMove si nécessaire), vous pouvez utiliser ce code:

[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr WindowFromPoint(Point pnt); 

public static Control GetControlUnderCursor() { 
    var handle = WindowFromPoint(Control.MousePosition); 
    if (handle != IntPtr.Zero) 
    return Control.FromHandle(handle); 
    return null; 
} 

Vous pouvez utiliser ce code dans l'événement MouseMove du formulaire si vous définissez la propriété Capture du formulaire sur true (c'est ce qui se passe sur votre contrôle lorsque vous maintenez le bouton de la souris enfoncé) et que vous pouvez vérifier Control.MouseButtons pour savoir quels boutons de la souris sont enfoncés si nécessaire.

+0

Merci beaucoup. – Kit22092