注:仅用于个人笔记,备忘。
在一个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!
博客讲述了在MFC项目中动态创建窗口时遇到的问题及解决方案。作者在注销窗口时,尝试了EndDialog、DestroyWindow和直接删除指针,但都遇到了问题。最终,通过在CMyDialog类中重载OnClose函数,调用DestroyWindow,并在外部发送WM_CLOSE消息来安全注销窗口,然后删除指针,成功解决了问题。
4898

被折叠的 条评论
为什么被折叠?



