CDHtmlDialog - 让它成为模态?

时间:2018-03-27 15:49:11

标签: c++ windows mfc modal-dialog

当用户在另一个对话框中单击时,我弹出一个CDHtmlDialog框。这是伪代码

CMyClass{
    CDHtmlDialog * m_htmlDialog;
}

CMyClass::OnInitDialog(){
     m_htmlDialog = new CDHtmlDialog(IDD_DIALOG_EMAIL, IDR_HTML_SUBMIT_EMAIL);
}

CMyClass::OnBnClickSendEmail{

     m_htmlDialog->Create(IDD_DIALOG_EMAIL);
     //m_htmlDialog->DoModal();
     m_htmlDialog->ShowWindow(SW_SHOWNORMAL);
}

在评论DoModal时,代码运行正常。但问题是Html对话框不是模态的,我可以点击背景表格和对话框。我希望Html对话框是模态的,当我取消注释DoModal()行时代码崩溃。

1 个答案:

答案 0 :(得分:2)

这是我以null指针开始时显示模态对话框的方式:

auto *pDlgEditor = new CSomeDlg(this);
if (pDlgEditor != nullptr)
{
    pDlgEditor->DoModal();

    delete pDlgEditor;
}

请注意,我正在传递this,这是该窗口的所有者。

实际的类本身指定了对话资源:

CSomeDlg::CChristianLifeMinistryEditorDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(IDD_DIALOG_EXAMPLE, pParent))

我意识到我的代码没有显示CDHtmlDialog ...根据documentation,有3个构造函数:

CDHtmlDialog();


CDHtmlDialog(
    LPCTSTR lpszTemplateName,  
    LPCTSTR szHtmlResID,  
    CWnd *pParentWnd = NULL);


CDHtmlDialog(
    UINT nIDTemplate,  
    UINT nHtmlResID = 0,  
    CWnd *pParentWnd = NULL);

第三个参数是默认为NULL的父级。尝试传递this作为第三个参数。

现在,如果您在内部一个弹出 modaless 窗口,当您执行上述操作时,父级将成为模态窗口。但是,如果您通过模态窗口父级,那么 将成为所有者。我们没有完整的信息,因此以上只是一般性建议。

请注意,文档说明如果您将pParentWnd保留为默认值(NULL):

  

如果是NULL,则对话框对象的父窗口将设置为主应用程序窗口。

因此,它可能不一定使用您期望的父级,这就是为什么自己指定它的好处。