2015-06-25 36 views
1

我有一个无模式对话框,当我关闭主应用程序时,有时会在屏幕上留下对话框。如果我手动关闭它,所有析构函数都会正确调用。但是到目前为止,如果我试图通过C++代码来实现,我在Debug版本中遇到了问题,这些问题不能让我对Release版本中发生的事情充满信心。如何在C++中关闭无模式MFC对话框

什么是关闭模型对话框的正确方法? PostQuitMessage()的文档指出它关闭了整个线程(是在单独的线程中运行的非模态对话框,或者是单个MFC应用程序UI线程的一部分?)。拨打DestroyWindow()在实践中给我提出了问题。发送WM_CLOSE并不觉得是正确的。而CWnd::EndDialog()仅适用于模态对话框。在这些......或其他地方是否有正确的答案?

回答

0

请参阅CDialog的MSDN页面。该页面的最后一段提供了关闭无模式对话框的详细说明。

+0

啊等 - 接受你的答案太快了,因为我以为我找到了一个金矿......但它没有说你如何调用OnCancel()函数 - 直接调用它,发送WM_CANCEL到窗口,或者是WM_CLOSE ...? – omatai

+0

OnCancel响应用户操作。你可以直接调用它,但在简单的情况下,它只需调用DestroyWindow,所以你可以直接调用它。 –

0

我通常有一个指向我调用它的窗口的指针,并在它自己的析构函数中删除它。

void MainWindowDlg::OnUserAction(void) 
{ 
    ModelessDialog *dlg = new ModelessDialog(parentCwnd); //Or 'this' 
    //Or use a member variable and set to nullptr afterwards... 
    //Create/Open it... 
    //Do not use the pointer again, as it can delete itself any time ! 
} 

void ModelessDialog::~ModelessDialog(void) 
{ 
    //Other cleanup if needed 
    delete this; 
} 

您仍然可以通过GetParent()->SendMessage与父母互动。