注:仅用于个人笔记,备忘。
在一个MFC项目开发中,采用new的方式动态创建了窗口,结果在动态注销窗口的过程中,填了几个坑:
动态创建窗口:
CMyDilog *pDlg = new CMyDialog;//CMyDialog是我自定义的窗口类
注销窗口:
坑1: pDlg->EndDialog(0); //实际上,窗口没有真的被注销
坑2:pDlg->DestroyWindow(); //导致CMyDialog析构出错
坑3: delete pDlg;//触发异常
最终解决方案(通过消息机制让窗口杀掉自己):
1.在目标窗口的CMyDialog中,重载OnClose,在其中调用 DestroyWindow();
void CMyDialog::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
DestroyWindow();
}
2.在要注销窗口的地方:
if(IsWindow(pDlg->GetSafeHwnd()))
{
pDlg->SendMessage(WM_CLOSE);//发送关闭消息给目标窗口,并等待其完成
delete pDlg;
}
OK!