IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] prblème CloseAllDocuments( )


Sujet :

MFC

  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut [MFC] prblème CloseAllDocuments( )
    Bonjour,

    Mon appli ferme tous ses documents à la fin d'un timer.

    Si des boites de dialogues étaient ouvertes, je les ferme à la volée en récupérant la boite active et en la détruisant jusqu'à ce que la CWnd active ne soit plus une boite de dialogue ou une messageBox.

    Mais, lorsque je fais CWinApp::CloseAllDocuments(), j'ai un plantage.
    Est-ce qu'il y a une tâche préparatoire à accomplir avant de fermer tous les documents ( une active de fenêtre quelconque ou autre ... ).

    Merci d'avance.

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Bonjour,

    CWinApp maintient une liste des documents ouverts
    l'appel de CWinApp::CloseAllDocuments() ferme tous les documents ouverts
    Il est possible qu'en fermant manuellement tes fenêtres les objets documents de CWinApp ne soient plus valides.

    Je pense que tu devrais simplement appeler CWinApp::CloseAllDocuments() pour fermer tous tes documents.
    appeler enfin Close sur ton CMainFrame.
    A+

  3. #3
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Bonjour

    Voici le code de la focntion timer et de la fonction qui se charge de tout fermer. Si ça peut inspirer quelqu'un.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    void CMainFrame::OnTimer(UINT nIDEvent) 
    {
    	// TODO: Add your message handler code here and/or call default
    	if(nIDEvent==1)
    	{
    		ToutFermer();
    	}
    	CMDIFrameWnd::OnTimer(nIDEvent);
    }
     
    void CMainFrame::ToutFermer()
    {
    	CWnd *pWnd;
    	pWnd=GetActiveWindow();
     
    	if(pWnd->IsKindOf(RUNTIME_CLASS(CMainFrame)))
    	{
    		((CEssaiApp*)AfxGetApp())->CloseAllDocuments(FALSE);
    	}
    	else
    	{
                             // le while ferme bien tout ce qui est boite de dialogue
                             // et MessageBox......
    		while(!(pWnd->IsKindOf(RUNTIME_CLASS(CMainFrame))))
    		{
    			pWnd->EnableWindow(FALSE);
    			pWnd->SendMessage(WM_CLOSE);
    			pWnd=pWnd->GetOwner();
    		}
                             // .... mais ça plante à la ligne ci dessous
    		((CEssaiApp*)AfxGetApp())->CloseAllDocuments(FALSE);
    	}
    }

  4. #4
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    info supplémentaire:

    Si je ferme les boites de dialogues ou les MessageBox en faisant "Echapp" à la main, le CWinApp::CloseAllDocuments( ) ne pose aucun problème.

    J'ai l'impression que lorsque je force la fermeture des boites de dialogues et MessageBox avec SendMessage(WM_CLOSE), cette action "oublie" de faire quelque chose qui autorise le CloseAllDocuments( )

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    essaye la chose suivante:
    ne fermer que les boites de dialogue en testant la signature CDialog de la fenêtre .
    Ensuite fait un EndDialog en castant le pointeur si le test de signature (IsKindOf) est réussi .
    note dans le cas de boite de dialogue imbriquée dans l'appel il faut fermet en premier celle qui est active ...

  6. #6
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Ouais mais je veux aussi fermer des messageBox et je ne suis pas sûr de pouvoir faire un EndDialog dessus car si j'en récupère le runtimeClass, j'obtiens dans comme nom de classe CTempWnd et pas CDialog.

    De plus je viens de tester la chose suivante:

    Avant de faire CloseAllDocuments juste après la boucle while ( voir ci-dessus ), si je fais un GetActiveDocument ( sans caster le type de document ), il me retourne un NULL..... est-ce que c'est normal ?

    Je pense que quand je les ferme à la main, de manière transparente, il récupère le Document actif, mais si je les "Kille", je dois zapper un truc qui fait qu'il ne le retrouve pas , le document actif... ( Je sais pas si je me fais bien comprendre ! )

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    si la signature n'est pas une CDialog tu fais un WM_CLOSE sinon un EndDialog...

  8. #8
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    C'est ce que je fais, ça ferme bien tout comme je veux mais j'ai l'impression
    que le problème vienne du CWinApp::CloseAllDocuments( ).
    Il doit s'appuyer sur un pointeur particulier qu'il ne retrouve pas mais quoi ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Appel HideApplication avant:
    Citation Envoyé par MSDN
    This method closes all open documents before exiting. Call HideApplication before calling CloseAllDocuments.

  10. #10
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Sans entrer dans les détails de code, j'ai décomposé le CloseAllDocuments
    en {"doctemplate" , " GetFirsdocPosition" etc } pour arriver au document ouvert et invoquer manuellement CDocument::oncloseDocuments et me rendre compte que ça coince ici.

    Là , je sature !

  11. #11
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    De plus,

    Sortie de la boucle While, si on remplace le CloseAllDocuments( )

    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        this->GetActiveDocument( )->OnCloseDocument ()
    Ca plante, donc c'est bien de là que là que ça vient...., du document en cours.

  12. #12
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    Je me suis déplacé dans la classe CWinApp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void CEssaiApp::Fermer()
    {
    	//CloseAllDocuments(FALSE);
     
    	CWnd *pWnd=m_pMainWnd->GetActiveWindow();
    	if(!pWnd->IsKindOf(RUNTIME_CLASS(CMainFrame)))
    	{
    		pWnd->SendMessage(WM_CLOSE);
    	}
    }
    Si je mets CloseDocuments() en commentaire, ça passe.
    Si je mets le reste en commentaire et que je garde CloseAllDocuments( ), ça passe aussi.
    Mais si je fais exécuter les 2, ça plante !

  13. #13
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    256
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 256
    Par défaut
    J'oubliais,

    Les boites de dialogues sont modales et sont générées à partir d'un clic droit dans la vue en cours.

    ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    afx_msg void OnRButton( etc....)
    {
        CBoite boite;
        boite.DoModal();
        ....etc
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo