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

MFC Discussion :

Bouton poussoir en continu


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut Bouton poussoir en continu
    Bonjour,

    Je cherche a reproduire le comportement d'un bouton poussoir: lorsqu'on le maintient enfonce, il execute en continu (avec une certaine frequence) une action jusqu'a ce qu'on le relache.

    Y a-t-il un moyen simple de faire ca?

    J'ai essaye en utilisant PreTranslateMessage, mais ca ne fonctionne pas vraiment: je n'arrive pas a forcer la re-detection de l'etat du bouton.

    La solution lourde serait d'utiliser un thread, mais franchement je pense que c'est un marteau pour ecraser une mouche.

    Suggestions?...

    Merci. Gorgo Treize.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Tu peux peut-être essayer un timer (SetTimer(), KillTimer()), si sa précision te suffit...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Merci, ca marche!

    Le seul probleme, c'est que quand je relache et re-appuie tres vite sur le bouton, il ne voit pas le message WM_LBUTTONDOWN (ca arrive trop souvent pour etre acceptable)!!

    Une solution?...

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    WM_LBUTTONDOWN pour démarrer ton timer.
    WM_LBUTTONUP pour l'arrêter.
    De mémoire (donc je vais peut être dire une bêtise), si tu traite ces deux messages sans passer par le traitement par défaut, tu ne devrais pas avoir le WM_LBUTTONDBLCLK qui est le risque si tu vas trop vite et peut masquer ton second WM_LBUTTONDOWN.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Salut et merci,

    Citation Envoyé par 3DArchi Voir le message
    WM_LBUTTONDOWN pour démarrer ton timer.
    WM_LBUTTONUP pour l'arrêter.
    Oui c'est ce que je fais.

    De mémoire (donc je vais peut être dire une bêtise), si tu traite ces deux messages sans passer par le traitement par défaut, tu ne devrais pas avoir le WM_LBUTTONDBLCLK qui est le risque si tu vas trop vite et peut masquer ton second WM_LBUTTONDOWN.
    Qu'est ce que tu appelles "le traitement par défaut"?...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    En fait j'ai remarque qu'il ne passe jamais par le double click. Seulement par le click simple. Donc pour resumer, il voit bien le click, mais de temps en temps il ne voit pas le WM_LBUTTONDOWN.... D'ailleurs, c'est declenche comment la fonction OnClicked? (Il n'y a pas de message WM_ONCLICKED par exemple)

    ....donc y'a qqch que je ne comprends pas.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Mais tu as WM_COMMAND(id, BN_CLICKED).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Oui ok...

    Par contre j'ai toujours le probleme que mon code ne voit pas le WM_LBUTTONDOWN lors d'un declick-reclick rapide: j'ai le bouton enfonce pendant 1 seconde, puis je le relache et reclick tres vite, et la il ne voit pas le WM_LBUTTONDOWN.

    Est-ce que ca serait du au temps pris pour tuer le timer dans la fonction OnLButtonUp?
    Mais si c'est ca, je ne comprends pas comment c'est possible sans passer par le WM_LBUTTONDOWN, car le controle (graphique) est bien mis dans l'etat enfonce... *Pffffffffff*

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Tu le récupères comment, ton WM_LBUTTONDOWN ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu le récupères comment, ton WM_LBUTTONDOWN ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void AS4_PressButton::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	if (m_ButtonID >= 0)
    	{
    		if (bTimerStarted == FALSE)
    		{
    			::SetTimer(hParent,this->m_ButtonID,1,TimerProc);
    			bTimerStarted = TRUE;
    		}
    	}
     
    	CButton::OnLButtonDown(nFlags, point);
    }

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Ou ca, si c'etait ca ta question...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    BEGIN_MESSAGE_MAP(AS4_PressButton, CButton)
    	//{{AFX_MSG_MAP(AS4_PressButton)
    	ON_WM_LBUTTONDOWN()
    	ON_WM_LBUTTONUP()
    	ON_WM_KILLFOCUS()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    OK, donc tu as subclassé le bouton.

    Ton problème, est-ce *vraiment* que OnLButtonDown() n'est pas appelé, ou plutôt que le timer n'est pas relancé ? (debugger powa...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    OK, donc tu as subclassé le bouton.

    Ton problème, est-ce *vraiment* que OnLButtonDown() n'est pas appelé, ou plutôt que le timer n'est pas relancé ? (debugger powa...)
    ... que OnLButtonDown() n'est pas appelé. J'ai fait un test simple, j'ai mis un Beep(880,50) dans OnLButtonDown() et Beep(440,50) dans OnLButtonUp(). Resultat j'entends bien systematiquement le beep "grave", mais l'aigu passe a la trappe de temps en temps apres un re-click. Voici le code:

    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
    void AS4_PressButton::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	if (m_ButtonID >= 0)
    	{
    		if (bTimerStarted == FALSE)
    		{
    			::SetTimer(hParent,this->m_ButtonID,1,TimerProc);
    			bTimerStarted = TRUE;
    		}
    	}
    	Beep(880,50);
    	CButton::OnLButtonDown(nFlags, point);
    }
     
    void AS4_PressButton::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    	if (m_ButtonID >= 0)
    	{
    		if (bTimerStarted == TRUE)
    		{
    			bTimerStarted = FALSE;
    			::KillTimer(hParent,this->m_ButtonID);
    		}
    	}
    	Beep(440,50);
    	CButton::OnLButtonUp(nFlags, point);
    }

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Je pense que c'est un problème de double-click.
    Essaie un GetClassInfo() pour voir si le style CS_DBLCLKS est activé (même si j'ignore quel est le "bon" cas), et essaie de voir aussi si tu peut mettre un OnLButtonDblClk()...

    Edit: Voici ce qui dit MSDN à ce sujet:
    Only windows that have the CS_DBLCLKS style can receive WM_LBUTTONDBLCLK messages, which the system generates whenever the user presses, releases, and again presses the left mouse button within the system's double-click time limit. Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Ok je vais regarder... mais mon cas serait plutot:

    WM_LBUTTONDOWN, puis WM_LBUTTONUP, puis WM_LBUTTONDOWN.

    Je reviens...

  16. #16
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    le WM_LBUTTONUP n'est pas garanti. si le bouton est relaché en dehors de la fenetre du bouton, tu n'auras pas le message ...

    il faut capturer la souris, ou "tracker" la souris via un WM_MOUSELEAVE par exemple en utilisant TrackMouseEvent()

    je pense que le bouton standard implémente déjà le TrackMouseEvent(), donc essaye d'intercepter le WM_MOUSELEAVE

    ou sinon rajoute un SetCapture() dans OnLButtonDown() et un ReleaseCapture() dans OnLButtonUp()

    @+

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Salut, merci,

    mais ma souris reste bien sur le bouton lors de mon reclick, il n'y a pas de doute possible...

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    Salut,
    Citation Envoyé par Médinoc Voir le message
    Je pense que c'est un problème de double-click.
    Essaie un GetClassInfo() pour voir si le style CS_DBLCLKS est activé (même si j'ignore quel est le "bon" cas), et essaie de voir aussi si tu peut mettre un OnLButtonDblClk()...

    Edit: Voici ce qui dit MSDN à ce sujet:
    Je viens de verifier, et mon bouton a bien le style CS_DBLCLKS .

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 157
    Par défaut
    ARGH!!! Ca m'inerve... je pense que dans le class wizard, j'avais ajoute la fonction relative au bouton du milieu, et pas a celle du bouton droit (et je viens de refaire l'erreur ce matin!)... bref, ca marche maintenant!

    RESOLU! Merci a vous!

    G. Treize.

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

Discussions similaires

  1. [16F876] Interruption d'un bouton poussoir
    Par aminousse dans le forum Autres architectures
    Réponses: 0
    Dernier message: 02/03/2008, 23h14
  2. Réponses: 2
    Dernier message: 11/04/2007, 16h42
  3. J'ai besoin de bouton poussoir
    Par lgjean dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/10/2006, 10h06
  4. Boutons "Cancel" et "Continue"
    Par Romain93 dans le forum JSF
    Réponses: 2
    Dernier message: 25/07/2006, 14h45
  5. Source LaTeX : faire un bouton poussoir dans le PDF
    Par pierrot_latex dans le forum Editeurs / Outils
    Réponses: 3
    Dernier message: 24/02/2006, 14h52

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