Reperer qu'une fenetre a le focus [MFC] - C++ - Programmation
Marsh Posté le 08-05-2003 à 17:04:01
Tu lui causes Win32 là, lui il te cause MFC
http://msdn.microsoft.com/library/ [...] window.asp
Marsh Posté le 08-05-2003 à 17:06:35
bon ok... j'ai droit a un 2eme essai ?
http://msdn.microsoft.com/library/ [...] .2d_.c.asp
(1er msg)
Marsh Posté le 08-05-2003 à 17:12:45
Konar a écrit : bon ok... j'ai droit a un 2eme essai ? |
Ca a l'air de bien correspondre a ce que je cherche.
Mais comment je mets ca en oeuvre, le OnActivate? Je le trouve nulpart dans le MFC ClassWizard.
Marsh Posté le 08-05-2003 à 17:18:11
salut polo
alors ca mord ?
Marsh Posté le 08-05-2003 à 17:22:41
polo021 a écrit : |
bah la je sais pas trop... comme les autres messages ca veut pas ? la faut demander a des gens ki clakez des mfc.
Marsh Posté le 08-05-2003 à 17:25:49
simogeo a écrit : salut polo |
j'espere que j'ai mis assez d'appats
Tu sais pas comment je peux le faire toi?
Marsh Posté le 08-05-2003 à 17:29:58
dans la MESSAGE MAP de ta classe de fenêtre (fichier cpp) :
Code :
|
toujours dans ce fichier, créer la fonction void OnActivate() qui réagira à l'évènement.
enfin, dans le .h de ta fenêtre :
Code :
|
Marsh Posté le 08-05-2003 à 17:32:24
Harkonnen a écrit : dans la MESSAGE MAP de ta classe de fenêtre (fichier cpp) :
|
OK, je regarderai a ca demain a la premiere heure.
Mais c'est pas un peu bourrin d'aller modifier la message map directement dans le code comme ca?? Ca se fait courament?
Marsh Posté le 08-05-2003 à 17:42:41
Laisse tomber, je t'ai dit une connerie, je viens de m'apercevoir que WM_ACTIVATE est quand même dispo :
- Va dans le classview, et fais un clic-droit sur ta classe de dialogue. Dans le menu, choisis "Add Windows Message Handler"
- Dans la Dialog qui apparait, dans le combo "Filter for messages available to class", choisis "Window"
- Maintenant sélectionne dans la liste du coté gauche le message WM_ACTIVATE et clique sur le bouton "Add and Edit"
edit: a ma connaissance, la seule fois ou j'ai du modifier la MESSAGE_MAP, c'était pour ajouter un handler qui interceptait les clics sur un TrayIcon
Marsh Posté le 08-05-2003 à 17:46:33
polo021 a écrit : |
non j'y connais rien en MFC
Marsh Posté le 08-05-2003 à 19:32:52
Pour la message map a la main pour tout ce qui est message perso tu peux avoir a le faire a la main
Sinon le OnActivate dispo pour les classes derivees de CWnd pourra sans doute faire l'affaire
Code :
|
Marsh Posté le 09-05-2003 à 09:18:39
ca a l'air d'etre ce que je recherchais.
Merci beaucoup Harko et VisualC++.
Marsh Posté le 09-05-2003 à 09:37:30
Code :
|
en fait ca n'a pas l'air de faire ce que je voudrais que ca fasse.
Avec ce que vous m'avez donne, le titre de mon application ne change que si je fais une action sur la boite modale. Or ce qui m'interesserai, c'est que le titre de l'application change des que la boite de dialogue s'affiche.
Vous ne savez pas ce que j'ai oublie de faire?
Marsh Posté le 09-05-2003 à 09:54:24
polo021 a écrit : Avec ce que vous m'avez donne, le titre de mon application ne change que si je fais une action sur la boite modale. Or ce qui m'interesserai, c'est que le titre de l'application change des que la boite de dialogue s'affiche. |
Alors j'avais bien compris dés le début ce que tu souhaitais, Konar m'a induit en erreur
Regarde le 1er lien que je t'ai donné concernant la fonction GetActiveWindow()
Marsh Posté le 09-05-2003 à 10:15:30
Harkonnen a écrit : |
oui et non en fait.
GetActiveWindow permet d'obtenir un handle sur la fenetre qui est active a un moment donne. Mais moi ce que ce je cherche, c'est reperer l'instant precis ou une fenetre devient active.
Marsh Posté le 09-05-2003 à 10:34:44
ou alors avec ta methode, je pourrai utiliser un timer dans mon MainFrame qui irai rechercher le handle sur la fenetre active toute les x ms et qui ferai le traitement si j'ai un nouveau handle.
Marsh Posté le 09-05-2003 à 10:40:21
polo021 a écrit : ou alors avec ta methode, je pourrai utiliser un timer dans mon MainFrame qui irai rechercher le handle sur la fenetre active toute les x ms et qui ferai le traitement si j'ai un nouveau handle. |
Sauf que le Timer va te bouffer 100% des ressources. Si vraiment tu tiens à procéder comme ça, il vaut mieux que tu dédies un worker thread à cette tache
Marsh Posté le 09-05-2003 à 10:43:23
a oui pas bete.
Si ca fonctionne bien comme ca, j'essayerai donc de dedier un thread a ca.
Marsh Posté le 09-05-2003 à 11:22:19
Erf desole mais j'avais pas tout lu niveau de tes reponses.
Ben si tu veux que le Titre de l'app change des que la dlg est cree euh y plus simple non ?
Code :
|
Ca suffit pas
Marsh Posté le 09-05-2003 à 12:03:23
VisualC++ a écrit : Erf desole mais j'avais pas tout lu niveau de tes reponses.
|
oui mais ce n'est pas si simple. Dans mes boites de dialog, j'en appele d'autres qui en appelent d'autres.
Donc si la boite A appelle la boite B, il faut aussi que quand B se termine, je reaffiche le titre pour A (puisque c'est dans celle la que je re-atterris).
Je peux evidement le faire dans le OnClose de la dialog box B mais j'aurais aime un truc plus simple, plus propre et mieux pense.
Mais bon je vais devoir me rabbatre vers cette solution je crois
Marsh Posté le 09-05-2003 à 12:04:38
bon alors soit les gens ont du mal, soit j'ai rien compris a ce ke ca demandait.
j'ai une appli atl/mfc, et dans la classe d'une fenetre (celle que ke je veux qu'elle change de titre), j'ai rajouté un handler sur WM_ACTIVATE.
Code :
|
et ca marche nickel, le titre change qd je passe a une autre appli, qd j'ouvre une boite modale de la meme appli, etc.
si ca marche pas chez vous donc ca doit etre la faute aux mfc ?
(la c'est une AtlDialog avec des mfc dedans mais bon...)
donc voila.
Marsh Posté le 09-05-2003 à 12:06:51
Harkonnen a écrit : |
moui, ca peut bouffer 100% des ressources, si tu fais un timer a 10 ms et que tu calcules pi dedans, mais si c'est juste pour changer le texte d'une fenetre, un timer a 200 ms et 2 fct win32 dedans, c'est pas critique...
Marsh Posté le 09-05-2003 à 12:08:08
Konar a écrit : |
j'ai fait ca aussi, tout la meme chose mais ca ne fonctionne que si je clique sur la fenetre. En fait le OnActivate chez moi se comporte comme un OnClick sur la dialog box.
Je dois preciser aussi que je bosse sur WinCE (Pocket PC), je ne sais pas si ca peut jouer un role quelconque ...
Marsh Posté le 09-05-2003 à 12:09:17
Harkonnen a écrit : |
Techniquement toutes les methodes des classes MFC appelle des fonctions Win32.
Donc la reponse etait suffisante.
Chaque methode MFC a son equivalent (souvent avec le meme nom) en API Win32.
Donc c'est quand même pas bien compliqué en ayant un code MFC de le passer en Win32... (ou l'inverse).
Marsh Posté le 09-05-2003 à 12:13:14
polo021 a écrit : |
bon bah fais du spy++ et regarde quels messages tes fenetres recoivent quand tu cliques...
sinon pour CE c vrai qu'ils y a qq differences :
http://msdn.microsoft.com/library/ [...] TIVATE.asp
Marsh Posté le 09-05-2003 à 12:16:16
polo021 a écrit : |
Euh sauf que si c le code que tu as posté au dessus y a quand mm une grosse diff avec ce que Konar ou moi avons marqué pour le Activate
Code :
|
Car y a WA_ACTIVE , WA_CLICKACTIVE et WA_INACTIVE comme message
Marsh Posté le 08-05-2003 à 16:51:55
je voudrais bien changer le titre de mon application en fonction de la boite modale qui est activee a un moment donne. Donc j'aimerai que mon programme puis reperer quand une boite modale s'ouvre et se ferme.
Quelqu'un a une idee?
PS : pour changer le titre j'avais pense utiliser ca :
La question en fait est : comment faire pour reperer qu'une nouvelle fenetre devient active?
Message édité par polo021 le 09-05-2003 à 09:44:46