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

Windows Forms Discussion :

C# Controle et fenêtre modale


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut C# Controle et fenêtre modale
    Bonjour,
    --------

    Je suis en train de terminer un contrôle personnalisé.
    Je rencontre un problème d'événements.

    Dans mon contrôle, je détecte les événements souris, qui déterminent l'état de mon contrôle (en cours de déplacement etc).

    Imaginons que je suis dans mon contrôle, et que je maintienne le bouton gauche enfoncé pour faire varier une valeur. Si par exemple la modification de la valeur de mon contrôle se traduit dans la form parent par l'affichage d'une fenêtre modale, par exemple un messagebox, je dois déplacer mon curseur sur le messagebox pour cliquer sur <OK>.

    Mais alors, mon contrôle n'a pas détecté que la souris était sortie de sa zone d'action, n'a pas détecté non plus que j'avais lâché le bouton gauche de la souris, ni aucun autre événement survenu. Mon contrôle croit donc que la souris est toujours à l'intérieur de sa zone d'action avec le bouton gauche enfoncé.

    Ma question est donc :

    Comment mon contrôle peut-il être averti que le messagebox est l'élément qui est devenu actif? Et, réciproquement, une fois que le messagebox est refermé, comment sait-il qu'il a repris le contrôle?

    J'ai tenté avec tout ce qui touchait validat.. et focus, rien ne fonctionne

    Merci d'avance

    A+
    Claude

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    dans l'évênement de la souris essaie peut-être un
    avant ta messageBox

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Salut
    -----

    Merci, mais je pense que tu m'as mal compris.

    En fait, j'ai besoin que mon contrôle puisse lui-même se rendre compte que la souris a quitté sa zone d'influence et que l'utilisateur a relâché le bouton.

    Le messagebox dans la form qui contient le contrôle, c'est juste pour vérifier si ça fonctionne ou pas, et ça ne fonctionne pas.

    Je ne peux pas fournir un contrôle en précisant "si votre programme ouvre une fenêtre modale, faites systématiquement cancel avant de l'ouvrir".

    J'ai donc besoin d'une solution au niveau du contrôle lui-même, et pas au niveau de la form qui utilise le contrôle

    A+
    Claude

  4. #4
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Un peu de code pourrait nous éclairer...

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Salut
    -----

    Merci de t'intéresser à mon problème.

    Voici un des événements reçus par mon contrôle.
    C'est l'événement que je reçois lorsque ma souris sort de l'image de fond de mon contrôle (contenant les graduations etc) :

    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
     
            //////////////////////////////////////////////////////////////////////////////////////////////
            //                             SOURIS QUITTANT LA ZONE IMAGE                                //
            //////////////////////////////////////////////////////////////////////////////////////////////
            //--------------------------------------------------------------------------------------------
            // On doit vérifier si on sort du contrôle, ou si on entre dans la zone curseur
            //--------------------------------------------------------------------------------------------
            void pbSlider_MouseLeave(object sender, EventArgs e)
            {
                OnSliderMouseLeave(e);                                                  // générer l'événement spécifique
                Point p =  PointToClient(new Point(MousePosition.X,MousePosition.Y));   // Transformer coordonnées souris écran en coordonnées relatives au control
     
                int x1 = this.Width;                    // limite gauche (droite = 0)
                int y1 = this.Height;                   // limite basse (haute = 0)
                int y = p.Y;                            // y relative souris
                int x = p.X;                            // x relative souris
     
                if(!(x>=0 && x<x1 && y>=0 && y<y1))     // si souris sort du contrôle
                {
                    OnMouseLeave(e);                    // envoyer événement quitter contrôle
                    MouseEnterSended = false;           // signaler que dernier envoi n'est pas enter (flip-flop)
                }
            }
    Tel quel, ça fonctionne sans aucun problème tant que la fenêtre contenant le contrôle reste active :

    Ma souris sort de la zone graduation (pbslider), je vérifie si j'ai bien quitté le contrôle (parce que j'ai une autre image au milieu du contrôle, et si j'entre dedans je quitte aussi l'image pbslider, alors que je suis toujours dans mon contrôle). Si je suis bien sorti, je génère un événement MouseLeave disponible pour la fenêtre contenant mon contrôle.

    Or, mon problème, c'est si mon controle perd la "main" tout en gardant le focus, cas qui se présente si par exemple la fenêtre contenant le contrôle ouvre un messageBox, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void bgSlider1_ValChangedByUser(object sender, BgSlider.BgSlider.IntArgs e)
            {
                MessageBox.Show(e.Valeur.TosSting());
            }
    Cet événement est reçu si le contrôle est actif et si l'utilisateur a modifié à la souris la position du curseur du potentiomètre.

    En principe, je devrais donc recevoir au niveau de ma fenêtre form contenant mon contrôle :

    1) L'événement ValChangeByUser puisque déplacement du curseur (C'est OK)
    2) Le message donnant la valeur est envoyé par la form (C'est OK)
    3) L'utilisateur quitte la zone du contrôle pour cliquer sur <OK> du message Box (OK)
    4) Le contrôle doit donc recevoir un événement pbslider.MouseLeave (ET ça, ce n'est pas OK).

    L'utilisateur a donc quitté la zone contrôle, relâché le bouton de la souris qu'il maintenait, et mon contrôle ne s'est aperçu de rien parce qu'il n'a reçu strictement aucun événement du fait que la fenêtre qui le contient n'est plus active, puisque c'est le messageBox qui l'est.

    Du coup, il n'avertit pas non plus la form mère, et en plus il reste en état actif car croyant que l'utilisateur est toujours à l'intérieur avec le bouton gauche enfoncé.

    Autrement dit, j'ai besoin de savoir que l'utilisateur a quitté mon contrôle du fait de l'ouverture, par exemple, d'un messagebox. Or, je n'ai trouvé aucun événement disponible dans mon contrôle qui m'avertisse de ce cas-là. Et si je prends un contrôle Microsoft du même genre, par exemple le TrackBar, ça fonctionne par contre parfaitement, c'est donc possible.

    J'espère que mes propos sont suffisamment clairs, sinon je préciserai

    Merci d'avance

    Claude

    PS : je viens de penser que je devrais peut-être m'abonner à l'événement de perte de focus de la form mère de mon contrôle, je vais essayer

  6. #6
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Puisque il veut pas exécuter l'évènement,pouquoit pas faire un RaiseEvent surMouseLeave ?

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

Discussions similaires

  1. [PowerBuilder] Récupérer la main sur une fenêtre modale
    Par jpdar dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 14h21
  2. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53
  3. Formulaire dans une fenêtre modale
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 14h25
  4. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52
  5. Rendre une fenêtre modale non modale
    Par Smortex dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/03/2003, 17h56

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