要做一个仓库管理软件,我用了SDI,不带文档视图支持。主窗口菜单触发非模态对话框的创建和显示,我要求显示的对话框不能超出客户区里的视图范围。程序代码如下:
//这是非模态对话框CCgrkDlg的代码
void CCgrkDlg::OnCancel()
{
CDialog::DestroyWindow();
}void CCgrkDlg::OnOk()
{
CDialog::DestroyWindow();
}void CCgrkDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}//这是SDI主窗口响应菜单的代码
void CMainFrame::OnCgrk()
{
CCgrkDlg * pDlg = new CCgrkDlg();
pDlg->Create(IDD_CGRK);
//此处设置m_wndView为父窗口是为了让非模对话框保持在客户区的视图内
pDlg->SetParent((CWnd*)&m_wndView);
pDlg->ShowWindow(SW_SHOW);
}
好了,代码就是这么简单,程序编译运行都没出错,也没显示内存泄露,现在的问题是:程序运行后,显示非模对话框,再关闭非模对话框,再关闭主窗口,程序正常退出,没有问题。在debug模式下,如果程序运行后,显示非模对话框,不关闭非模对话框,直接关闭主窗口,此时能听到电脑喇叭发出咚的一声。 在release下没有这个声音,也运行正常.我想是不是没有释放new出来的对话框对象呢,设置断点,发现关闭主窗口时代码分别进入了
void CCgrkDlg::PostNcDestroy() 这个函数,继续执行,提示了Debug Assertion Failed!的错误对话框。难道我的做法有问题,baidu了关于这方面的问题,发现居然没人遇见,难道是我的做法有问题?急求高手解答,拜谢!!!
//这是非模态对话框CCgrkDlg的代码
void CCgrkDlg::OnCancel()
{
CDialog::DestroyWindow();
}void CCgrkDlg::OnOk()
{
CDialog::DestroyWindow();
}void CCgrkDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}//这是SDI主窗口响应菜单的代码
void CMainFrame::OnCgrk()
{
CCgrkDlg * pDlg = new CCgrkDlg();
pDlg->Create(IDD_CGRK);
//此处设置m_wndView为父窗口是为了让非模对话框保持在客户区的视图内
pDlg->SetParent((CWnd*)&m_wndView);
pDlg->ShowWindow(SW_SHOW);
}
好了,代码就是这么简单,程序编译运行都没出错,也没显示内存泄露,现在的问题是:程序运行后,显示非模对话框,再关闭非模对话框,再关闭主窗口,程序正常退出,没有问题。在debug模式下,如果程序运行后,显示非模对话框,不关闭非模对话框,直接关闭主窗口,此时能听到电脑喇叭发出咚的一声。 在release下没有这个声音,也运行正常.我想是不是没有释放new出来的对话框对象呢,设置断点,发现关闭主窗口时代码分别进入了
void CCgrkDlg::PostNcDestroy() 这个函数,继续执行,提示了Debug Assertion Failed!的错误对话框。难道我的做法有问题,baidu了关于这方面的问题,发现居然没人遇见,难道是我的做法有问题?急求高手解答,拜谢!!!
如果是带文档视图支持的,这里就要设置GetActiveView()为父窗口
我这没带文档视图支持,这个view也是框架自动生成的对象,是CMainFrame的成员
实在不行,我只能用笨拙的解决方法了:
在主窗口里保存所有new出来的对话框链表,对话框关闭时给父窗口发消息,通知它delete对象
应用关闭时,遍历这个链表,一个一个关闭和delete
难道我系统有问题?vc有问题?刚我又建了个工程,单独测试模态对话框,debug测试下来有内存泄露!