J'ai suivi cette question pour faire une boîte de dialogue/modeless non modale: How to display a non-modal CDialog?Comment détecter si un CDialog non modal a été fermé?
J'utilise MFC/C++ dans VS2008. Je suis plus couramment avec C# et .net qu'avec MFC et C++.
J'ai un élément de menu dans mon formulaire qui lance la boîte de dialogue. Il ne peut y avoir qu'une seule instance de la boîte de dialogue ouverte. La boîte de dialogue s'affiche correctement. Je peux le fermer en cliquant sur le X dans le coin et il se ferme lorsque je ferme le formulaire principal. Le problème que j'ai est le dialogue ne peut pas être ouvert à nouveau après que je clique sur le X pour fermer la boîte de dialogue. Je sais que c'est parce que le pointeur n'est jamais en arrière à NULL.
je ce dans le fichier d'en-tête de ma forme:
CChildDialog *m_pDialog;
Je cette partie dans le constructeur de ma forme:
m_pDialog = NULL;
En cliquant sur un élément de menu que j'ai ce code dans de l'élément de menu méthode (je l'ai modifié à partir de l'autre réponse SO parce que je veux seulement une instance de la boîte de dialogue ouverte):
if(m_pDialog == NULL)
{
// Invoking the Dialog
m_pDialog = new CChildDialog();
BOOL ret = m_pDialog->Create(IDD_CHILDDIALOG, this);
if (!ret) //Create failed.
{
AfxMessageBox(_T("Error creating Dialog"));
}
m_pDialog->ShowWindow(SW_SHOW);
}
Maintenant, je sais que je dois exécuter cette partie et régler le pointeur NULL, mais je ne sais pas où mettre ceci:
// Delete the dialog once done
delete m_pDialog;
m_pDialog = NULL;
Dois-je continuer à surveiller si le dialogue a été disposé? Y a-t-il un événement déclenché au formulaire parent lorsque le dialogue est fermé?
Ajoutez simplement un gestionnaire de message pour WM_DESTROY qui réinitialise le pointeur. –