Tom's Guide > Forum > Programmation > [MFC] realisation d'info bulle

[MFC] realisation d'info bulle

Forum Programmation : [MFC] realisation d'info bulle

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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?

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Microsoft Foundation Classes, c'est une API windows en C++

Répondre à CRicky

est ce que quelq'un pourrait me donner une reponse, c'est tres important!!

Répondre à jiraya43

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:

Code :
  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 :

Code :
  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 :

Code :
  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 :

Code :
  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.     TOOLINFO ti;
  5.     ti.cbSize = sizeof(TOOLINFO);
  6.     ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
  7.     ti.hwnd  = this->m_hWnd;
  8.     ti.uId    = (UINT)AfxGetMainWnd()->m_hWnd;
  9.     ti.hinst  = AfxGetInstanceHandle();
  10.     ti.lpszText  = LPSTR_TEXTCALLBACK;
  11.     ti.rect.left = ti.rect.top = ti.rect.bottom = ti.rect.right = 0;
  12.     tool->SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti);
  13.     tool->SendMessage(TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti);
  14.     tool->SendMessage(TTM_SETMAXTIPWIDTH,0,(LPARAM)SHRT_MAX);
  15.     tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_AUTOPOP,(LPARAM)(INT) MAKELONG(SHRT_MAX,0));
  16.     tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_INITIAL,(LPARAM)(INT) MAKELONG(200,0));
  17.     tool->SendMessage(TTM_SETDELAYTIME ,(WPARAM)TTDT_RESHOW ,(LPARAM)(INT) MAKELONG(200,0));
  18.     tool->EnableTrackingToolTips(TRUE);
  19.     tool->EnableToolTips(TRUE);
  20.     tool->Activate(TRUE);




Par la suite, il suffit de faire ça n'importe où dans ton code pour l'afficher :

Code :
  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.

Répondre à ataofeal

merci pour ta reponse, mais est ce que cela change beaucoup de chose pour une frame de type CScrollView?

Répondre à jiraya43

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.

Répondre à ataofeal

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!!

Répondre à jiraya43

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 :OnMouseMove.
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):

Code :
  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.     CView::OnMouseMove(nFlags, point);
  9. }

Répondre à ataofeal

merci pour ton aide ataofeal c'a ma bien aider :king:

Répondre à jiraya43

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.

Répondre à jiraya43
Tom's Guide > Forum > Programmation > [MFC] realisation d'info bulle
Aller à :

Il y a 2833 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens