Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mfc 区分非模态与模态对话框_Mfc_Dialog_Modal Dialog - Fatal编程技术网

Mfc 区分非模态与模态对话框

Mfc 区分非模态与模态对话框,mfc,dialog,modal-dialog,Mfc,Dialog,Modal Dialog,我想对模式对话框使用相同的类CTestDialog CTestDialog dlg; dlg.DoModal(); 对于非模态对话框 m_pDlg = new CTestDialog; m_pDlg->Create(CTestDialog::IDD,this); m_pDlg->ShowWindow(SW_SHOW); 我遇到的问题是在PostNcDestroy(..)中,如果将其构造为模态对话框,则会崩溃: void CTestDialog::PostNcDestroy()

我想对模式对话框使用相同的类
CTestDialog

CTestDialog dlg;
dlg.DoModal();
对于非模态对话框

m_pDlg = new CTestDialog;
m_pDlg->Create(CTestDialog::IDD,this);
m_pDlg->ShowWindow(SW_SHOW);
我遇到的问题是在PostNcDestroy(..)中,如果将其构造为模态对话框,则会崩溃:

void CTestDialog::PostNcDestroy() 
{   
  CDialog::PostNcDestroy();
  delete this;                 // <= need for modeless, but Crash! if constructed as modal Dialog
}
void CTestDialog::PostNcDestroy()
{   
CDialog::PostNcDestroy();

删除此项;//检查对话框的m\u nModalResult。如果为-1,则该对话框为非模态;否则将是IDOK、IDCANCEL等代码之一

[编辑以回答评论]

这与原来的问题不同。 在确定/取消处理程序中,您可以测试:

if (m_nFlags & WF_MODALLOOP)

如果MFC对话框本身能够区分无模式对话框和模式对话框,我就放弃了寻找解决方案

这个变通方法对我很有效。 我已经扩展了构造函数来判断它是非模态的还是模态的

CTestDialog::CTestDialog(CWnd* pParent /*=NULL*/, BOOL bModeless /*=false*/)
: CDialogEx(CTestDialog::IDD, pParent)
, m_bModeless(bModeless)
{
}

void CTestDialog::PostNcDestroy()
{
    CDialogEx::PostNcDestroy();
    if (m_bModeless)
        delete this;
}

void CTestDialog::OnOK()
{
    if (UpdateData(TRUE))
    {
    if (m_bModeless)
        DestroyWindow();
    else
        CDialogEx::OnOK();
    }

void CTestDialog::OnCancel()
{
    if (m_bModeless)
        DestroyWindow();
    else
        CDialogEx::OnOK();
}

是,如果对话框构造为模态对话框(在堆栈上),我希望避免删除。通常,非模态对话框对象在堆的某个位置创建,并在PostNcDestroy()中销毁您是否尝试过检查样式?您需要保留并删除此项;否则您将拥有内存leak@rrirower我已经检查过了,它有相同的样式,我使用相同的类和对话框ressource。几乎,接近解决方案。是的,m_nModalResult在OnNcDestroy()中给出了正确的结果。但是我不能在OnOk()中使用此变量和OnCancel():(void CTestDialog::OnOK(){if(UpdateData(TRUE)){if(m_bModeless)destronWindow();destronWindow();else CDialogEx::OnOK()}}void CTestDialog::OnCancel(){if(m_bModeless)destronWindow();else CDialogEx::OnOK()}你能把OnOK和OnCancel方法的代码添加到你最初的帖子中吗?