您的位置:首页 > 其它

创建非模态对话框释放内存的问题

2009-05-09 20:27 295 查看
若给非模态对话框设置了父窗口,则应该在父窗口中销毁对话框窗口,释放对话框的C++指针。

m_pDlg:应用程序中对话框的指针,初始值为NULL;

CDlg是对话框类名称;

m_listWnd:应用程序中存储CDlg的指针

当应用程序打开非模态对话框时,因要保存其类指针,所以必须在对话框被销毁时,释放自己的资源。这里分两种情况:

1.对于只打开一次的非模态对话框。

需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。
还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。

这样,其父窗口就不需要代码来管理该非模态对话框内存的释放。

2.对于可重复打开的对话框:

可在m_listWnd中保存所有曾经打开过的对话框指针,应用程序中打开窗口的程序如下:

CDlg* pDlg=new CDlg();

pDlg->ShowWindow(SW_SHOW);

pDlg->UpdateWindow();

m_listWnd.push_back(pDlg);

在应用程序的OnDestroy()中:

遍历m_listWnd,然后

if(pDlg){

if(IsWindow(pDlg->m_hWnd)){

pDlg->DestroyWindow();

}

SAFE_DELETE(pDlg);

}

在CDlg中也应该重载OnCancel,并调用DestroyWindow。因为C++指针的释放是在其父窗口完成的,所以没必要重载PostNcDestroy。

在CDlg::OnDestroy()中,只需释放掉自己所创建的资源即可。

KillTimer()函数,在CWnd()类中,不能放在析构函数中。因为KillTimer()在删除定时器时,是需要m_hWnd句柄的,但是当程序运行到析构函数,窗口已经被销毁,m_hWnd已经变为NULL,所以会出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: