Probleme avec une dialog box modale [Résolu]

Signaler
Messages postés
27
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
13 novembre 2006
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Bonjour à tous.









APrès une journée passé sur le problème je me résoud à vous en faire
part. J'ai une Dialog Box (DB) que je rempli de bouton et patati et
patata pas de problème avec vc++ ca va trés vite. Enfin un bon point
pour Visual que je suis en train de découvrir. Puis je créé une autre
DB (appelons la CTest)avec le super menu insérer dialog je lui
superpose une classe. Je fais la "substituion" de OnInitDialog et je
crée cette fenêtre à partir de ma fenêtre principale avec la ligne :


CTest fenetre; //Creation


fenetre.DoModal();


Là encore tout va bien. Et la arrive le problème je veux recuperer des valeurs qui sont dans la boite de dialogue. D'apres ce que je pense j'ai plusieurs possibilités. La premiere avoir des menbres publics et y faire reference dans la boite mere mais c'est pas tres bien au niveau du cloisenement du code. J'ai alors pensé a faire des getters pour recuperer les variables. Et en fait tout marche pour les variables style int i... Mais par contre je ne peut pas appeller dans un de ces getters la fonction this->GetWindowRect(). Je tombe invariablement sur une erreur me disant que le fichier afxwin2.inl possede une assertion qui ne passe pas a la ligne 105. Avoir de plus pres il y a une ASSERT qui test et qui dit que ma fenetre n'a pas de handle. Alors que cette meme fonction getwindowrect fonctionne parfaitement lors de l'initDialog..... Est ce que lorsque je clic sur ok le this est detruit et donc ca plante? Mais alors pourquoi peut on encore acceder au variable depuis la fenetre principale en faisant fenetre.variable; . Conclusion : comment faire pour recuperer ses coordonnees.

Voila, merci pour les eventuelle reponses.

6 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
Pourquoi ne passes tu pas une structure quelconque a ton contructeur
de dlg, pour ensuite la récupérer a la fin, genre


CTest fenetre;


fenetre.DoModal(&struct_quelconque);

Dans l'event OK du modal, tu rempli la struct, et tu la récupère a la sortie de doModal.

Sinon les dialog non modale font l'affaire grace à enableWindows(SW_HIDE et SW_SHOW)
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
Après avoir cliquer sur OK, la fenêtre se ferme et le handle disparait; par contre l'objet existe. Ceux sont les handles des contrôles qui n'existent plus, dans initdialog tous les handles des contrôles existent.
La solution proposée ci-dessus est bonne sauf que DoModal en VC++ ne prend pas de paramètres. Il faut ajouter le pointeur de ta structure à ta boite de dialogue.

louis14
Messages postés
27
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
13 novembre 2006

Effectivement je pense utiliser une structure que je vais passer a mon constructeur. Oui en fait c'est une bonne idee. Merci beaucoup.



Et merci a toi roi soleil tu m'as ECLAIRE sur le sujet. Vraiment merci a vous.
Messages postés
27
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
13 novembre 2006

Et juste un tout petit petit bemol. Quand louis14 tu dis que je dois rajouter le pointeur de ta structure a la boite de dialogue... Concretement ca veux dire quoi? C'est peut etre tres simple mais je ne veux pas passer a cote de quelque chose de clean en faisant ma grosse merde qui fait la meme chose.



Merci a vous deux.
Messages postés
27
Date d'inscription
jeudi 15 septembre 2005
Statut
Membre
Dernière intervention
13 novembre 2006

Pour moi ma grosse merde c'etait que dans ma boite de dialogue j'avais une veraible menbre de type structure et je la recuperais par un des getters. C'est de la merde ou ca va?
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
21
En gros, MFC crée une classe de dlg
CMaDlg : public CDialog
{
  // .ctor
   CMaDlg(STRUCT& s) { m_pUneStruct = &s };
  // membre
  STRUCT* m_pUneStruct;
}

// dans le OnOK, tu la remplis
m_pUneStruct->var = CeQueTuVeux;

// et a la Creation de ta dlg
STRUCT maStruct
CMaDlg dlg(maStruct);
dlg.doModal();

// ICI tu peux utiliser maStruct avec les valeurs remplies dans CMaDlg