IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Problème avec l'event mouse_enter


Sujet :

Framework .NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut Problème avec l'event mouse_enter
    Bien le bonjour,

    Je suis en train de développer une application de contrôle parental, dans le cadre d'un projet scolaire.

    Je rencontre un petit problème avec les évènements concernant la souris...

    En fait, j'ai un TableLayoutPanel, de 7 lignes, et 48 colonnes. Dans chaque case de ce TLP, j'insère un contrôle Panel (c'est une grille qui permet de vérifier les horaires auxquels un joueur peut jouer).

    En fait, actuellement, j'utilise l'event click, ce qui me permet de changer la couleur du panel qui reçoit le click.
    J'aimerais cliquer, maintenir le clic, et glisser la souris jusqu'à une autre case, et relâcher le clic, et toutes les cases sur lesquelles je serai passé devront changer de couleur.

    Donc, j'utilise l'event Mouse_Down. Quand je rentre dans son handler, je mets une variable membre à true, et que je relâche, l'event Mouse_Up remets la variable à false.
    Lorsque je rentre dans le handler Mouse_Enter, je vérifie sur la variable est à true, et si c'est le cas, je change la couleur de la case.

    Mais ça ne fonctionne pas.

    Voici le code en question :
    Pour placer les contrôles Panel dans les cases du TableLayoutPanel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    for (i = 0; i < 48; i++)
    {
    	for (j = 0; j < 7; j++)
    	{
    		rect = new Panel();
    		rect.BackColor = Color.DodgerBlue;
    		rect.MouseClick += new MouseEventHandler(rect_MouseClick);
    		rect.MouseDown += new MouseEventHandler(rect_MouseDown);
    		rect.MouseEnter += new EventHandler(rect_MouseEnter);
    		rect.MouseUp += new MouseEventHandler(rect_MouseUp);
     
    		rect.Width = 19;
    		rect.Height = 19;
    		GrilleHoraireTLP.Controls.Add(rect, i, j);
    	}
    }
    Et les handlers correspondants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void rect_MouseUp(object sender, EventArgs e)
    {
    	isDown = false;
    }
     
    void rect_MouseEnter(object sender, EventArgs e)
    {
    	if (isDown == true)
    	{
    		if (((Panel)sender).BackColor == Color.DodgerBlue)
    			((Panel)sender).BackColor = Color.White;
    		else
    			((Panel)sender).BackColor = Color.DodgerBlue;
    	}
    }
     
    void rect_MouseDown(object sender, EventArgs e)
    {
    	isDown = true;
    }
     
    void rect_MouseClick(object sender, EventArgs e)
    {
    	if (((Panel)sender).BackColor == Color.DodgerBlue)
    		((Panel)sender).BackColor = Color.White;
    	else
    		((Panel)sender).BackColor = Color.DodgerBlue;
    }
    Et quand je place des points d'arrêt au niveau des handlers enter, up et down, et que le programme est exécuté pas-à-pas, ça fonctionne correctement...

    Auriez-vous une idée pour corriger cela ?

    Je précise que je développe sous Visual Studio 2010 Ultimate.

    Merci !

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le MouseDown devrait activer les traitements du MouseEnter.
    Et j'ai ajouté une sécurité au cas où le MouseEnter se déclencherait 2 fois (?) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Control prevPanel=null ;
    void rect_MouseUp(object sender, EventArgs e) { isDown = false; prevPanel=null ; }
     
    void rect_MouseEnter(object sender, EventArgs e) 
    { 
       if (isDown && (prevPanel==null || prevPanel!=sender)) 
       {
          PrevPanel=sender ;
          ... ton code ... 
        }
    } 
     
    void rect_MouseDown(object sender, EventArgs e) { isDown = true; prevPanel=null ; rect_MouseEnter(sender,e) ; }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    J'ai dû caster sender en Control, à la ligne 8 de ton code.

    Mais ça ne fonctionne pas non plus...

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Ptit UP

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    A la place du MouseEnter, essaye l'event MouseHover (en gardant le code avec prevPanel).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Toujours le même problème...

  7. #7
    Membre actif
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Points : 260
    Points
    260
    Par défaut
    Bonsoir,

    Le problème vient que le panel recevant l'événement MouseDown capture la souris.

    Ce comportement par défaut (implémenté au niveau de Control) permet de gérer notamment les drag & drop. Un effet de bord est que cela désactive certains événements, notamment les MouseEnter & MouseLeave.

    Sachant cela, il suffit de modifier légèrement le handler de l'événement MouseDown pour annuler la capture de la souris.

    Ajoute la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (sender as Panel).Capture = false;
    et cela devrait fonctionner

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 59
    Points : 43
    Points
    43
    Par défaut
    Okay, j'ai cependant repris le MouseEnter, au lieu du MouseHover.

    Tout fonctionne, merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] problème avec treeview_nodeClick event
    Par orfeu dans le forum IHM
    Réponses: 3
    Dernier message: 03/09/2012, 09h58
  2. [APIwin32-waitcommevent] Problème avec l'event
    Par weaponsb dans le forum Windows
    Réponses: 8
    Dernier message: 27/04/2009, 10h27
  3. Problème avec un event
    Par Rapha222 dans le forum C#
    Réponses: 3
    Dernier message: 12/12/2008, 07h42
  4. Problème avec les events MouseEnter, Leave
    Par Kaidan dans le forum Silverlight
    Réponses: 0
    Dernier message: 30/10/2008, 08h47
  5. Problème avec event handler
    Par MASSAKA dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 15/11/2005, 09h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo