Comment savoir si une PropertySheet a ete cree ? [VC++/MFC] - C++ - Programmation
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.
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.
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!
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 ?
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 !)
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!
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.
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 :
|
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
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 !
Marsh Posté le 21-08-2002 à 12:03:56
Ok je vais essayer d'implementer ca. Je te remercie
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.
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...
Marsh Posté le 21-08-2002 à 16:32:13
scuse, j'avais pas vu ton post
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 :
|
Normalement ca devrait le faire ?!!
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 :
|
hein, t'y as pensé à ça !?
Marsh Posté le 21-08-2002 à 17:09:35
El_Gringo a écrit a écrit : hein, t'y as pensé à ça !? |
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!!
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!! |
fais voir ton code...
si tu fais un new CMyPropertySheet, ça passe FORCEMENT ds un constructeur !
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 !
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 ...
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 :
|
et voila pour le .cpp:
Code :
|
Ma dialogue principale est de type CAlteon2Dlg
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.
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 ?
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 ! ), tu sais !
J'viens de voir un truc.
Ton code:
Code :
|
tu fais un
Code :
|
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 :
|
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 (je crois que je vais me faire taper)
Marsh Posté le 21-08-2002 à 18:12:00
et m_MaPropertySheet.m_psh.hwndParent, il est NULL aussi !??
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 ! Je pense que je ne suis pas loin
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 ?
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 ? |
T'es serieux ? Parce que ca fait depuis le debut qu'on en parle et tu m'avais l'air de connaitre le sujet!!
Marsh Posté le 22-08-2002 à 10:51:02
Yeepa !! 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
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 !
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!
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 !
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 ! |
Ouaip. J'avais fait une recherche sur le forum a propos des PropertySheet, mais y avait pas grand chose.
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]