区分无模式与模式对话框
Distinguish modeless vs modal dialog
我想对模态对话框使用相同的 class 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
}
如何直接确定 class 是构建为无模式对话框还是模式对话框?
检查对话框的 m_nModalResult。如果是 -1 - 对话框是无模式的;否则它将是 IDOK、IDCANCEL 等代码之一。
[编辑以回答评论]
这与原题不同。
在 OK/Cancel 处理程序中,您可以测试:
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();
}
我想对模态对话框使用相同的 class 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
}
如何直接确定 class 是构建为无模式对话框还是模式对话框?
检查对话框的 m_nModalResult。如果是 -1 - 对话框是无模式的;否则它将是 IDOK、IDCANCEL 等代码之一。
[编辑以回答评论]
这与原题不同。 在 OK/Cancel 处理程序中,您可以测试:
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();
}