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