Votre question

[MFC]probleme d'affichage d'info bulle

Tags :
  • Programmation
Dernière réponse : dans Programmation
3 Mai 2006 16:20:46

salut, pour non application je dois utiliser des info bulle.
voici comment je les ai codé:

dans myVyew.h j'ai mis:
Code :
  1. CToolTipCtrl* tool ; //On definie une variable pour l'info bulle
  2. char* text;//contiendra le message à afficher


dans le constructeur de mon cpp, j'ai mis:
Code :
  1. text=new char[256]; //la taille max. du message qui sera affiché dans ta tooltip
  2. tool=new CToolTipCtrl();


dans la fonction oninitialeupdate, j'ai mis:
Code :
  1. tool->Create(this,TTS_ALWAYSTIP|TTF_TRACK|TTF_ABSOLUTE|TTF_IDISHWND );
  2. TOOLINFO ti;
  3. ti.cbSize = sizeof(TOOLINFO);
  4. ti.uFlags = TTF_IDISHWND | TTF_TRACK | TTF_ABSOLUTE;
  5. ti.hwnd = this->m_hWnd;
  6. ti.uId = (UINT)AfxGetMainWnd()->m_hWnd;
  7. ti.hinst = AfxGetInstanceHandle();
  8. ti.lpszText = LPSTR_TEXTCALLBACK;
  9. ti.rect.left = ti.rect.top = ti.rect.bottom = ti.rect.right = 0; tool->SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti);
  10. tool->SendMessage(TTM_TRACKACTIVATE,(WPARAM)true,(LPARAM)&ti);
  11. tool->SendMessage(TTM_SETMAXTIPWIDTH,0,(LPARAM)SHRT_MAX);
  12. tool->SendMessage(TTM_SETDELAYTIME,(WPARAM)TTDT_AUTOPOP,(LPARAM)(INT) MAKELONG(SHRT_MAX,0));
  13.  
  14. tool->SendMessage(TTM_SETDELAYTIME,(WPARAM)TTDT_INITIAL,(LPARAM)(INT) MAKELONG(200,0));
  15. tool->SendMessage(TTM_SETDELAYTIME,(WPARAM)TTDT_RESHOW ,(LPARAM)(INT) MAKELONG(200,0));
  16. tool->EnableTrackingToolTips(true);
  17. tool->EnableToolTips(true); tool->Activate(true);


et enfin je met ce code dans la fonction OnMouseMove pour que l'info bulle s'affiche dés que je laisse ma souris plus de trois seconde sur le même pixel:
Code :
  1. int ng;
  2. DC=GetWindowDC(); ng=Calcul_ng(point);
  3. sprintf(text,"x=%d\r\ny=%d\r\nng=%d",point.x,point.y,ng);
  4. CPoint p=point; ClientToScreen(&p);
  5. tool->SendMessage(TTM_TRACKPOSITION,0,(LPARAM)MAKELPARAM(p.x+20,p.y+20));
  6. //le +20 c'est à décaler l'affichage à côté du curseur et pas pile dessous


le probleme, c'est que mon info bulle apparait dès que je pointe sur le pixel et il n'y a pas un temps d'atente de trois seconde.j'ai bien essayer de changer des parametre des fonctions tool->SendMessage(TTM_SETDELAYTIME,(WPARAM)TTDT_AUTOPOP,(LPARAM)(INT) MAKELONG(SHRT_MAX,0)) mais ca ne change rien.

De plus si je sort la souris de ma fenetre, l'info bulle reste afficher a la derniere position ou ma souris etait dns le fenetre.

Est ce que qulqu'un saurait comment je pourrait resudre mes probleme, car j'ai regarder dans la FAQ mais je n'est pas trouver de solution a mes probleme.

Autres pages sur : mfc probleme affichage info bulle

3 Mai 2006 22:29:40

Tu devrais placer un Listener sur la souris afin qu'elle réagisse, en fonction de l'endroit où elle se trouve pour pas qu'elle reste alors que ta souris n'est plus sur ta Frame.

Pour le compte à rebours, tu dois utiliser les fonctions du timer windows.
4 Mai 2006 08:53:02

Ok , mais comment on ce sert d'un Listener et d'un timer parce qu je connait pas
Contenus similaires
4 Mai 2006 14:43:59

pour le listener, en java c'est simple mais pour c++ je sais pas du tout comment faire. il faut que tu le codes à la mano. C'est un programme sentinel qui vérifie en permanence la position de la souris et qui réagit en fonction de sa position, ça te donnes une piste déjà.

Par contre, pour le timer, voici quelque chose qui pourrait éventuellement t'intéresser :
Créer et Utiliser un timer en C++

:-? désolé de ne pouvoir faire plus.
4 Mai 2006 15:00:18

merci pour l'aide que tu m'a apporter poolos, je pense que ca m'aidera bien, au moins pour le timer

:-D
4 Mai 2006 17:01:16

la "fonction" onMouseMove qui est la gestion de l'évènement WM_MOUSEMOVE fait la même chose que le listener de java donc ça ne change rien au problème.

Effectivement je constate les mêmes pb que toi, c'est à dire non gestion du délai et disparition du tooltip si l'on affiche un boite de dialogue par dessus ... je n'ai pas trouvé le pb.
Utiliser un timer n'est pas la bonne méthode ici. En fait ce que tu cherches à faire est de recréer le système du tooltip. Dans ce cas il vaut mieux le faire de cette façon :
Tu déclares une variable dans ton code qui te sert d'indicateur de mouvement.
Lorsque ta souris bouge elle remet cet indicateur à l'état initial.
Le thread, lui, attend patiement que cet indicateur ne change pas d'état pendant un délai que tu détermines et à ce moment là c'est lui qui envoie le message au tooltip (ou qui affiche une boîte de dialogue ou ce que tu veux avec l'info qui t'intéresse)
4 Mai 2006 18:27:34

salut, merci pour ta reponse, mais je suis pas tres bon en programmation et j'ai pas trop compris comment faire.
est ce que tu pourrai me l'expliquer un peu plus precisement s'il te plait.
9 Mai 2006 08:43:10

s'il te plait , tu pourrait mieux m'expliquer car je ne compprend pas comment gerer la variable dont tu me parle dans ta reponse
9 Mai 2006 14:29:38

s'ilvous plaitquelqu'un peu repondre, c'est important
9 Mai 2006 15:13:11

Pour l'info bulle je ne vois pas la raison du problème, certainement un pb du handler ou un message qu'il faut gérer ...

Pour recréer un processus équivalent tu peux donc le faire avec un thread (ou plusieurs^^).

Le mécanisme est le suivant :
Tu déclares soit une fonction indépendante de ta classe CView, soit une méthode de ta classe mais ATTENTION, elle devra être static. Seul les méthodes static peuvent être lancé en tant que thread (ces fonctions doivent être de type void et une méthode non static est toujours de la forme this->mamethode, car le "this->" est implicite).

Tu crées les variables suivantes :
- bool bAppliOK : une variable qui indique à ton thread qu'il doit mourrir (^^ c'est plutôt important pour éviter les crash)
- une variable qui te permettra de savoir depuis combien de temps la souris n'a pas bougé.

A l'init de ta fenetre (dans le constructeur), tu positionnes ta variable bAppliOK à true.
A la femerture (dans le destructeur), tu la positionnes à false.

Dans ta méthode de gestion du mouvement de la souris (OnMouseMove) tu dois remettre la variable qui contient le temps à l'heure courante.

Ton thread doit être démarré à l'initialisation de ta vue et tu dois lui passer un pointeur vers ta classe CMyView (pour qu'il puisse interagir avec ta classe et qu'il possède le maximum de ton contexte)

Ton thread est un boucle infini gérer avec un sleep qui sera le temps de réaction de ta tooltip à l'init par exemple. Ta boucle infini est basé sur :
while(bAppliOK){
Sleep(temps_en_milliseconde)
...
}
_endthread();

Attention, le _endthread est utilisé dans le thread, ce n'est pas l'appli qui l'envoit mais le thread sur lui même.

Dans le while de ton thread tu vérifies si le temps écoulé (grace à la variable) est supérieur au délai que tu auras paramétré. Si oui tu affiches une boite de dialogue (fenetre non standard sans bord et transparente par ex. sous XP) avec tes infos. (Le mieux étant quand même de passer par un autre thread qui ne gérera que la fenetre).

C'est à mon avis refaire un mécanisme qui existe par défaut sous Windows et surtout je t'ai décris le minimum syndicale (il faudra gérer le fait que le souris soit ou non dans la fenetre, le recouvrement pas une autre fenetre, ...) et il vaut mieux essayer de voir pourquoi la 1ère méthode que je t'ai donné pose ces 2 pb : Non prise en compte des délais et disparition du tooltip apres ouverture d'une boite de dialogue.

Je te conseille de chercher sur les newsgroup qui sont très riche en information et exemple et pb en tout genre (tu n'es certainement pas le seul à avoir eu ce problème).
9 Mai 2006 15:23:11

merci
juste une petite derniere chose parce que je suis une bille en programmation. Comment on declare une fonction static
9 Mai 2006 15:27:44

par exemple pour un thread, le prototype sera le suivant :

static void monthread(void* mesparams);
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