问题是这样的,我有一个View,有两个无模式对话框a 和 b,刚刚开始的时候,
View和a,同时出现,然后操作a上面的一个按钮,使b 出现。 但是出现了
Debug assertion failed错误
具体出在wincore.cpp的第628行
ASSERT(pWnd->m_hWnd == NULL); // only do once我的代码是这样的, 在View里面有两个参数都传给两个对话框。
这两个参数是 View指针,和一个类。
所以对于对话框a来说 构造函数经过修改
CINFODlg::CINFODlg(CMFMView* pView, CMFMDiagnosis* m_MFMModel)
{
m_pView = pView;
m_Diagnosis = m_MFMModel;
}
通过如下函数创建
BOOL CINFODlg::Create()
{
return CDialog::Create(CINFODlg::IDD);
}对于对话框b同样也是这个办法
//构造函数
CPathshow::CPathshow(CMFMDiagnosis * m_Diagnosis)
{
m_normalFont.CreateFont(12, 0, 0, 0, 400, FALSE, FALSE, 0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "Arial");
m_MFMModel = m_Diagnosis;
}
//create函数
BOOL CPathshow::Create(CMFMView * mView)
{
pView = mView;
return CDialog::Create(CPathshow::IDD);
}在View中生成两个对话框都没有问题代码如下
a
m_pDlg = new CINFODlg(this, &m_pwrDiagnosis);//一个成员
if (m_pDlg->GetSafeHwnd() == 0)
{
m_pDlg->Create();
m_pDlg->ShowWindow(TRUE);
}
b
CPathshow* m_pathDlg = new CPathshow(&m_pwrDiagnosis);//局部变量
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(this);
m_pathDlg->ShowWindow(TRUE);
}但是如果先创建a,然后在a对话框里面创建b就出错,代码是这样子的
void CINFODlg::OnStop()
{
// TODO: Add your control notification handler code here
m_pView->StopDiagnosis();
GetDlgItem(ID_STOP)->EnableWindow(FALSE);
CPathshow* m_pathDlg = new CPathshow(m_Diagnosis);
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(m_pView); //在这个地方出错。错误提示见文前
m_pathDlg->ShowWindow(TRUE);
}
}我对p_hWnd不太熟,觉得有点莫名其妙。不但这样出错,我把这个代码写到View里面,然后
用a调用View里面的函数创建也会出错。请问如何搞定。 如果分不够我再加。多谢。
View和a,同时出现,然后操作a上面的一个按钮,使b 出现。 但是出现了
Debug assertion failed错误
具体出在wincore.cpp的第628行
ASSERT(pWnd->m_hWnd == NULL); // only do once我的代码是这样的, 在View里面有两个参数都传给两个对话框。
这两个参数是 View指针,和一个类。
所以对于对话框a来说 构造函数经过修改
CINFODlg::CINFODlg(CMFMView* pView, CMFMDiagnosis* m_MFMModel)
{
m_pView = pView;
m_Diagnosis = m_MFMModel;
}
通过如下函数创建
BOOL CINFODlg::Create()
{
return CDialog::Create(CINFODlg::IDD);
}对于对话框b同样也是这个办法
//构造函数
CPathshow::CPathshow(CMFMDiagnosis * m_Diagnosis)
{
m_normalFont.CreateFont(12, 0, 0, 0, 400, FALSE, FALSE, 0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, "Arial");
m_MFMModel = m_Diagnosis;
}
//create函数
BOOL CPathshow::Create(CMFMView * mView)
{
pView = mView;
return CDialog::Create(CPathshow::IDD);
}在View中生成两个对话框都没有问题代码如下
a
m_pDlg = new CINFODlg(this, &m_pwrDiagnosis);//一个成员
if (m_pDlg->GetSafeHwnd() == 0)
{
m_pDlg->Create();
m_pDlg->ShowWindow(TRUE);
}
b
CPathshow* m_pathDlg = new CPathshow(&m_pwrDiagnosis);//局部变量
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(this);
m_pathDlg->ShowWindow(TRUE);
}但是如果先创建a,然后在a对话框里面创建b就出错,代码是这样子的
void CINFODlg::OnStop()
{
// TODO: Add your control notification handler code here
m_pView->StopDiagnosis();
GetDlgItem(ID_STOP)->EnableWindow(FALSE);
CPathshow* m_pathDlg = new CPathshow(m_Diagnosis);
if (m_pathDlg->GetSafeHwnd() == 0)
{
m_pathDlg->Create(m_pView); //在这个地方出错。错误提示见文前
m_pathDlg->ShowWindow(TRUE);
}
}我对p_hWnd不太熟,觉得有点莫名其妙。不但这样出错,我把这个代码写到View里面,然后
用a调用View里面的函数创建也会出错。请问如何搞定。 如果分不够我再加。多谢。
你在CINFODlg::OnStop中每次都new了一个m_pathDlg,却没见在那里delete,建议将CPathshow* m_pathDlg设计成CINFODlg类的成员变量,初始化使new一次,第一次实用的时候Create一次,然后就只用Show或Hide来控制是否可见
//Check if new succeeded and we got a valid pointer to a dialog object
if(pDialog != NULL)
{
BOOL ret = pDialog->Create(IDD_MYDIALOG,this);
if(!ret) //Create failed.
AfxMessageBox("Error creating Dialog");
pDialog->ShowWindow(SW_SHOW);
}
else
AfxMessageBox("Error Creating Dialog Object");