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 :

fermer une fenêtre créée dynamiquement


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Par défaut fermer une fenêtre créée dynamiquement
    Bonjour,

    je créé une fenêtre dynamiquement en cliquant sur un bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CImagePopup *pDlg = new CImagePopup(this);
    pDlg->Create(CImagePopup ::IDD,this);
    pDlg->ShowWindow(SW_SHOW);
    Pour éviter d'en créer une deuxième en appuyant à nouveau sur le bouton, je passe un booléen à true. Tant que cette variable est à true je ne peux pas créer d'autre fenêtre.

    Maintenant je voudrais passer à false cette variable, quand je ferme la fenêtre dynamique.

    J'ai essayé de passe l'adresse de ma variable quand je construis la fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CImagePopup *pDlg = new CImagePopup(&m_bImageDlg, this);
    Et dans mon fichier CImagePopup.cpp

    j'ai changé le destructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CImagePopup::~CImagePopup()
    {
     *pbImageDlg = false;
    }
    Mais il semblerait que lorsque je ferme la nouvelle fenêtre, je ne passe pas par le destructeur CImagePopup::~CImagePopup().

    Pourriez vous m'éclairer s'il vous plait?

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    une fermeture de fenetre induit, par défaut, un DestroyWindow()
    Le DestroyWindow() détruit la fenetre dans le gestionnaire Windows, donc le HWND. Mais pas l'objet C++ qui est dérivé de CWnd. L'objet est bien libéré de son HWND mais pas détruit.

    pour remédier à ça, ce qui se fait classiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CMaFenetre::OnPostNcDestroy()
    {
      delete this;
    }
    OnPostNcDestroy() est une fonction virtuelle qu'il faut surcharger.

    En clair, ça veut dire qu'après un message WM_NCDESTROY (envoyé par la fonction DestroyWindow()), on libère l'objet C++.

    si tu ne fais pas ça, tu auras des fuites mémoires ...

    @+

  3. #3
    Membre chevronné
    Avatar de PetitPapaNoël
    Développeur informatique
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Par défaut
    Bonjour,

    Stephdim a raison. Et pour compléter ce qu'il t'a dit, je te renvoie vers la FAQ...

  4. #4
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Par défaut
    Bonjour,

    oui j'ai bien lu la FAQ et j'avais ajouté bien ajouté le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CImagePopup :: PostNcDestroy( )
    {
    	CDialog::PostNcDestroy();
    	delete this;
    }
    sauf que si j'ajoute un MessageBox dans cette partie, rien ne s'affiche quand je ferme la nouvelle fenêtre.
    Donc je me demande par où passe la fermeture de la fenêtre..

    Merci.

  5. #5
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    sauf que si j'ajoute un MessageBox dans cette partie, rien ne s'affiche quand je ferme la nouvelle fenêtre.
    Donc je me demande par où passe la fermeture de la fenêtre..
    Le MessageBox ne fonctionne pas dans un évènement WM_NCDESTROY ... comme indiqué ici : http://blogs.msdn.com/oldnewthing/ar...0/8520129.aspx

    @+

  6. #6
    Membre averti
    Inscrit en
    Mai 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 30
    Par défaut
    Merci pour l'info.


    Si je mets dans le constructeur de ma nouvelle fenêtre, le variable de ma première fenêtre passe bien à false.
    Mais si je mets ce bout de code dans PostNcDestroy(), il ne se passe rien.

    Je ne comprends pas.. :'(

Discussions similaires

  1. [Débutant] impossible de fermer une fiche créée dynamiquement à l'aide d'un bouton
    Par sergeprd dans le forum C++Builder
    Réponses: 11
    Dernier message: 26/07/2011, 09h57
  2. Réponses: 1
    Dernier message: 12/05/2010, 16h07
  3. Comment fermer une fenêtre dynamique avec onclose
    Par nopnop dans le forum Delphi
    Réponses: 23
    Dernier message: 18/07/2006, 18h08
  4. Comment fermer une fenêtre quand la souris et clavier sont inactifs ?
    Par Goldenkiller dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/12/2004, 22h09
  5. Fermer une fenêtre au bout d'un certain temps.
    Par cprogil dans le forum Composants VCL
    Réponses: 5
    Dernier message: 27/11/2003, 18h25

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