2010-09-23 7 views
6

J'ai un winform sur lequel je veux permettre à l'utilisateur de déplacer un contrôle.Comment autoriser l'utilisateur à déplacer un contrôle sur le formulaire

Le contrôle est (pour l'instant) une ligne verticale: étiquette avec bordure et une largeur de 1.

Le contexte est pas très important, mais je vais vous donner de toute façon. J'ai un arrière-plan avec quelques graphiques et je voudrais que l'utilisateur puisse glisser une ligne directrice au-dessus des graphiques. Les graphiques sont réalisés avec la bibliothèque NPlots. Il ressemble à ceci: http://www.ibme.de/pictures/xtm-window-graphic-ramp-signals.png

Si je peux trouver comment l'utilisateur peut cliquer et faire glisser le contrôle d'étiquette/ligne autour de l'écran, je peux résoudre mon problème de ligne directrice. S'il vous plaît aider.

Répondre

8

Le code pour cela peut être un peu complexe, mais vous devrez essentiellement capturer les événements MouseDown, MouseMove et MouseUp sur votre formulaire. Quelque chose comme ceci:

public void Form1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if(e.Button != MouseButton.Left) 
     return; 

    // Might want to pad these values a bit if the line is only 1px, 
    // might be hard for the user to hit directly 
    if(e.Y == myControl.Top) 
    { 
     if(e.X >= myControl.Left && e.X <= myControl.Left + myControl.Width) 
     { 
      _capturingMoves = true; 
      return; 
     } 
    } 

    _capturingMoves = false; 
} 

public void Form1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(!_capturingMoves) 
     return; 

    // Calculate the delta's and move the line here 
} 

public void Form1_MouseUp(object sender, MouseEventArgs e) 
{ 
    if(_capturingMoves) 
    { 
     _capturingMoves = false; 
     // Do any final placement 
    } 
} 
+0

Merci! Fonctionne parfaitement. – Roast

3

En WinForms, vous pouvez gérer les événements MouseDown, MouseMove et MouseUp d'un contrôle. Sur MouseDown, définissez un bit ou une référence indiquant à votre formulaire sur quel contrôle la souris a été cliquée et capturez les X et Y de la souris à partir de MouseEventArgs. Sur MouseMove, si un contrôle est défini, ajustez ses X et Y par la différence entre votre X et Y capturés et les coordonnées actuelles. Sur MouseUp, relâchez le contrôle.

Je voudrais mettre en place un "mode d'édition" pour cela; Lorsque l'utilisateur entre dans ce mode, les gestionnaires d'événements actuels des contrôles de votre formulaire doivent être détachés et les gestionnaires de mouvement attachés. Si vous souhaitez persister ou annuler ces modifications (comme vous créez un concepteur de formulaire personnalisé que votre client peut utiliser pour personnaliser les dispositions de fenêtre), vous devez également être en mesure de prendre une sorte d'instantané des dispositions avant et après de les contrôles.

0

est ici une méthode d'extension que vous pouvez utiliser pour tout contrôle. Il utilise Rx et est basé sur le message A Brief Introduction to the Reactive Extensions for .NET, Rx et un échantillon de Wes Dyer.

public static class FormExtensions 
{ 
    public static void EnableDragging(this Control c) 
    { 
     // Long way, but strongly typed.   
     var downs = 
      from down in Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
       eh => new MouseEventHandler(eh), 
       eh => c.MouseDown += eh, 
       eh => c.MouseDown -= eh) 
      select new { down.EventArgs.X, down.EventArgs.Y }; 

     // Short way.   
     var moves = from move in Observable.FromEvent<MouseEventArgs>(c, "MouseMove") 
        select new { move.EventArgs.X, move.EventArgs.Y }; 

     var ups = Observable.FromEvent<MouseEventArgs>(c, "MouseUp"); 

     var drags = from down in downs 
        from move in moves.TakeUntil(ups) 
        select new Point { X = move.X - down.X, Y = move.Y - down.Y }; 

     drags.Subscribe(drag => c.SetBounds(c.Location.X + drag.X, c.Location.Y + drag.Y, 0, 0, BoundsSpecified.Location)); 
    } 
} 

Utilisation:

Bouton button1 = new Button();

button1.EnableDragging();

0

Eh bien, en toute honnêteté, il existe une façon plus simple d'initialiser une variable booléenne globale appelée ce que vous voulez, dans ce cas, isMouseClicked. Sur votre contrôle, vous souhaitez autoriser le glisser vers l'événement de souris,

Assurez-vous que ces événements sont vos événements de contrôle et non votre événement de formulaires.

if (e.button == MouseButtons.left) 
    //this is where you set the boolean to true 

Ensuite, allez à son événement de déplacement de la souris

if (isMouseClicked == true) 
    //You then set your location of your control. See below: 
    Button1.Location = new Point(MousePosition.X, MousePosition.Y); 

Sur votre souris vers le haut assurez-vous de mettre votre isMouseClicked-false;

Questions connexes