[MFC] Reperer qu'une fenetre a le focus

Reperer qu'une fenetre a le focus [MFC] - C++ - Programmation

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 :

Code :
  1. CWinApp* pApp = AfxGetApp();
  2. pApp->GetMainWnd()->SetWindowText(_T("Nouveau titre" ));


 
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
Reply

Marsh Posté le 08-05-2003 à 16:51:55   

Reply

Marsh Posté le 08-05-2003 à 16:59:29    

Reply

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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)

Reply

Marsh Posté le 08-05-2003 à 17:12:45    

Konar a écrit :

bon ok... j'ai droit a un 2eme essai ?
 
http://msdn.microsoft.com/library/ [...] .2d_.c.asp
 
(1er msg)


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.

Reply

Marsh Posté le 08-05-2003 à 17:18:11    

salut polo  :whistle:  
 
alors ca mord ?


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

Marsh Posté le 08-05-2003 à 17:22:41    

polo021 a écrit :


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.  


 
bah la je sais pas trop... comme les autres messages ca veut pas ? la faut demander a des gens ki clakez des mfc.

Reply

Marsh Posté le 08-05-2003 à 17:25:49    

simogeo a écrit :

salut polo  :whistle:  
 
alors ca mord ?


j'espere que j'ai mis assez d'appats  :lol:  
 
Tu sais pas comment je peux le faire toi?

Reply

Marsh Posté le 08-05-2003 à 17:29:58    

dans la MESSAGE MAP de ta classe de fenêtre (fichier cpp) :
 

Code :
  1. BEGIN_MESSAGE_MAP(CMaDlg, CDialog)
  2. //{{AFX_MSG_MAP(CMaDlg)
  3. ON_WM_SYSCOMMAND()
  4. ON_WM_PAINT()
  5. ON_WM_QUERYDRAGICON()
  6. //}}AFX_MSG_MAP
  7.         ON_WM_ACTIVATE
  8. END_MESSAGE_MAP()


 
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 :
  1. protected:
  2. HICON m_hIcon;
  3. // Generated message map functions
  4. //{{AFX_MSG(CMaDlg)
  5. virtual BOOL OnInitDialog();
  6. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  7. afx_msg void OnPaint();
  8. afx_msg HCURSOR OnQueryDragIcon();
  9. //}}AFX_MSG
  10.         void OnActivate();
  11. DECLARE_MESSAGE_MAP()


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-05-2003 à 17:32:24    

Harkonnen a écrit :

dans la MESSAGE MAP de ta classe de fenêtre (fichier cpp) :
 

Code :
  1. BEGIN_MESSAGE_MAP(CMaDlg, CDialog)
  2. //{{AFX_MSG_MAP(CMaDlg)
  3. ON_WM_SYSCOMMAND()
  4. ON_WM_PAINT()
  5. ON_WM_QUERYDRAGICON()
  6. //}}AFX_MSG_MAP
  7.         ON_WM_ACTIVATE
  8. END_MESSAGE_MAP()


 
 
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 :
  1. protected:
  2. HICON m_hIcon;
  3. // Generated message map functions
  4. //{{AFX_MSG(CMaDlg)
  5. virtual BOOL OnInitDialog();
  6. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  7. afx_msg void OnPaint();
  8. afx_msg HCURSOR OnQueryDragIcon();
  9. //}}AFX_MSG
  10.         void OnActivate();
  11. DECLARE_MESSAGE_MAP()




;) 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?

Reply

Marsh Posté le 08-05-2003 à 17:32:24   

Reply

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


Message édité par Harkonnen le 08-05-2003 à 17:44:07

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-05-2003 à 17:46:33    

polo021 a écrit :


j'espere que j'ai mis assez d'appats  :lol:  
 
Tu sais pas comment je peux le faire toi?


 
non j'y connais rien en MFC  [:spamafote]


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
Reply

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 :
  1. void CTaClass::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized )
  2. {
  3.     if (nState == WA_INACTIVE) {
  4.          // On perd le focus
  5.     }
  6.     else {
  7.          // On doit avoir le focus
  8.     }
  9. }

