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][debutant] destruction dialogbox non modale: plantage


Sujet :

MFC

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut [MFC][debutant] destruction dialogbox non modale: plantage
    Bonjour � tous

    ce que je voudrais faire
    j'ai une checkbox (m_ABSCHECK) sur la fenetre principale.
    Quand on coche, la dialogbox non modale apparait
    Quand on d�coche, la dialogbox non modale est detruite

    information
    boite dialogue : IDD_AFFICHERABS dans class CAfficherAbsence

    r�sultat
    lors de la destruction, le prog me d�truit la fenetre principale alors que la dialogbox non modale est toujours � l'�cran !!!
    exactement le contraire de ce que je veux !!!!!!!!!!!!!!!
    il en r�sulte evidemment d'un plantage complet.

    Merci � ceux qui fournissent des

    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
     
    void CAngelView::OnBnClickedAbscheck()
    {
    if (m_ABSCHECK.GetCheck()==0)
    		{
    		CAfficherAbsence* pDialog = static_cast<CAfficherAbsence *>(GetDlgItem(IDD_AFFICHERABS));
    		pDialog->DestroyWindow();
    		}
    else
    		{
    		CAfficherAbsence* pDialog;
    		pDialog = new CAfficherAbsence();
    		pDialog->Create(IDD_AFFICHERABS,this);
    		pDialog->ShowWindow(SW_SHOW);
    		}
    }

  2. #2
    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
    salut,
    je te sugg�re plut�t plut�t �a:
    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
     
    void CAngelView::OnBnClickedAbscheck()
    {
    if (m_ABSCHECK.GetCheck()==0)
          {
         m_pDialog->DestroyWindow();
          }
    else
          {
    //      CAfficherAbsence* m_pDialog; declarée dans CAngelView.
           m_pDialog = new CAfficherAbsence();
           m_pDialog->Create(IDD_AFFICHERABS,this);
           m_pDialog->ShowWindow(SW_SHOW);
          }
    }
    dans le constructeur mettre m_pDialog=NULL;
    intercepter le message WM_DESTROY sur la view et faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void  CAngelView::OnDestroy() 
    {	
            if(m_pDialog) m_pDialog->DestroyWindow();
    	CFormView::OnDestroy();
    	// TODO: Add your message handler code here	
    }

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Merci Farscape �a marche nickel evidemment .... mais cot� compr�hension c'est
    je vais faire le gros

    tu dis
    dans le constructeur (de CAngelView je suppose) mettre m_pDialog=NULL;
    je comprends pourquoi il faut le mettre ds le constructeur de CAngelView puisque m_pDialog est d�clar� ds AngelView.h
    Je comprends son utilit�, on cree la boite, on met le pointeur � NULL et on peut detruire la boite que si il est NULL.
    Mais je comprend pas que la ligne soit execut�e
    Finalement on passe par quel contructeur lors de la cr�ation de la boite ?
    celui de CAfficherAbsence, celui de CAngelView ou les deux ??


    ------------------------------------------------------------------------------------------------------------
    intercepter le message WM_DESTROY sur la view et faire:
    :
    if(m_pDialog) m_pDialog->DestroyWindow();
    :
    Alors l�, c'est pas compliqu�, je comprends rien !!!!!!!!!!!!!
    au bout du compte, tu �cris la meme ligne que moi : pointeurdelafenetre->DestroyWindow(); sauf qu'avec toi �a marche !!!!!!
    Interet d'intercepter le message ?
    Qui envoie un message � qui ?
    pourquoi intercepter le message sur CAngelView alors qu'on d�truit pas une fenetre de cette classe ?
    Pourquoi dans ton code, tu detruis deux fois la fenetre ( 2 fois le code : m_pDialog->DestroyWindow() )

    Quel est finalement le cheminement des actions ?????
    ------------------------------------------------------------------------------------------------------------
    CFormView::OnDestroy();
    class wizard me met CRecordView::OnDestroy();

    Avec CForm �a marche, avec CRecord �a marche, et en supprimant la ligne ............... et bien �a marche encore !!!!!!!!!!!!!!!!!

    utilit� de cette ligne ????



    de ta patience.

  4. #4
    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
    Le principe r� expliqu� :
    Tu cr�es une bo�te de dialogue non modale � partir d�une fenetre CFormView (CAngelView).

    Tu as besoin d�un pointeur sur cette fen�tre pour :

    La d�truire � la demande.
    La d�truire quand tu fermes ta fen�tre principale (CAngelView).

    La destruction se fait uniquement si le pointeur de la dialogue est different de NULL d�o� l�int�r�t de l�initialiser � NULL dans le constructeur de la fen�tre principale.

    Pour fermer la dialogue lors de la fermeture de la fen�tre principale, il faut intercepter sur cette fen�tre le message signalant quelle va se fermer : WM_DESTROY.
    Donc sur ce message je ferme la dialogue si elle est ouverte�

    Note :
    GetDlgItem s�applique aux contr�les d'une fen�tre pas � une dialogue .
    Tu ne peux retrouver le pointeur de la dialogue � partir de son identifiant.
    GetDlgItem doit renvoyer NULL.
    (En admettant que �a marche, si il y a plusieurs fen�tres non modales cr�es comment on fait ?)
    D�o� l�int�r�t de stocker l�adresse de l�objet cr�� dans un pointeur�


  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    Je crois que j'ai compris :

    Mon erreur vient du mauvais pointeur recup�r� par getdlgitem ce qui n'est pas possible (j'apprends tous les jours des choses avec tes notes)

    Le 1er destroywindow (celui ds void CAngelView::OnBnClickedAbscheck())
    efface ma dialogue. il n'y a pas de message envoy� dans ce cas.
    la fonction CAngelView::OnDestroy() ne sert pas.

    Le 2eme destroywindow (celui de void CAngelView::OnDestroy() ) prend en compte l'eventualit� que la fenetre principale soit ferm�e avant la dialogue. Dans ce cas, le message WM_DESTROY est envoy�, la fonction ondestroy est appel� pour forcer l'effacement de la dialogue avant la destruction de la fenetre principale.

    YES or NO ??????

    Encore merci pour tout .

  6. #6
    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
    exact c'est �a ...

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Par d�faut
    ...... 1000 fois

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. DialogBox non-Modal MFC DLL ne repond pas
    Par kaiser92 dans le forum MFC
    R�ponses: 11
    Dernier message: 17/09/2009, 16h57
  2. [Toutes versions] Userform non modal = plantage d'excel
    Par youn1096 dans le forum Macros et VBA Excel
    R�ponses: 10
    Dernier message: 14/05/2009, 16h39
  3. [MFC] Cr�er une CDialog non modale dans un thread
    Par fleur_de_rose dans le forum MFC
    R�ponses: 3
    Dernier message: 29/09/2006, 11h43
  4. [MFC] instance unique de dialogue non modale
    Par venomelektro dans le forum MFC
    R�ponses: 5
    Dernier message: 02/02/2005, 12h41
  5. [debutant] JDialog non modal
    Par andresan dans le forum Agents de placement/Fen�tres
    R�ponses: 10
    Dernier message: 12/05/2004, 13h40

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