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

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

Marsh Posté le 08-04-2003 à 13:00:01    

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
Reply

Marsh Posté le 08-04-2003 à 13:00:01   

Reply

Marsh Posté le 08-04-2003 à 14:24:23    

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
Reply

Marsh Posté le 08-04-2003 à 19:43:08    

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
Reply

Marsh Posté le 09-04-2003 à 10:36:43    

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.

Reply

Marsh Posté le 09-04-2003 à 14:00:22    

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
Reply

Sujets relatifs:

Leave a Replay

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