Tester si la souris a vraiment quitter un control : mouseleave

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 166 fois - Téléchargée 17 fois

Contenu du snippet

Il arrive parfois que l'on veuille utilise l' évènements MouseLeave mais le problème est que l'évènement se produit même si la souris est sur un enfant du contrôle.

La souris est entré sur un contrôle enfant mais elle n'a pas quitté, à proprement parlé, le contrôle.

Voici donc un bout de code qui permet de pallier à ce soucis, sans grande prétention mais qui peut s'avérer très utiles, comme lorsque l'on veut cacher un panel quand la souris l'a quitté.

Source / Exemple :


//exemple de mouseleave
public void panel1_MouseLeave(object sender, EventArgs e)
{
  Control tc = (Control)sender;
  //Chercher l'enfant se trouvant à la position de la souris
  Control child = tc.GetChildAtPoint(tc.PointToClient(Control.MousePosition));

  //On teste si on a trouvé un enfant
  if(child == null)
  {
    //Aucun enfant trouvé donc :
    //on a vraiment quitté le contrôle !
    //effectuer le code approprié
  } else {
    //On a quitté le panel1 mais on est sur un de ses enfants
    //donc on ne l'a pas vraiment quitté
  }
}

Conclusion :


Je met ce code parce que j'ai trouvé des gens qui vont jusqu'à créer des Hook de souris pour faire ce test alors qu'avec le framework on peut le faire tout simplement.

un exemple : http://blog.bee-eee.com/2008/01/04/c-capture-the-mouse-get-a-global-hook-on-the-mouse/

Cordialement.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
48
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
29 mars 2010

En fait j'ai pensé à : dans le MouseLeave de l'enfant tu teste si tu es sur le parent ou sur un de ses enfants, si oui tu ne le masque pas si non tu le masque ^^
Messages postés
48
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
29 mars 2010

Dans ce cas, pourquoi ne pas utiliser le MouseLeave du contrôle enfant ?
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
33
Si le curseur se trouve déja sur un contrôle enfant et quitte le panel sans entrer de nouveau dans le panel, l'évènement MouseLeave ne sera pas déclenché, c'est pour ça que tu vois des solutions qui utilisent un hook, ou un filtre de messages.
Messages postés
48
Date d'inscription
jeudi 18 décembre 2003
Statut
Membre
Dernière intervention
29 mars 2010

Lutinore, ce code permettrait* de masquer le panneau quand la souris quitte vraiment celui, c'est à dire qu'elle n'est plus sur un aucun contrôle enfant non plus.

*permettrait car pour cela il faudrait mettre ce code plutôt:
if(child == null)
panel1.visible = false; //masque le panneau
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
33
Mais avec ce code comment masques tu le Panel lorsque la souris quitte le contrôle enfant !?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.