Question

Je me bats avec quelque chose qui, à mon avis, devrait être facile (ish). J'ai un formulaire Windows et un panneau flowgridlayout au bas du formulaire. À l'intérieur de ce formulaire, je le remplis dynamiquement avec un nombre X de contrôles utilisateur. Les contrôles sont tous du même type.

L'objectif est que lorsque l'utilisateur passe la souris sur son contrôle, il ouvre un autre formulaire et le positionne à l'emplacement de la souris. Lorsque la souris quitte le formulaire, le formulaire ouvert disparaît.

Cela fonctionne presque bien. Le problème est que le contrôle utilisateur contient quelque chose comme une étiquette ou une zone de texte. Il est considéré comme ayant quitté l'UC et le formulaire disparaît.

Je pensais alors utiliser le X et le Y pour indiquer s’il se trouvait à l’intérieur du UC, mais je ne peux pas comprendre cela.

Puis-je demander:

1) Quelle est la meilleure approche à cet égard? 2) Comment puis-je le coder, étant donné que les UC sont dynamiques, je ne peux pas savoir exactement où ils seront.

Merci

MODIFIER

J'essaie de comprendre les pointeurs de la souris, mais je n'y arrive pas. Le code ci-dessous fait partie de l'événement UC SmallTagBox_MouseLeave:

        Point loc = this.Location;
        Point p = this.PointToScreen(this.Location);
        Point p2 = this.PointToScreen(this.Parent.Location);

        Point ms = MousePosition;
        Rectangle screenBounds = new Rectangle(this.PointToScreen(this.Location), this.Size);
        if (!screenBounds.Contains(ms))
        {
            thw.Close();
            thw = null;
        }
  • loc {X = 275 Y = 3} System.Drawing.Point
  • p {X = 808 Y = 908} System.Drawing.Point
  • p {X = 808 Y = 908} System.Drawing.Point
  • p2 {X = 545 Y = 1542} System.Drawing.Point
  • ms {X = 574 Y = 914} System.Drawing.Point
  • screenBounds {X = 808 Y = 908 Largeur = 62 Hauteur = 29} System.Drawing.Rectangle

Je ne comprends pas comment p2 (son parent) peut avoir une plus grande valeur de Y par rapport à l'écran.

Était-ce utile?

La solution

Accrocher tous les contrôles MouseEnter et MouseLeave, puis déterminer s’il est toujours dans le formulaire est assez pénible. Une simple minuterie peut aussi faire le travail:

  public partial class Form1 : Form {
    private Timer mTimer;
    public Form1() {
      InitializeComponent();
      mTimer = new Timer();
      mTimer.Interval = 200;
      mTimer.Tick += mTimer_Tick;
      mTimer.Enabled = true;
    }
    private void mTimer_Tick(object sender, EventArgs e) {
      if (!this.DesktopBounds.Contains(Cursor.Position)) this.Close();
    }
  }

Autres conseils

Idée 1) Lorsque l'événement MouseLeave est déclenché, vous pouvez vérifier les coordonnées de la souris (par rapport à l'écran) et vérifier si elles se trouvent toujours dans les limites de votre contrôle utilisateur. S'ils le sont, il faut supposer que la souris doit repasser par le contrôle pour sortir des limites et vous pouvez ignorer l'événement en toute sécurité cette fois-ci.

Idée 2) Associez les gestionnaires d'événements MouseEnter aux contrôles enfants. Ensuite, lorsque la souris en entrera une, vous saurez et pourrez ignorer l'événement MouseLeave de usercontrol. Ensuite, lorsque l'événement MouseLeave de l'enfant se déclenche, recherchez à nouveau le MouseEnter de usercontrol.

Je pense que je voudrais ajouter un gestionnaire d'événements pour MouseLeave pour chaque contrôle que vous possédez et utiliser la propriété Parent pour rechercher le contrôle utilisateur que vous recherchez. Je suis d'accord, ce sera un peu douloureux cependant.

Vous pouvez également parcourir tous les contrôles enfants (récursifs) de votre contrôle et y associer un événement MouseEnter et MouseLeave.

Vous devez effectuer une comptabilité si la souris est sous votre contrôle, ou un contrôle enfant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top