Creating Modeless Dialogs continually causing application to grow
I have a dialog applicatin that needs to create modeless dialogs over and
over again. The main application waits for the modeless dialog to finish,
then repeats the procedure. I've written a simple test application that
seems to exhibit the same symptoms.
Main Dialog with some code removed to simplify: ( NOTE:
CModelessDemoDlg::OnBnClickedButton1() is used to begin the test of creating
modeless dialogs)
CModelessDemoDlg::CModelessDemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CModelessDemoDlg::IDD, pParent)
, m_pmodeless(NULL)
, m_text(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CModelessDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_text);
}
BEGIN_MESSAGE_MAP(CModelessDemoDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_MESSAGE(MODELESS_TEST, OnModelessTest)
END_MESSAGE_MAP()
// CModelessDemoDlg message handlers
BOOL CModelessDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_pmodeless = NULL;
return TRUE; // return TRUE unless you set the focus to a control
}
void CModelessDemoDlg::OnBnClickedButton1()
{
if(m_pmodeless)
m_pmodeless->SetForegroundWindow();
else
{
// Test to slam the app with lots of modeless dialogs that simply come / go
PostMessage(MODELESS_TEST, 0, 0);
}
}
LRESULT CModelessDemoDlg::OnModelessTest(WPARAM w, LPARAM l)
{
m_pmodeless = new CModeless(this);
m_pmodeless->Create(CModeless::IDD,GetDesktopWindow());
//m_pmodeless->ShowWindow(SW_SHOW);
return 0;
}
Modeless Dialog: ( Note: OnInitDialog posts a message that will cause the
dialog to be destroyed... prior to this another message is posted back to the
main dialog to cause another modeless dialog to eventually be created)
IMPLEMENT_DYNAMIC(CModeless, CDialog)
CModeless::CModeless(CWnd* pParent /*=NULL*/)
: CDialog(CModeless::IDD, pParent)
, m_text(_T(""))
{
m_pParent = pParent;
}
CModeless::~CModeless()
{
}
void CModeless::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_text);
}
BEGIN_MESSAGE_MAP(CModeless, CDialog)
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_MESSAGE(END_RUNNER, OnEndRunner)
END_MESSAGE_MAP()
BOOL CModeless::OnInitDialog()
{
CDialog::OnInitDialog();
PostMessage(END_RUNNER, 0, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
// CModeless message handlers
void CModeless::PostNcDestroy()
{
CDialog::PostNcDestroy();
if(m_pParent)
{
((CModelessDemoDlg*)m_pParent)->m_pmodeless = NULL;
((CModelessDemoDlg*)m_pParent)->PostMessage(MODELESS_TEST, 0, 0);
}
delete this;
}
LRESULT CModeless::OnEndRunner(WPARAM w, LPARAM l)
{
DestroyWindow();
return 0;
}
Any help / ideas as to how to solve this would be greatly appreciated.
Thanks in advance!