[VC++/MFC] Comment savoir si une PropertySheet a ete cree ?

Comment savoir si une PropertySheet a ete cree ? [VC++/MFC] - C++ - Programmation

Marsh Posté le 20-08-2002 à 16:16:02    

Mon appli comporte 2 boutons, un qui permet d'afficher une PropertySheet, et l'autre pour la fermer.
Le pb est que si j'appuie sur le bouton qui ferme avant d'avoir affiche la PropertySheet, ca merde.
Je voudrai savoir si on peut tester qu'une PropertySheet est affiche ou pas!!
Je precise que ma PropertySheet est non modale.


Message édité par try58 le 20-08-2002 à 17:28:57

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 20-08-2002 à 16:16:02   

Reply

Marsh Posté le 20-08-2002 à 16:37:34    

Ok j'ai trouve, il suffit de tester si m_hWnd de la CPropertySheet est different de NULL.


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 20-08-2002 à 16:54:52    

Ha non, ça ça te dit pas si elle est affichée ou pas !
Elle peut très bien avoir été cachée (via la méthode ShowWindow).
Pr savoir si elle est effectivement affichée, moi j'ai rien trouvé d'autre que d'utiliser un flag (BOOL b_shown). à chaque fois qu'un évènement OnShowWindow se produit, on met à jour le flag.

Reply

Marsh Posté le 20-08-2002 à 17:28:06    

En fait, je me suis mal explique. Dans mon cas, je voulais savoir si la fonction Create de la PropertySheet avait ete appele. Si c'est le cas m_hWnd n'est pas NULL.
J'ai change le titre du topic!


Message édité par try58 le 20-08-2002 à 17:29:17

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 10:48:31    

Autre probleme lie a ma PropertySheet!
Comment faire pour prevenir ma boite de dialogue principale que je viens de fermer ma PropertySheet ? Est ce que cette derniere envoie un message ?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 10:54:19    

try58 a écrit a écrit :

Autre probleme lie a ma PropertySheet!
Comment faire pour prevenir ma boite de dialogue principale que je viens de fermer ma PropertySheet ? Est ce que cette derniere envoie un message ?




 
Bien sur : WM_CLOSE peut être capté dans la callback de ta propertysheet. T'as qu'a avertir la boite de dialogue principale de la fermeture de ta property sheet à cet endroit.
Dit toi bien qu'une property sheet, c une CWnd (une fenêtre quoi !)

Reply

Marsh Posté le 21-08-2002 à 11:27:46    

El_Gringo a écrit a écrit :

 
 
Bien sur : WM_CLOSE peut être capté dans la callback de ta propertysheet. T'as qu'a avertir la boite de dialogue principale de la fermeture de ta property sheet à cet endroit.
Dit toi bien qu'une property sheet, c une CWnd (une fenêtre quoi !)




 
Heu j'ai cherche, mais je ne vois pas a quelle callback tu fais allusion!


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 11:38:23    

try58 a écrit a écrit :

 
 
Heu j'ai cherche, mais je ne vois pas a quelle callback tu fais allusion!




 
Ha, dsl. T'as jammais fait d'API Win32 (C sous windows) toi, hein !?
Bah, avec les MFC, ça se passe du coté de la méthode OnClose, que tu peux ajouter à ta property sheet avec le wizard. Ou, si tu peux pas avec le wizard, ajoute "ON_WM_CLOSE()" à ta message map (entre le "BEGIN_MESSAGE_MAP(CNomDeTaClasse, CPropertySheet)" et le "END_MESSAGE_MAP()" ).
Ensuite, ajoute à la classe de ta property sheet une méthode "void OnClose ()"
cette méthode sera appelée quand ta property sheet est fermée normalement.

Reply

Marsh Posté le 21-08-2002 à 11:54:07    

El_Gringo a écrit a écrit :

 
 
Ha, dsl. T'as jammais fait d'API Win32 (C sous windows) toi, hein !?
Bah, avec les MFC, ça se passe du coté de la méthode OnClose, que tu peux ajouter à ta property sheet avec le wizard. Ou, si tu peux pas avec le wizard, ajoute "ON_WM_CLOSE()" à ta message map (entre le "BEGIN_MESSAGE_MAP(CNomDeTaClasse, CPropertySheet)" et le "END_MESSAGE_MAP()" ).
Ensuite, ajoute à la classe de ta property sheet une méthode "void OnClose ()"
cette méthode sera appelée quand ta property sheet est fermée normalement.
 




Ben ca ne fait meme pas un an que j'en fait alors y a des trucs qui sont encore un peu obscure.  
Ma PropertySheet je l'ai cree comme ca :

Code :
  1. m_MaPropertySheet = new CPropertySheet("Nom" );
  2. //avec m_MaPropertySheet membre de ma classe principale


Donc je ne peux pas lui ajouter des methodes etant donne que je n'ai pas fait de classe derivee de CPropertySheet!
J'espere que tu m'as compris


Message édité par try58 le 21-08-2002 à 11:54:54

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 11:57:05    

Bah, a mon avis, si tu veux capter des messages de ta property sheet, tu vas devoir utiliser une classe qui en est dérivée. Ms c vite fait qd même !

Reply

Marsh Posté le 21-08-2002 à 11:57:05   

Reply

Marsh Posté le 21-08-2002 à 12:03:56    

Ok je vais essayer d'implementer ca. Je te remercie


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 12:06:40    

de rien. Tiens moi au courant !

Reply

Marsh Posté le 21-08-2002 à 14:57:14    

Donc, j'ai fais mon implementation. Maintenant j'ai mon evenement WM_CLOSE. Le probleme, c'est que je ne sais pas comment on fait pour dialoguer de la PropertySheet vers la boite de dialogue principale.
Ce que j'aimerai bien, c'est que dans la fonction OnClose de la PropertySheet je puisse appeler une fonction de la boite de dialogue principale.


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 16:25:30    

try58 a écrit a écrit :

Donc, j'ai fais mon implementation. Maintenant j'ai mon evenement WM_CLOSE. Le probleme, c'est que je ne sais pas comment on fait pour dialoguer de la PropertySheet vers la boite de dialogue principale.
Ce que j'aimerai bien, c'est que dans la fonction OnClose de la PropertySheet je puisse appeler une fonction de la boite de dialogue principale.




 
Il faut que comme membre de ta classe MyPropertySheet, tu ais une référence (ou un pointeur) vers ta boite de dialogue principale. ça, c'est déja implémenté pour toutes les CWnd, donc, ta propertysheet hérite de ça aussi.
Dans le constructeur de CPropertySheet, tu peux préciser CWnd *pParentWnd (NULL par défaut).  
Au moment ou tu construit ta propertysheet, j'imagine que c ta une méthode de ta boite de dialogue principale, passe "this" comme valeur pour ce paramètre pParentWnd
Par la suite, tu pourras a tout moment, dans ta propertysheet, accèder à ce pointeur vers l'instance de ta boite de dialogue principale (mère de ta property sheet), en faisant un GetParent ().
voili...

Reply

Marsh Posté le 21-08-2002 à 16:31:35    

[:tomilou]


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 16:32:13    

scuse, j'avais pas vu ton post


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 16:58:43    

El_Gringo a écrit a écrit :

 
 
Il faut que comme membre de ta classe MyPropertySheet, tu ais une référence (ou un pointeur) vers ta boite de dialogue principale. ça, c'est déja implémenté pour toutes les CWnd, donc, ta propertysheet hérite de ça aussi.
Dans le constructeur de CPropertySheet, tu peux préciser CWnd *pParentWnd (NULL par défaut).  
Au moment ou tu construit ta propertysheet, j'imagine que c ta une méthode de ta boite de dialogue principale, passe "this" comme valeur pour ce paramètre pParentWnd
Par la suite, tu pourras a tout moment, dans ta propertysheet, accèder à ce pointeur vers l'instance de ta boite de dialogue principale (mère de ta property sheet), en faisant un GetParent ().
voili...




Heu c'est bizare mais mon programme ne rentre pas dans le constructeur de la PropertySheet, ce qui fait que quand je fais un GetParent(), j'ai 0 comme valeur de retour. Pourtant je creer ma PropertySheet comme ceci:

Code :
  1. m_MaPropertySheet = new CMyPropertySheet("Name", this);


Normalement ca devrait le faire ?!!


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 17:04:12    

Et t'as pensé à faire un appel au constructeur de CPropertySheet dans le constructeur de ton CMyPropertySheet ?
Genre ça :

Code :
  1. CMyPropertySheet::CMyPropertySheet  ( UINT nIDCaption, CWnd *pParentWnd = NULL, UINT iSelectPage = 0 )
  2. {
  3.    CPropertySheet::CPropertySheet (nIDCaption, pParentWnd , iSelectPage);
  4.    // Ton code...
  5. }


 
hein, t'y as pensé à ça !? :D

Reply

Marsh Posté le 21-08-2002 à 17:09:35    

El_Gringo a écrit a écrit :

 
hein, t'y as pensé à ça !? :D




Ben non, je n'y avais pas pense, mais il y a le pb que le programme ne rentre pas dans le constructeur de la MyPropertySheet, donc il ne peut pas appeler le constructeur de la PropertySheet!!  :pt1cable:


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 17:13:56    

try58 a écrit a écrit :

 
Ben non, je n'y avais pas pense, mais il y a le pb que le programme ne rentre pas dans le constructeur de la MyPropertySheet, donc il ne peut pas appeler le constructeur de la PropertySheet!!  :pt1cable:  




 
fais voir ton code...
si tu fais un new CMyPropertySheet, ça passe FORCEMENT ds un constructeur !

Reply

Marsh Posté le 21-08-2002 à 17:21:38    

El_Gringo a écrit a écrit :

 
 
fais voir ton code...
si tu fais un new CMyPropertySheet, ça passe FORCEMENT ds un constructeur !




Bah mon code je l'ai deja mis au dessus, j'initialise ma MyPropertySheet dans la InitDialog() de ma boite de dialogue principale. Je teste si il passe dans mon constructeur avec le debugger en mettant un breakpoint mais il ne s'arrete jamais. C'est ca que je trouve bizarre !


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 17:23:50    

Mais t'as mis une ligne de code.
Tout se passe pas en une ligne tu sais !
fais voir le header de ta classe CMyPropertySheet, et sont .cpp ...

Reply

Marsh Posté le 21-08-2002 à 17:29:57    

El_Gringo a écrit a écrit :

Mais t'as mis une ligne de code.
Tout se passe pas en une ligne tu sais !
fais voir le header de ta classe CMyPropertySheet, et sont .cpp ...




Voici pour le header:

Code :
  1. class CMyPropertySheet : public CPropertySheet
  2. {
  3. DECLARE_DYNAMIC(CMyPropertySheet)
  4. // Construction
  5. public:
  6. CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
  7. CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
  8. // Attributes
  9. public:
  10. // Operations
  11. public:
  12. // Overrides
  13. // ClassWizard generated virtual function overrides
  14. //{{AFX_VIRTUAL(CMyPropertySheet)
  15. //}}AFX_VIRTUAL
  16. // Implementation
  17. public:
  18. virtual ~CMyPropertySheet();
  19. // Generated message map functions
  20. protected:
  21. //{{AFX_MSG(CMyPropertySheet)
  22. afx_msg void OnClose();
  23. //}}AFX_MSG
  24. DECLARE_MESSAGE_MAP()
  25. public:
  26. int m_timer;
  27. };
  28. /////////////////////////////////////////////////////////////////////////////
  29. //{{AFX_INSERT_LOCATION}}
  30. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  31. #endif // !defined(AFX_MYPROPERTYSHEET_H__0B7B64A4_5E6E_4410_861E_391982FCB8DC__INCLUDED_)


et voila pour le .cpp:

Code :
  1. #include "stdafx.h"
  2. #include "Alteon2.h"
  3. #include "MyPropertySheet.h"
  4. #include "Alteon2Dlg.h"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CMyPropertySheet
  12. IMPLEMENT_DYNAMIC(CMyPropertySheet, CPropertySheet)
  13. CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  14. :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  15. {
  16. CPropertySheet::CPropertySheet (nIDCaption, pParentWnd , iSelectPage);
  17. }
  18. CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  19. :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  20. {
  21. }
  22. CMyPropertySheet::~CMyPropertySheet()
  23. {
  24. }
  25. BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet)
  26. //{{AFX_MSG_MAP(CMyPropertySheet)
  27. ON_WM_CLOSE()
  28. //}}AFX_MSG_MAP
  29. END_MESSAGE_MAP()
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CMyPropertySheet message handlers
  32. void CMyPropertySheet::OnClose()
  33. {
  34. // TODO: Add your message handler code here and/or call default
  35. CAlteon2Dlg *parent;
  36. parent = (CAlteon2Dlg *)GetParent();
  37. if (!parent->PropertySheetsAreOpened())
  38.  SnmpCleanup();
  39. CPropertySheet::OnClose();
  40. }


Ma dialogue principale est de type CAlteon2Dlg


Message édité par try58 le 21-08-2002 à 17:30:57

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 17:37:00    

Tu fais une erreur sur l'utilisation du mot "implémentation" (ds ton commentaire ds ton header), rien de grave...
Essayer de virer le ":CPropertySheet(nIDCaption, pParentWnd, iSelectPage)" et le ":CPropertySheet(pszCaption, pParentWnd, iSelectPage)" à la fin de l'en-tête de l'implémentation des tes 2 constructeurs.

Reply

Marsh Posté le 21-08-2002 à 17:46:51    

El_Gringo a écrit a écrit :

Tu fais une erreur sur l'utilisation du mot "implémentation" (ds ton commentaire ds ton header), rien de grave...




C'est pas moi qui l'ai fait, c'est Visual qui l'a marque tout seul  ;)

El_Gringo a écrit a écrit :

Essayer de virer le ":CPropertySheet(nIDCaption, pParentWnd, iSelectPage)" et le ":CPropertySheet(pszCaption, pParentWnd, iSelectPage)" à la fin de l'en-tête de l'implémentation des tes 2 constructeurs.




Ca aussi c'est Visual qui l'a fait. J'ai essaye ce que tu m'as dit mais ca plante toujours. Pareil, il ne rentre pas dans le constructeur.
Ce que je trouve bizarre, c'est que si je ferme ma MyPropertySheet, il rentre dans la fonction OnClose(), donc ca prouve bien que l'objet a ete construit!! Me tromperais-je ?


Message édité par try58 le 21-08-2002 à 17:51:18

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 17:56:43    

Visual c pas un Dieu tu sais, il peut faire des trucs que tu n'veux pas faire... ou "se tromper" (ouais, un Dieu aussi le peu, c vrai ! :D ), tu sais !
J'viens de voir un truc.
Ton code:

Code :
  1. CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  2. :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
  3. {
  4. CPropertySheet::CPropertySheet (nIDCaption, pParentWnd , iSelectPage); 
  5. }
  6. CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  7. :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
  8. {
  9. }


 
tu fais un

Code :
  1. m_MaPropertySheet = new CMyPropertySheet("Name", this);

 
T'utilises le constructeur ds lequel t'as rien mis ! donc forcément, le débugger ne s'y arrête pas ! Aucun point d'arrêt ne peut être valides ds le constructeur que t'utilises.
 
code que je mettrai :

Code :
  1. CMyPropertySheet::CMyPropertySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
  2. {
  3.    CPropertySheet::CPropertySheet (nIDCaption, pParentWnd , iSelectPage); 
  4. }
  5. CMyPropertySheet::CMyPropertySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
  6. {
  7.    CPropertySheet::CPropertySheet(pszCaption, pParentWnd, iSelectPage);
  8. }


Message édité par El_gringo le 21-08-2002 à 17:57:56
Reply

Marsh Posté le 21-08-2002 à 18:08:03    

Arf!! Tu avais raison, je n'utilisais pas le bon constructeur.
Bon maintenant, il rentre dans le constructeur. Mais GetParent me renvoie toujours 0  :cry: (je crois que je vais me faire taper)


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 21-08-2002 à 18:12:00    

et m_MaPropertySheet.m_psh.hwndParent, il est NULL aussi !??

Reply

Marsh Posté le 21-08-2002 à 18:22:35    

El_Gringo a écrit a écrit :

et m_MaPropertySheet.m_psh.hwndParent, il est NULL aussi !??




Heu c'est quoi m_psh parce que je ne connais pas du tout. Sinon c'est chaud a tester comme valeur, je suis oblige de le faire dans la boite de dialogue principale mais la valeur est foireuse.
Bon j'arrete pour ce soir, je regarderai plus en detail demain. En tout cas merci de ton aide  :jap: ! Je pense que je ne suis pas loin


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 22-08-2002 à 09:15:18    

Bah, regarde la MSDN.
à propos de m_psh :

The WindowsPROPSHEETHEADER structure. Provides access to basic property sheet parameters.


Et comme membre de ce truc là, normalement, tu devrais avoir le HWND de la fenêtre mère que t'as passé en paramètre ds le constructeur...
 
à moi de poser une question :
C quoi une property sheet ? :D

Reply

Marsh Posté le 22-08-2002 à 09:49:02    

El_Gringo a écrit a écrit :

à moi de poser une question :
C quoi une property sheet ? :D




T'es serieux ? Parce que ca fait depuis le debut qu'on en parle et tu m'avais l'air de connaitre le sujet!!


Message édité par try58 le 22-08-2002 à 09:49:19

---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 22-08-2002 à 10:51:02    

Yeepa  [:milka]!! Ca marche! J'ai rajoute this quand j'appelle ma fonction Create de ma MyPropertySheet et donc GetParent ne me renvoie plus 0.
C'est cool, je te remercie el_gringo


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 22-08-2002 à 11:33:17    

try58 a écrit a écrit :

 
T'es serieux ? Parce que ca fait depuis le debut qu'on en parle et tu m'avais l'air de connaitre le sujet!!




 
Bah oui je suis sérieux ! g jammais utilisé ça, ça sert à quoi ?
J'te parle de ça parce que ça fonctionne comme toute CWnd : ça en hérite !

Reply

Marsh Posté le 22-08-2002 à 11:36:13    

El_Gringo a écrit a écrit :

 
 
Bah oui je suis sérieux ! g jammais utilisé ça, ça sert à quoi ?
J'te parle de ça parce que ça fonctionne comme toute CWnd : ça en hérite !




Ok, ben en fait c'est des comme des onglets. Une Property Sheet est une fenetre ou tu vas rajouter des Property Page dont chacune correspondera a un onglet!


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 22-08-2002 à 11:54:29    

Ha, génial, ça peut être carrément utile ça.
Bon, bah voila un bon topic bien efficace !  :hello:

Reply

Marsh Posté le 22-08-2002 à 12:01:33    

El_Gringo a écrit a écrit :

Ha, génial, ça peut être carrément utile ça.
Bon, bah voila un bon topic bien efficace !  :hello:  




Ouaip. J'avais fait une recherche sur le forum a propos des PropertySheet, mais y avait pas grand chose.


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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