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 :

WM_MOUSEMOVE et CButton


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut WM_MOUSEMOVE et CButton
    Bonjour,

    J'aimerais pouvoir changer l'aspect d'un bouton CButton lorsqu'il est visé par le curseur-souris (sans clic).

    J'ai essayé de gérer le message WM_MOUSEMOVE dans la CDialog contenant mon bouton pour tester l'événement "curseur-souris vise bouton".

    Malheureusement, dès que cet événement se réalise, ma CDialog ne reçoit plus le message WM_MOUSEMOVE qui est "absorbé" par le bouton. Puis-je le récupérer?

    Dans les messages de bouton (BN_CLICKED, etc...), il n'y a pas ce que j'aimerais (genre BN_visé_par_souris). Serait-il possible de disposer d'un tel message?

    Merci d'avance pour toute idée

  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 cherches à faire du Hot-Tracking, donc ?
    Cherche peut-être de ce coté-ci...
    WM_MOUSELEAVE
    TrackMouseEvent()
    Tu peux avoir besoin de subclasser le bouton, mais en MFC c'est assez facile.
    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
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Je viens d'essayer WM_MOUSELEAVE :

    dans MyDialog.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
    dans MyDialog.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
     
    LRESULT MyDialog::OnMouseLeave(WPARAM wParam, LPARAM lParam)
    {
         ...
         return 0;
    }
    Est-ce correct?
    Tel quel, ça ne donne rien ; j'ai mis un point d'arrêt dans OnMouseLeave pour tester en mode DEBUG si cette fonction est appelée, mais rien!

    Sinon tu parles de dériver CButton (si j'ai bien compris) ; tu pourrais préciser un peu ?

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Je conseillerais vivement de gérer plutot CDialog :: PreTranslateMessage et gérer WM_MOUSEMOVE ou sinon "subclasser" le comportement du bouton avec GetWindowLong et procédure de messages..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BOOL CMyDlgDlg :: PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    CRect rect;
    CButton *pButton=(CButton *)GetDlgItem(IDC_BUTTON);
    pButton->GetWindowRect(&rect);
    if(PtInRect(&rect,pMsg->pt))
    pButton->SetWindowText("Mouse Move");	
    return CDialog :: PreTranslateMessage(pMsg);
    }
    J'ai essayé cela fonctionne ; c'est une solution de bricolage mais fonctionnelle

    ( PS : est-ce que qqu'un sait comment on fait les tabulations dans l'éditeur phpBB ? )

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Je viens de trouver une solution à mon pb avec la fonction SetCapture() :

    1) A l'initialisation de ma Dialog (modale) j'ai mis SetCapture() pour continuer à capter le message WM_MOUSEMOVE lorsque je vise un bouton.
    2) Au début de OnMouseMove(), un autre SetCapture().
    3) Dans OnMouseMouve(), je peux alors tester si le curseur est sur un bouton :
    - si oui, je stocke son pointeur pour une éventuelle future restauration, je modifie l'aspect du bouton puis je fais un ReleaseCapture() pour lui redonner ses fonctionnalités ;
    - si non je redonne l'aspect initial au bouton modifié (s'il existe).

    Si quelqu'un a une idée plus simple, je suis preneur!

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Je viens de voir la solution avec PreTranslateMessage().
    Merci : elle m'a l'air meilleure que la mienne et je vais l'essayer.
    Cependant, j'aimerais aussi explorer l'autre idée : "subclasser" le bouton...
    mais qu'est-ce que ça veut dire?

  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
    • Sans MFC, subclasser une fenêtre ou un contrôle consiste à remplacer à la volée sa procédure de fenêtre par une autre (qui typiquement, rappelle la précédente) à l'aide de la fonction SetWindowLong() (ou SetWindowLongPtr() pour les windows 64-bits). Cette méthode a l'inconvénient de ne pas permettre d'ajouter des données persistentes à la fenêtre, sauf en utilisant les Window Properties (lentes).
    • Superclasser consiste à reprendre les infos de la "classe de fenêtre" dans une nouvelle "classe de fenêtre", qui elle peut avoir des données persistentes supplémentaires. Là encore, on utilise une nouvelle procédure de fenêtre qui rappelle la précédente pour tous les messages qu'elle ne traite pas.
    • Avec MFC, subclasser une fenêtre ou un contrôle consiste simplement à créer une classe C++ dérivée de sa classe C++, pour remplacer les traitements que l'on veut remplacer ou ajouter.
    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
    Mars 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 60
    Par défaut
    Merci pour ces précisions, j'y vois plus clair!

    L'inconvénient de la solution "classe CButton dérivée", c'est que je devrais déclarer tous les boutons, leurs attributs, etc... à la création de ma dialog : ça peut être assez lourd.
    L'avantage est que je pourrais y ajouter une nouvelle méthode gérant l'aspect du bouton.
    On va voir ça...

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/11/2007, 13h33
  2. cbutton
    Par hitchie dans le forum MFC
    Réponses: 7
    Dernier message: 30/03/2006, 10h15
  3. CButton, connaitre son état (enable ou disable)
    Par mr.saucisse dans le forum MFC
    Réponses: 5
    Dernier message: 27/02/2006, 18h01
  4. cherche un "Set Width " pour un CButton
    Par firejocker dans le forum MFC
    Réponses: 5
    Dernier message: 01/02/2006, 17h26
  5. Réponses: 3
    Dernier message: 12/12/2004, 17h48

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