Reply

Marsh Posté le 09-05-2003 à 09:18:39    

ca a l'air d'etre ce que je recherchais.
Merci beaucoup Harko et VisualC++.  :jap:

Reply

Marsh Posté le 09-05-2003 à 09:37:30    

Code :
  1. void CDlg1::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  2. {
  3. CDialog::OnActivate(nState, pWndOther, bMinimized);
  4. // TODO: Add your message handler code here
  5.  CWinApp* pApp = AfxGetApp();
  6. if (nState == WA_ACTIVE)
  7.  pApp->GetMainWnd()->SetWindowText(_T("Dlg1 affichee" ));
  8. }


 
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?

Reply

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.
Vous ne savez pas ce que j'ai oublie de faire?  


Alors j'avais bien compris dés le début ce que tu souhaitais, Konar m'a induit en erreur :fou:
Regarde le 1er lien que je t'ai donné concernant la fonction GetActiveWindow()


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-05-2003 à 10:15:30    

Harkonnen a écrit :


Alors j'avais bien compris dés le début ce que tu souhaitais, Konar m'a induit en erreur :fou:
Regarde le 1er lien que je t'ai donné concernant la fonction GetActiveWindow()


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.


Message édité par polo021 le 09-05-2003 à 10:17:57
Reply

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.  ;)

Reply

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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

Reply

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 :
  1. BOOL CDlg1::OnInitialDialog(nState, pWndOther, bMinimized)
  2. {
  3.     ......
  4.     CWinApp* pApp = AfxGetApp();
  5.     pApp->GetMainWnd()->SetWindowText(_T("Dlg1 affichee" )); 
  6.     return TRUE;
  7. }

 
 
 
Ca suffit pas  :??:

Reply

Marsh Posté le 09-05-2003 à 12:03:23    

VisualC++ a écrit :

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 :
  1. BOOL CDlg1::OnInitialDialog(nState, pWndOther, bMinimized)
  2. {
  3.     ......
  4.     CWinApp* pApp = AfxGetApp();
  5.     pApp->GetMainWnd()->SetWindowText(_T("Dlg1 affichee" )); 
  6.     return TRUE;
  7. }

 
 
 
Ca suffit pas  :??:  


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


Message édité par polo021 le 09-05-2003 à 12:04:50
Reply

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 :
  1. LRESULT C*********::OnActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  2. {
  3. switch (wParam)
  4. {
  5.  case WA_ACTIVE:
  6.   OutputDebugString("WA_ACTIVE" );
  7.   ::SetWindowText(m_hWndParent, "Truc active" );
  8.   break;
  9.  case WA_CLICKACTIVE:
  10.   OutputDebugString("WA_CLICKACTIVE" );
  11.   ::SetWindowText(m_hWndParent, "Truc clickactive" );
  12.   break;
  13.  case WA_INACTIVE:
  14.   OutputDebugString("WA_INACTIVE" );
  15.   ::SetWindowText(m_hWndParent, "Truc inactive" );
  16.   break;
  17. }
  18. return 0;
  19. }


 
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.

Reply

Marsh Posté le 09-05-2003 à 12:06:51    

Harkonnen a écrit :


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


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

Reply

Marsh Posté le 09-05-2003 à 12:08:08    

Konar a écrit :


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.


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

Reply

Marsh Posté le 09-05-2003 à 12:09:17    

Harkonnen a écrit :


Tu lui causes Win32 là, lui il te cause MFC :)


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

Reply

Marsh Posté le 09-05-2003 à 12:13:14    

polo021 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 ...


 
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

Reply

Marsh Posté le 09-05-2003 à 12:16:16    

polo021 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 ...


 
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 :
  1. if (nState == WA_INACTIVE) {
  2.         // On perd le focus  
  3.    }
  4.    else {
  5.         // On doit avoir le focus  
  6.    }


 
Car y a WA_ACTIVE , WA_CLICKACTIVE et WA_INACTIVE comme message

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed