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

  FORUM HardWare.fr
  Programmation
  C++

  Problème de fenêtres modale et non-modale sur VC++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de fenêtres modale et non-modale sur VC++

n°355641
Tetragramm​aton IHVH
dieu unique => pensée unique
Posté le 08-04-2003 à 13:00:01  profilanswer
 

Salut,
J'ai un gros bug bien salace dans mon programme quand je le quitte dans certaines conditions.
 
Je code une appli qui possède 2 fenêtres :
* la fenêtre principale qui est une CFormView
* une fenetre secondaire (une frame splittée en 2 contenant une CView et une CFormView)
 
Les 2 sont non-modales, jusqu'ici tout va bien.
 
Le problème survient quand j'ouvre une dialogbox modal (appelé avec DoModal()) liée à la 2ième fenêtre et que je quitte l'appli en fermant la 1ere fenêtre (qui provoque donc la fermeture de l'appli). En effet, le framework detruit les vues et le document mais après, le processus continue après le DoModal() dans un objet qui a été détruit (il survient donc une GPF :()
 
Je ne vois pas trop comment je peux résoudre ce problème :
* attacher la dialogbox à la 1ere fenêtre : c'est laid car la dialogbox apparait suite à un evennement qui survient dans la 2ième fenêtre
* faire des verif avant de tout fermer : impossible, le code reprend toujours après le DoModal()
* fermer à distance la fenêtre ? (avec des evennements ?)
 
Quel est le moment le plus tôt pour reagir ? Dans le CView:: OnDestroy, le CView:: OnClose ou autre ?


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
mood
Publicité
Posté le 08-04-2003 à 13:00:01  profilanswer
 

n°355749
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 14:24:23  profilanswer
 

Alros par defaut OnClose (WM_CLOSE) appelera un DestroyWindow (et donc lance un WM_DESTROY > OnDestroy) pour un CWnd
 
Sinon pour ton pb, perso je te conseil de faire la 3eme solution et un truc du genre

Code :
  1. CTaForm1View::OnClose() {
  2. CDialog* pDlg = recup le CWnd* de ta dialog
  3. if (pDlg != NULL) {
  4.  if (::IsWindow(pDlg->GetSafeHwnd())) {     
  5.   pDlg->EndDialog(IDCANCEL);
  6.   while (pDlg->IsKindOf(RUNTIME_CLASS(CDialog)) != NULL) {}
  7.  }
  8. }
  9. ......
  10. //le reste du traitement dont le par defaut
  11. }


Message édité par VisualC++ le 08-04-2003 à 14:25:57
n°356082
Tetragramm​aton IHVH
dieu unique => pensée unique
Posté le 08-04-2003 à 19:43:08  profilanswer
 

J'ai 2 problèmes :
 
1) Ma surcharge de CFormView:: OnClose() n'est pas appelée
 
2) Pour contourner ce problème, j'ai placé le code dans le CFrameWnd:: OnClose() mais à ce moment le while tourne sans fin et l'appli ne termine jamais.  
 
J'ai testé autre chose : J'envoie un SendMessageToDescendant(WM_CLOSE) sur la fenetre parente de la modale mais ça plante quand même : On dirait que la fin de DoModal() est forcement appelée APRES le DestroyWindow => J'ai l'impression qu'il va falloir que je recode toutes mes dialogues en modeless.


Message édité par Tetragrammaton IHVH le 08-04-2003 à 21:14:33

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°356404
VisualC++
J'va y penser ...
Posté le 09-04-2003 à 10:36:43  profilanswer
 

Ah ok, pour les OnClose effectivement c pas dit que tu passes correctement ds tous j'ai eu le mm pb sur une appli multi fenetre, par contre me semble que j'avais reussi a le faire passer en faisant des postmessage pour etre sur (desoel me souvvient plus).
 
Pour le bout de code au dessus, faudrait verifier, mais c t une idee a creuser desole que ca marche pas.
 
Vais essayer de faire une app avec mm structure que toi pour voir si y a pas une autre solution.

n°356607
Tetragramm​aton IHVH
dieu unique => pensée unique
Posté le 09-04-2003 à 14:00:22  profilanswer
 

VisualC++ a écrit :


Vais essayer de faire une app avec mm structure que toi pour voir si y a pas une autre solution.


 
Merci mais c'est bon, j'ai trouvé une solution :
J'ai surchargé CFrameWnd:: OnClose() : s'il n'y a pas la dialogbox ouverte, j'appelle normalement le OnClose() de la mère et si la dialogbox est ouverte, je la ferme et je fais juste un PostQuitMessage sans appeler le OnCLose(). L'appli a le temps de traiter de tous les messages en suspend pour traiter ensuite le WM_CLOSE.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran

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

  Problème de fenêtres modale et non-modale sur VC++

 

Sujets relatifs
Probleme fichier + MFCproblème de sondage dans phpbb
Problème dans mon code (surement simple)[C++] Problème de classes
problème CSS[HTML] Où est le problème? Il veut pas s'aligner come il faut! :(
Probleme MySQL et connexion distante[HTML compliant] skoi le problème avec mon <head> ?
[c++] problème avec ifstream et fonction getline[PERL] Problême de data sharing entre plusieurs threads...
Plus de sujets relatifs à : Problème de fenêtres modale et non-modale sur VC++


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