3 votes

Bulles d'événements - Événement Mousehover pour les contrôles enfants

J'ai un formulaire Winform avec quelques contrôles dessus.
Lorsque le curseur entre dans le formulaire (limites du formulaire, y compris le contenu du formulaire), je veux déclencher une tâche spécifique. Lorsque le curseur quitte le formulaire, je veux déclencher une autre tâche.

Il est évident que le fait de placer ces événements sur le formulaire ne fonctionnera pas (parce que, par exemple, MouseLeave sera déclenché lorsque je passerai du formulaire lui-même à un autre contrôle).

this.MouseEnter += (sender, e) =>
{
   //do stuff
};

this.MouseLeave += (sender, e) =>
{
   //do stuff
};

J'ai essayé l'interface IMessageFilter comme cela apparaît dans des questions similaires, mais aucune ne me donne le résultat souhaité ! Le problème est de détecter quand la souris quitte complètement le formulaire.

 public bool PreFilterMessage(ref Message m)
 {
    switch (m.Msg)
    {
        case WM_MOUSEMOVE: //or other messages
        bool z = myForm.Bounds.Contains(Cursor.Position); //This didn't help
    }
    eturn false;
}

Il y a également un problème de détection dans le contenu du formulaire (lorsque je me déplace entre les contrôles).

Qu'est-ce que je rate ?

mise à jour : je ne veux pas utiliser de minuteurs !

0voto

pjwilliams Points 190

Vous pourriez obtenir les coordonnées x et y actuelles du pointeur et voir si elles se trouvent à l'intérieur du formulaire. Si ce n'est pas le cas, effectuez alors la tâche hors formulaire.

0voto

Johnny Kauffman Points 659

J'ai utilisé un truc comme ça une fois pour garder un œil sur les ancêtres de tous les formulaires :

Les formulaires ont un ControlAdded événement. Vous pouvez vous connecter à cet événement (probablement avant InitializeForm . À l'intérieur de ce gestionnaire d'événements, vous pouvez vous connecter à l'événement ControlAdded et MouseXXX les événements de tous les enfants et ses petits petits enfants . Vous pouvez envoyer tous les événements du même type au même gestionnaire.

Avec cette méthodologie, je suppose que la solution la plus simple sera alors de regarder la MouseLeave et MouseEnter de tous les ancêtres, puis vérifiez la position du curseur de la souris pour voir s'il se trouve dans le rectangle de l'écran du formulaire (vos gestionnaires d'événements seront remplis d'événements qui se déclenchent lorsque la souris se déplace dans le formulaire). De toute façon, vous aurez résolu le problème avec zéro timer !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X