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 :

Comment gérer et afficher un tooltip sur un item d'un treecontrol?


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut Comment gérer et afficher un tooltip sur un item d'un treecontrol?
    Bonjour,
    Je souhaîte afficher un tooltip (multilines) lorque la souris passe sur un Item de mon TreeCtrl. Le texte devant évidemment être adapté en fonction de l'item sur lequel se trouve le pointeur de la souris.
    Avez vous une idée ou un exemple de code?

    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Bonjour,

    J'ai une solution pour afficher un tooltip differencié sur chaque Item de mon CTreeCtrl. J'utilise AddTool avec comme paramètre LPSTR_TEXTCALLBACK. Lorsque le TT doit se redessiner il envoie le message ON_NOTIFY_EX_RANGE.
    L'interception de ce message par la fenêtre parent, la recherche de l'item se trouvant sous le curseur permet alors d'afficher un texte differencié.

    Il me reste néanmoins un problème. ON_NOTIFY_EX_RANGE n'est pas généré à un rhytme très important et lorsque le TT est affiché le fait de déplacer la souris sur un autre Item ne provoque pas l'envoi de messages supplémentaire qui permettrait d'éteindre le TT en cours et d'en afficher un nouveau.
    Avez-vous une idée comment contourner ce problème?

    Merci

  3. #3
    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 as rajouté un relai au niveau de pretranslatemsg ?
    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
     
    virtual BOOL PreTranslateMessage(MSG* pMsg)
       {
            if (m_tooltip.m_hWnd != NULL)
            {
                // translate the message based on TTM_WINDOWFROMPOINT
                MSG msg = *pMsg;
                msg.hwnd = (HWND)m_tooltip.SendMessage(TTM_WINDOWFROMPOINT,
                    0, (LPARAM)&msg.pt);
                CPoint pt = pMsg->pt;
                if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
                    ::ScreenToClient(msg.hwnd, &pt);
     
                msg.lParam = MAKELONG(pt.x, pt.y);
                // Let the ToolTip process this message.
                m_tooltip.RelayEvent(&msg);
            }
            return GENERIC_TOOLTIP::PreTranslateMessage(pMsg);
        }
    code tiré de la faq:
    http://cpp.developpez.com/faq/vc/ind...ic#MakeToolTip

  4. #4
    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,

    J'ai un doute : le TreeCtrl ne gère déjà pas le ToolTip ???
    Ben si puisqu'il y a le style TVS_NOTOOLTIPS pour ne pas les avoir ...

    Il faut juste intercepter le message de notification TTN_NEEDTEXT.
    Attention l'intercepter comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    BEGIN_MESSAGE_MAP()
    ON_NOTIFY_EX(0,TTN_NEEDTEXT,OnToolTipNeedText)
    END_MESSAGE_MAP()
     
     
    BOOL CMaClasse::OnToolTipNeedText(NMHDR *pNMHDR,LRESULT *pResult)
    {
     
     
     
    }
    Dans la fonction ci-dessus il faut tester avec les infos du pNMHDR si le message vient du ToolTip du TreeCtrl en comparant le handle avec celui retourné par TVM_GETTOOLTIPS
    Si c'est pas égal, il faut retourner TRUE (ou FALSE, regarde la MSDN pour etre sur), pour dire que le routage du message TTN_NEEDTEXT continue, sinon tu n'auras plus de ToolTips du tout dans ton appli.

    @+

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut

    En effet pourquoi chercher très loin ce qui se trouve à portée de click...

    l'interceprion du message TVN_GETINFOTIP permet de de gérer le contenu du tool tip sans problème.

    Merci pour votre aide

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

Discussions similaires

  1. [JTextField] Comment gérer l'affichage du toolTip ?
    Par AliJava dans le forum Composants
    Réponses: 2
    Dernier message: 16/07/2008, 22h25
  2. Réponses: 15
    Dernier message: 04/11/2007, 17h43
  3. Comment gérer une session par cookie sur page asp
    Par alexsolex dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/10/2007, 22h30
  4. Réponses: 5
    Dernier message: 13/03/2007, 11h35
  5. Comment gérer les problèmes de connexion sur un idFTP ?
    Par giloutho dans le forum Web & réseau
    Réponses: 2
    Dernier message: 05/12/2005, 18h42

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