2010-04-24 17 views
3

J'essaie d'obtenir un contrôle pour suivre le curseur lorsque l'utilisateur clique et fait glisser le contrôle. Le problème est que 1.) le contrôle ne va pas à la position de la souris, et 2.) le contrôle scintille et vole partout. J'ai essayé quelques méthodes différentes pour cela, mais toutes ont échoué jusqu'ici.C# - Déplacer un contrôle à la position de la souris

J'ai essayé:

protected override void OnMouseDown(MouseEventArgs e) 
{ 
    while (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
      this.Location = e.Location; 
    } 
} 

et

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    while (e.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
      this.Location = e.Location; 
     } 
} 

mais aucun de ces travaux. Toute aide est appréciée, et merci d'avance!

Répondre

9

Voici comment faire:

private Point _Offset = Point.Empty; 

protected override void MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     _Offset = new Point(e.X, e.Y); 
    } 
} 

protected override void MouseMove(object sender, MouseEventArgs e) 
{ 
    if (_Offset != Point.Empty) 
    { 
     Point newlocation = this.Location; 
     newlocation.X += e.X - _Offset.X; 
     newlocation.Y += e.Y - _Offset.Y; 
     this.Location = newlocation; 
    } 
} 

protected override void MouseUp(object sender, MouseEventArgs e) 
{ 
    _Offset = Point.Empty; 
} 

_Offset est utilisé ici pour deux objectifs: garder une trace de l'endroit où la souris est sur le contrôle lorsque vous avez initialement cliqué, et aussi garder une trace de savoir si le bouton de la souris est en baisse ou non (de sorte que le contrôle ne soit pas déplacé lorsque le curseur de la souris passe dessus et que le bouton n'est pas enfoncé).

Vous certainement ne voulez changer les if s dans ce code à while s, comme il va faire une différence.

+0

J'ai essayé cela et il ne fait pas de différence. J'apprécie l'effort cependant. –

+3

+1: Le code de MusiGenesis fonctionne pour moi comme un charme, mais avec une petite modification: J'ai créé un nouveau contrôle utilisateur -> remplacer les trois méthodes OnMouseDown, OnMouseUp, et OnMouseMove -> la première ligne dans chacune de ces méthodes est un appel à la méthode de base, c'est-à-dire base.OnMouseDown (e), base.OnMouseMove (e) et base.OnMouseUp (e). -> le reste du code va comme MusiGenesis discuté. –

+1

Merci beaucoup! Cette nouvelle réponse fonctionne comme un charme! Je l'apprécie vraiment! –

2

il y a des erreurs dans la réponse 1 gestionnaires de souris 1.OK pour contrôler, ne pas former comme button1_MouseMove 2.do pas utiliser ce vecteur, mais votre contrôle à la place (point newLocation = button1.Location;) 3 .Vous n'avez pas besoin de remplacer les gestionnaires.

dans mon test après ces changements bouton (ou autre contrôle) se déplace bien.

Chigook

0
private Point ptMouseDown=new Point(); 


protected override void MouseDown(object sender, MouseEventArgs e) 

{ 

    if (e.Button == MouseButtons.Left) 

    { 

     ptMouseDown = new Point(e.X, e.Y); 

    } 
} 

protected override void MouseMove(object sender, MouseEventArgs e) 
{ 

    if (_Offset != Point.Empty) 

    { 

     Pointf[] ptArr=new Pointf[]{this.Location}; 
     Point Diff=new Point(e.X-ptMouseDown.X,e.Y-ptMouseDown.Y); 
     Matrix mat=new Matrix(); 
     mat.Translate(Diff.X,Diff.Y); 
     mat.TransFromPoints(ptArr); 
     this.Location=ptArr[0]; 
    } 
} 

    enter code here 



protected override void MouseUp(object sender, MouseEventArgs e) 

{ 

    _Offset = Point.Empty; 

} 
1

Essayez ceci pour déplacer l'objet en fonction de la position de la souris et le code ci-dessous donné est de recueillir le chemin de déplacement de la souris et l'emplacement enregistré dans le arraylist pour obtenir le chemin où le point de la souris est en mouvement. Je dois déclarer la liste de tableau globalement.

private void panel1_MouseMove(object sender, MouseEventArgs e) 
     { 



       if (e.Button == MouseButtons.Left) 
       { 
        ArrayList inList = new ArrayList(); 
        inList.Add(e.X); 
        inList.Add(e.Y); 
        list.Add(inList); 
       } 

     } 

lorsque l'utilisateur cliquez sur le bouton de la commande doivent se déplacer dans le chemin que l'utilisateur fait glisser dans l'écran

private void button1_Click_2(object sender, EventArgs e) 
    { 
     foreach (ArrayList li in list) 
      { 



       pic_trans.Visible = true; 
       pic_trans.Location = new Point(Convert.ToInt32(li[0]), Convert.ToInt32(li[1])); 
       pic_trans.Show(); 
      } 
    }