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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Points : 43
    Points
    43
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Points : 43
    Points
    43
    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
    Points : 17 323
    Points
    17 323
    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 du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Points : 43
    Points
    43
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    exact c'est ça ...

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 65
    Points : 43
    Points
    43
    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, 17h57
  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, 17h39
  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, 12h43
  4. [MFC] instance unique de dialogue non modale
    Par venomelektro dans le forum MFC
    Réponses: 5
    Dernier message: 02/02/2005, 13h41
  5. [debutant] JDialog non modal
    Par andresan dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 12/05/2004, 14h40

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