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 :

Desactivation BN_DOUBLECLICKED dans CBitmapButton


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut Desactivation BN_DOUBLECLICKED dans CBitmapButton
    Bonjour, voici mon interrogation : Je crée une CDialog vide, j'y ajoute un CButton et un CStatic (type rectangle + SS_NOTIFY) (ou un autre contrôle), j'intercepte les évènements clic sur les deux éléments, et je compte le nombre de clics effectués sur chacun.
    Je clique assez rapidement 20 fois sur le CButton, puis 20 fois sur le CStatic, le compteur CButton est bien à 20 mais le CStatic n'est qu'à 10/15 selon rapidité des clics. J'ai du mal à cerner d'où vient la différence, d'une différence de gestion des notifications sur le contrôle parent mais laquelle ? Merci si certains peuvent m'éclairer sur ce point, pas vital mais qui m'étonne.

  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
    Il est possible que certains de tes clics rapides soient interceptés comme des double-clics par le static...
    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 averti
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut
    Merci pour la réponse, elle m'a mise un peu sur la voie. En effet, le second click déclenche un évènement double-click que je n'arrive pas à neutraliser. En fait dans mon problème initial je n'essayais pas avec un CStatic mais avec un CBitmapButton. Après lecture note de microsoft , il s'avère que le BS_OWNERDRAW inclut automatiquement un BS_NOTIFY responsable de la génération des évènements double-clic. J'ai essayé un ModifyStyle(BS_NOTIFY, 0, 0) sans succès puisqu'il est inclus en auto dans BS_OWNERDRAW. J'ai également essayé une sous-classe avec WM_LBUTTONDBLCLK qui renvoie des WM_LBUTTONDOWN mais ça ne passe pas.
    Donc en gros il n'y a pas de moyens de désactiver les BN_DOUBLECLICKED une fois la propriété BS_OWNERDRAW est définie ?

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    BS_OWNERDRAW concerne la gestion de l'affichage pas le comportement du contrôle...

  5. #5
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut
    Si j'avais l'air de dire que BS_OWNERDRAW était une notification c'est que je me suis mal exprimé. BS_OWNERDRAW amène sont lot d'évènements automatiques.

    A button sends the BN_DISABLE, BN_PUSHED, BN_KILLFOCUS, BN_PAINT, BN_SETFOCUS, and BN_UNPUSHED notification messages only if it has the BS_NOTIFY style. BN_DBLCLK notification messages are sent automatically for BS_USERBUTTON, BS_RADIOBUTTON, and BS_OWNERDRAW buttons. Other button types send BN_DBLCLK only if they have the BS_NOTIFY style. All buttons send the BN_CLICKED notification message regardless of their button styles.
    donc a priori pas de moyens de désactiver BN_DBLCLK/BN_DOUBLECLICKED ?

  6. #6
    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
    Pas sûr.
    Si tu fais un GetClassLong(GCL_STYLE) sur le bouton, tu verras qu'il a sûrement le style CS_DBLCLKS. Si tu refais un SetClassLong() sans ce style, tu peux sûrement désactiver le double-clic sur le bouton et tous les boutons créés après lui (c'est du "global subclassing", mais j'ignore si ça marche bien avec MFC).

    Si tu veux juste modifier pour ce bouton-là, tu peux peut-être restaurer le style ensuite, ou au contraire superclasser le bouton avant sa création. Seulement, j'ignore si le superclassing marche avec MFC...
    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.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tu peux essayer de faire ton SetClassLong dans la fonction virtuelle PreSubclassWindow de ta classe bouton.

  8. #8
    Membre averti
    Inscrit en
    Septembre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 28
    Par défaut
    Ca fonctionne, merci beaucoup à vous deux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void CMyPicBt::PreSubclassWindow() {
    	// TODO: Add your specialized code here and/or call the base class
    	DWORD mot=GetClassLong(m_hWnd, GCL_STYLE);
    	mot^=CS_DBLCLKS;
    	SetClassLong(m_hWnd, GCL_STYLE, mot);
    	CBitmapButton::PreSubclassWindow();
    }
    Je change le titre du topic pour le moteur de recherche.

  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
    Conseil : Utilise mot &= ~CS_DBLCLKS à la place de ta ligne actuelle (histoire d'être sûr de l'enlever systématiquement et non pas de le mettre s'il n'est pas là...)
    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.

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

Discussions similaires

  1. desactivation ecriture dans logs
    Par ph.janin dans le forum Sybase
    Réponses: 3
    Dernier message: 14/06/2007, 11h51
  2. Désactivation souris dans un sous-formulaire
    Par zitro45 dans le forum Access
    Réponses: 8
    Dernier message: 17/10/2006, 09h50
  3. Réponses: 1
    Dernier message: 20/06/2006, 15h47
  4. Activation et desactivation d'un champ dans un form
    Par danielperdriolle dans le forum IHM
    Réponses: 7
    Dernier message: 23/03/2006, 11h10
  5. [VB6]Afficher du texte dans Textbox desactivé + scrollbar?
    Par toninlg dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/03/2006, 18h40

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