Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2731 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [MFC] Reperer qu'une fenetre a le focus

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MFC] Reperer qu'une fenetre a le focus

n°387258
polo021
Posté le 08-05-2003 à 16:51:55  profilanswer
 

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
mood
Publicité
Posté le 08-05-2003 à 16:51:55  profilanswer
 

n°387262
Konar
Posté le 08-05-2003 à 16:59:29  profilanswer
 
n°387269
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-05-2003 à 17:04:01  profilanswer
 


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)
n°387272
Konar
Posté le 08-05-2003 à 17:06:35  profilanswer
 

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

n°387275
polo021
Posté le 08-05-2003 à 17:12:45  profilanswer
 

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.

n°387278
simogeo
j'ai jamais tué de chats, ...
Posté le 08-05-2003 à 17:18:11  profilanswer
 

salut polo  :whistle:  
 
alors ca mord ?


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°387279
Konar
Posté le 08-05-2003 à 17:22:41  profilanswer
 

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.

n°387281
polo021
Posté le 08-05-2003 à 17:25:49  profilanswer
 

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?

n°387284
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-05-2003 à 17:29:58  profilanswer
 

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)
n°387289
polo021
Posté le 08-05-2003 à 17:32:24  profilanswer
 

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?

mood
Publicité
Posté le 08-05-2003 à 17:32:24  profilanswer
 

n°387296
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-05-2003 à 17:42:41  profilanswer
 

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)
n°387299
simogeo
j'ai jamais tué de chats, ...
Posté le 08-05-2003 à 17:46:33  profilanswer
 

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
n°387392
VisualC++
J'va y penser ...
Posté le 08-05-2003 à 19:32:52  profilanswer
 

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

n°387896
polo021
Posté le 09-05-2003 à 09:18:39  profilanswer
 

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

n°387916
polo021
Posté le 09-05-2003 à 09:37:30  profilanswer
 

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?

n°387932
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-05-2003 à 09:54:24  profilanswer
 

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)
n°387958
polo021
Posté le 09-05-2003 à 10:15:30  profilanswer
 

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
n°387976
polo021
Posté le 09-05-2003 à 10:34:44  profilanswer
 

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

n°387990
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-05-2003 à 10:40:21  profilanswer
 

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)
n°387993
polo021
Posté le 09-05-2003 à 10:43:23  profilanswer
 

a oui pas bete.
Si ca fonctionne bien comme ca, j'essayerai donc de dedier un thread a ca.
 
 :jap:

n°388015
VisualC++
J'va y penser ...
Posté le 09-05-2003 à 11:22:19  profilanswer
 

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

n°388074
polo021
Posté le 09-05-2003 à 12:03:23  profilanswer
 

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
n°388075
Konar
Posté le 09-05-2003 à 12:04:38  profilanswer
 

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.

n°388078
Konar
Posté le 09-05-2003 à 12:06:51  profilanswer
 

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

n°388079
polo021
Posté le 09-05-2003 à 12:08:08  profilanswer
 

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

n°388082
konar_spre​me
Posté le 09-05-2003 à 12:09:17  profilanswer
 

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

n°388090
Konar
Posté le 09-05-2003 à 12:13:14  profilanswer
 

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

n°388092
VisualC++
J'va y penser ...
Posté le 09-05-2003 à 12:16:16  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [MFC] Reperer qu'une fenetre a le focus

 

Sujets relatifs
[QT] Fermeture d'une fenêtre[C++ et MFC] fichier ini
[Linux C] ncurses et redimensionnement de fenetre sous X[MFC VC++ 6] bulles sur les trayicons
[MFC - soluce inside] disabler un edit depuis le programme[MFC/C++] Créer un menu+gérer les évenements du menu [résolu]
FileDialog sans MFCFermer une fenetre ... :)
Création d'une fenêtre invisible !?![javascript] fenetre msgbox
Plus de sujets relatifs à : [MFC] Reperer qu'une fenetre a le focus


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR