上次问的一个树形视图控件控制CFrameView显示的问题大致解决了,用的就是CSDN高手提供的方法,但是现在又出现了新的问题:我选用的调用对话框是非模态对话框,在调用别的对话框的时候也把从前调用过的对话框删除了,但是怎么还是出错。可以有两个对话框切换,在切换三个对话框的时候就出现这样的错误提示:
解决方案 »
- 对话框是只读的????
- 关于C++对象与windows资源对象两者的区别,请高手帮忙解释下,谢谢:)
- 在线等500分求救:谁先解决全给他。监听套接字在运行较长时间后accept出现错误
- 求用DirectShow通过摄像头采集图像程序!
- 如何将中文从ASCII转化成UNICODE??????
- 郁闷啊,谁能给我这样一个算法?
- srand( (unsigned)time( NULL ) )
- 在MFC中OnSize可以自动调用OnPaint,机理是什么?
- 十万火急,有关ftp文件的问题!为什么Seek总是出错的呀?
- ****怎么让我的com组件支持mfc的afxmessagebox?########3
- CreateMutex WaitForSingleObject(hMutex,INFINITE);没有ReleaseMutex怎么也返回了?
- select返回1后,fd_isset返回0
m_pDlg = new CParaDlg;
m_pDlg->Create(IDD_PARA,pView);
m_pDlg->ShowWindow(SW_HIDE);
m_hDlg = new CHESimuDlg;
CHESimuDlg->Create("ID",pView);
CHESimuDlg->ShowWindow(SW_HIDE);
m_rDlg = new CRESimuDlg;
m_rDlg->Create("ID",pView);
m_rDlg->ShowWindow(SW_HIDE);
这些在初始化的时候就要申请好.
if(str == "工艺参数管理")
{
if(m_hDlg->IsWindowVisible()) // 判断是不是显示状态
{
m_hDlg->ShowWIndow(SW_HIDE);
}
if(m_rDlg->IsWindowVisible())
{
m_rDlg->ShowWIndow(SW_HIDE);
}
m_pDlg = new CParaDlg;
if(!m_pDlg->IsWindowVisible())
{
m_pDlg->ShowWIndow(SW_SHOW);
}
其他的同上...
}
}
m_pDlg = new CParaDlg; ---------->这句话不要...刚才发错了
if(!m_pDlg->IsWindowVisible())
{
m_pDlg->ShowWIndow(SW_SHOW);
}
其他的同上...
}
另外,你的问题估计出在执行delete m_pDlg之后,没有将m_pDlg赋值为空造成的,后续再判断m_pDlg是否为空会出现问题。所有 delete m_*Dlg后,加 m_*Dlg = NULL;语句。
if(str == "反应系统模拟")
{
if(m_hDlg!=NULL)
{
m_hDlg->DestroyWindow();
delete m_hDlg;
}
if(m_pDlg!=NULL)
{
m_pDlg->DestroyWindow();
delete m_pDlg;
}
m_rDlg = new CRESimuDlg;
m_rDlg->Create(IDD_RESIMU,pView);
m_rDlg->ShowWindow(SW_SHOW);
}之前你的m_rDlg应该已经new了对象了,这里又来一遍,什么道理?
BOOL CHESimuDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// 初始化COM,创建ADO连接等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection)); //捕获错误信息
try
{
// 打开本地Access库Demo.mdb
m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Ethoxylation.mdb","","",adModeUnknown);
}
catch(_com_error& e)
{
AfxMessageBox("数据库连接失败,确认数据库Ethoxylation.mdb是否在当前路径下!");
return FALSE;
}
if(m_pConnection->State)
m_pConnection->Close();
m_pConnection= NULL;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
2。重复点击的时候貌似就重复产生对话框,引起内存泄露
3。与其这样做还不如直接产生全部的对话框切换显示。可以这样做:声明一个指针表示正在显示的指针
CWnd *pShow,在树形控件的子项SetItemData将对话框指针设置进去,当点击的时候
CWnd *pDlg=(CWnd *)m_tree.GetItemData(htreeitem);
if(pShow != pDlg)
{
pShow->ShowWindow(SW_HIDE);
pShow=pDlg;
pShow->ShowWindow(SW_SHOW);
}
“Release确实解决了...继续调试中...
release的方法是这样的...
打开"编译"->"配置"->"把里面除了release其他的选项全部删除,再构件就OK了”
我试了下,果然解决了,哈哈,太神了