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

C# Discussion :

Ecouter et temporiser un clic de souris


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut Ecouter et temporiser un clic de souris
    Bonjour à tous et à toutes.

    Ma question va paraître tordue, mais c'est une demande officielle de mes utilisateurs, et franchement, j'ai du mal à voir comment m'y prendre.

    En gros:
    1) Situation
    J'ai une application Windows c# qui, au lieu d'avoir des boutons, utilise des zones de clic avec des listeners pour activer des méthodes. L'idée était de rendre le tout "esthétique".
    2) De ce fait, on a de jolies zones à clics, mais qui posent problème au double clic (vu qu'il arrive d'une zone s'active et se désactive alors trop vite, ceci posant des problèmes de fonctionnement)
    3) L'idée est qu'on veut "temporiser" entre deux clics, à savoir le cycle suivant
    - Clic de la souris: on exécute le changement
    - On temporise de sorte à ne pas tenir compte du clic suivant pendant une durée déterminée (peu importe combien)
    - Ensuite, on autorise à nouveau le clic.

    Mes soucis:
    1) Puisqu'il y a de nombreux écouteurs qui se génèrent automatiquement (par affectation aux zones), je ne me vois pas déglinguer toute la mécanique existante
    2) Il faut que cette tempo soit "postérieure" à l'exécution, puisqu'il faut que le "premier" clic soit effectif, et que le second ne soit bloqué que dans l'intervalle.

    Avez-vous une idée? Sur le principe, je me suis dit plusieurs hypothèses, mais j'aimerais votre avis:
    1) Mettre en place un timer commun qu'on observe: s'il est "actif", le clic n'est pas accepté, sinon il est pris en compte.
    2) Je suppose qu'il faudrait être au niveau supérieur, de sorte à ce que tous les clics souris soient pris en compte.

    Avez vous une idée sur comment m'y prendre?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Ben le plus simple c'est :

    CP => Souris => Boutons => Vitesse du double-click.(c'est une option récente, elle n'existe que depuis 25 ans environ )

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Ben le plus simple c'est :

    CP => Souris => Boutons => Vitesse du double-click.(c'est une option récente, elle n'existe que depuis 25 ans environ )
    Hélas non... ils veulent pouvoir paramétrer, du genre "pendant deux secondes, plus de clic possible sur les boutons"... sinon oué j'aurais fait jouer du paramètre

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Est-ce que cette temporisation doit être commune à tous les boutons, ou gérée séparément pour chaque bouton ? Dans le premier cas c'est pas trop galère... comme tu disais, un timer devrait faire l'affaire. Par contre, je ne comprends pas très bien ce qui te bloque ; il faudrait que tu nous en dises plus pour qu'on puisse t'aider

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Boarf j'ai finalement trouvé une façon de faire

    1) c'est une partie des boutons, et coup de bol ils sont menés par un thread...
    - donc je crée un timer à l'instanciation du thread
    - Je le Start() suite au sur un des boutons
    - lorsque le second click arrive, je teste si le Timer est toujours enabled
    - Si non, alors j'autorise le clic
    - Si oui, alors je passe mon chemin!

    Je mettrai le code un peu plus tard (ouéé suis plus au bureau).

    ça n'est pas si sorcier que ça, mais juste pénible pour ne pas provoquer de cochonneries dans le code.

    PS: j'ai un doute... mais comment on active/désactive un sablier sur le curseur? (oué je sais question de débutant...)

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par magellan94 Voir le message
    PS: j'ai un doute... mais comment on active/désactive un sablier sur le curseur? (oué je sais question de débutant...)
    Cursor.Current
    (en supposant que ce soit une appli WinForms)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cursor.Current = Cursors.WaitCursor; // sablier
    Cursor.Current = Cursors.Default; // curseur par défaut

  7. #7
    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
    Cursor.Current = Cursors.WaitCursor; // sablier
    Cursor.Current = Cursors.Default; // curseur par défaut
    +1, à utiliser de préférence avec des fonctions push/pop:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private static Stack CursorsStack = new Stack();
     
    internal static void PushCursor(Cursor newcursor) { CursorsStack.Push(Cursor.Current); Cursor.Current = newcursor; }
     
    internal static void PopCursor() { if ( CursorsStack.Count>0) Cursor.Current = (Cursor)CursorsStack.Pop(); }
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    je vais peut-être dire une connerie mais le Reactive Framework permet ce genre de chose non ?

    http://msdn.microsoft.com/en-us/data/gg577609.aspx

    bien que je ne l'ai jamais utilisé....

    EDIT: Non c'est bon j'ai rien dit oublie, ça peut surement faire ce genre de chose mais trop lourd dans ton cas

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Lydéric Voir le message
    je vais peut-être dire une connerie mais le Reactive Framework permet ce genre de chose non ?
    Oui tout à fait.
    On peut créer un Observable à partir de l'évènement, et limiter la "cadence" avec la méthode Throttle

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 37
    Points : 37
    Points
    37
    Par défaut
    Merci à tous!

    Pour ce qui est du timer...
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
     
    namespace BT_PRO_V10_0_0.controleur
    {
       class ActionsUtil
       {
           static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
     
           public static ActionsUtil getInstance()
           {
               if (null == instance)
                   instance = new ActionsUtil();
               return instance;
           }
     
            public ActionsUtil()
            {
                // Test du timer global
                myTimer.Interval = 2000;
                myTimer.Tick += new System.EventHandler(OnTimerEvent);
            }
     
    //La méthode qui gère l'interaction des méthodes
            public void setActionUtil()
            {
    //J'ai simplifié le code, mais ici je teste si le timer est enabled, alors je ne peux pas activer la méthode (tempo sur le clic quoi:D)
                            if (!myTimer.Enabled)
                            {
                                this.Repondre();
                                myTimer.Enabled = true;
                            }
    /** .... Même principe sur els autres méthodes qu eje veux tester*/
    }
            }
     
           public static void OnTimerEvent(object source, EventArgs e)
           {
               myTimer.Enabled = false;
           }
        }
     
    }

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

Discussions similaires

  1. [Debutant] Menu sur clic de souris
    Par chabannou dans le forum Windows
    Réponses: 8
    Dernier message: 02/04/2005, 01h52
  2. Réponses: 8
    Dernier message: 14/03/2005, 21h43
  3. Emuler et detecter un clic de souris (G, D, mollette)
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2005, 17h25
  4. Réponses: 2
    Dernier message: 12/07/2004, 11h43
  5. Selection par clic de souris
    Par bilbonec dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/04/2004, 00h25

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