Votre question

[MFC] realisation d'info bulle

Tags :
  • souris
  • Programmation
Dernière réponse : dans Programmation
26 Avril 2006 16:39:54

salut, je realise une application MFC et je voudrais que lorsque je laisse ma souris plus de 3 secondes sur le même pixel, une infos bulle apparaissent est affiche les information que je desire. je sais qu'il faut utiliser la classe CToolTip mais je ne sais pas comment l'utiliser?
quelqu'un pourrait m'aider?

Autres pages sur : mfc realisation info bulle

26 Avril 2006 20:16:56

MFC?
a b L Programmation
26 Avril 2006 20:48:27

Microsoft Foundation Classes, c'est une API windows en C++
Contenus similaires
27 Avril 2006 07:58:34

est ce que quelq'un pourrait me donner une reponse, c'est tres important!!
27 Avril 2006 09:32:57

je recherchais le projet dans lequel je m'étais amusé avec.

Les tooltip sont assez pénible à utiliser si tu n'utilises pas celui implémenté par défaut pour les objets les gérants déjà.

Alors voici comment j'ai fait pour ajouter un tooltip qui m'affiche les coordonnées d'un point à l'intérieur d'une frame de type CView.

Dans ton .h, rajoute deux membres et une méthode:
  1. CToolTipCtrl* tool;
  2. char* text;//contiendra le message à afficher
  3. BOOL OnToolTipNeedText( UINT id, NMHDR * pNMHDR, LRESULT * pResult );


Dans ton .cpp, ajoute la gestion du message suivant :

  1. BEGIN_MESSAGE_MAP(CMyView, CView)
  2. ...
  3. ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnToolTipNeedText )
  4. ...
  5. END_MESSAGE_MAP()


Ajoute la méthode de cet évènement :
  1. BOOL CMyView::OnToolTipNeedText( UINT id, NMHDR * pNMHDR, LRESULT * pResult )
  2. {
  3. TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
  4. UINT nID =pNMHDR->idFrom;
  5. if (pTTT->uFlags & TTF_IDISHWND)
  6. {
  7. pTTT->lpszText=text;
  8. return(TRUE);
  9. }
  10. return(FALSE);
  11. }


Dans le code d'initialisation de ta fenêtre, ajoute la création du tooltip :

  1. text=new char[256]; //la taille max. du message qui sera affiché dans ta tooltip
  2. tool=new CToolTipCtrl();
  3. tool->Create(this,TTS_ALWAYSTIP|TTF_TRACK|TTF_ABSOLUTE|TTF_IDISHWND );
  4.  
  5. TOOLINFO ti;
  6. ti.cbSize = sizeof(TOOLINFO);
  7. ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
  8. ti.hwnd = this->m_hWnd;
  9. ti.uId = (UINT)AfxGetMainWnd()->m_hWnd;
  10. ti.hinst = AfxGetInstanceHandle();
  11. ti.lpszText = LPSTR_TEXTCALLBACK;
  12. ti.rect.left = ti.rect.top = ti.rect.bottom = ti.rect.right = 0;
  13.  
  14. tool->SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti);
  15. tool->SendMessage(TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti);
  16. tool->SendMessage(TTM_SETMAXTIPWIDTH,0,(LPARAM)SHRT_MAX);
  17. tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_AUTOPOP,(LPARAM)(INT) MAKELONG(SHRT_MAX,0));
  18. tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_INITIAL,(LPARAM)(INT) MAKELONG(200,0));
  19. tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_RESHOW ,(LPARAM)(INT) MAKELONG(200,0));
  20.  
  21. tool->EnableTrackingToolTips(TRUE);
  22. tool->EnableToolTips(TRUE);
  23. tool->Activate(TRUE);



Par la suite, il suffit de faire ça n'importe où dans ton code pour l'afficher :
  1. sprintf(text,format, parametre, ...);//mise à jour du texte à afficher
  2. tool->SendMessage(TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(coordonné x,coordonné y));//affichage du tooltip


Tu peux jouer sur les paramètres de délai, je te laisse adapté ce bout de code.
27 Avril 2006 09:46:01

merci pour ta reponse, mais est ce que cela change beaucoup de chose pour une frame de type CScrollView?
27 Avril 2006 09:52:27

Je ne pense pas puisque CScrollView dérive de la classe CView.
Tu as simplement la prise en charge automatique du scrolling en plus, mais rien en moins.
27 Avril 2006 10:17:05

j'ai essayer ton code et je ne comprend pas tout, est ce que tu pourrais un peu m'expliquer les parametre de la des fonctions suivantes: sprintf et sendMessage.
de plus pour essayer j'ai mis le code dans on draw est l'info bulle n'apparrait pas vers le pointeur de la souris mais en haut a gauche de mon ecran!!
27 Avril 2006 10:43:44

Qu'est ce que tu ne comprends pas pour le sprintf ??? La fonction où ce qu'elle vient faire ici??

le sendMessage permet d'envoyer directement des messages à tous les éléments qui sont capables dans recevoir ...


Cette méthode prend toujours 3 paramètres :
- le message à envoyer
- un WPARAM
- un LPARAM

Les 2 derniers paramètres sont dépendants du message et je te renvois à la doc pour chacun des messages.

Si l'on prend le message :
tool->SendMessage(TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(position x,position y));

tu envois le message TTM_TRACKPOSITION au tooltip "tool".

Si tu prends la doc tu verra que le WPARAM doit être à 0, et que le LPARAM doit être (LPARAM)(DWORD) MAKELONG(xPos, yPos).
xPos et yPos doivent également être dans les coordonées de l'écran (cf doc).

Par contre je te déconseille de mettre l'appel à ce message dans la fonction draw car ce n'est pas ce que tu souhaites faire. Tu souhaites affiché quelque chose quand ta souris s'arrête 3 secondes sur un pixel, il faut donc mettre ce message dans la méthode de gestion du mouvement de la souris :o nMouseMove.
D'ailleurs cette méthode te donne la position de la souris à l'intérieur de ta fenêtre, il faut donc utiliser la méthode ClientToScreen pour transformé les coordonnées.

Voilà à quoi ta fonction doit ressembler (pour affiché les coordonnées par exemple):
  1. void CMyView::OnMouseMove(UINT nFlags, CPoint point)
  2. {
  3. sprintf(text,"x=%d\r\ny=%d",point.x,point.y);
  4. CPoint p=point;
  5. ClientToScreen(&p);
  6. tool->SendMessage(TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(p.x+20,p.y+20));
  7. //le +20 c'est à décaler l'affichage à côté du curseur et pas pile dessous, sinon tu ne vois pas l'endroit que tu pointes.
  8.  
  9. CView::OnMouseMove(nFlags, point);
  10. }
27 Avril 2006 11:34:21

merci pour ton aide ataofeal c'a ma bien aider :king:
28 Avril 2006 09:18:21

salut, j'ai encore quelque probleme avec les info bulle, deja, l'info bulle apparait des que je pointe sur le pixel, sans aucun delai(j'ai pourtant essayer de changer les parametre, mais cela ne change rien).
De plus au bout d'un moment les infos bulles reste afficher trop longtemps, et on vois une longe traine d'info bulle si je bouge ma souris. enfin pour finir si j'ouvre une boite de dialogue pour realiser un traitement sur l'image, une fois que je revient sur la fenetre avec mon image, mon info bulle ne reapparait plus. j'ai bien essayer de trouver des solution, mais cela ne change rien.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS