创建非模式窗体
我们从下列代码着手,讨论一下创建非模式窗体时应该注意的问题: // 创建非模式窗体代码,可以在主菜单的Click事件中 CDepartmentDlg* dpt = new CDepartmentDlg(this); // CDepartmentDlg窗体确认按钮的代码 习惯于C#或者VB等编码的程序员,对于上述代码来说,可能并没有感觉到有什么不对,那么请你在CDepartmentDlg类中增加Destory消息处理函数,如下: void CDepartmentDlg::OnDestroy() 然后在CDialog::OnDestroy();语句处增加断点,然后运行应用程序,通过菜单打开CDepartmentDlg窗体,然后关闭该窗体,你会发现系统并没有触发Destroy事件。然后你试着关闭应用程序,此时,系统会调用OnDestroy事件处理函数。就此,可以得出一个结论,当一个窗体关闭的时候,系统是不会主动销毁该对象的,需要等到应用程序关闭的时候。这样,就会产生内存泄露。 为了解决这个问题,有两种方式处理: 1、在关闭窗体的代码中调用DestroyWindow函数,然后在Destroy消息处理函数中加入销毁当前对象的代码。 2、在关闭窗体的代码中发出Destroy当前窗体的消息,由主窗体销毁该窗体对象。 下面我们针对这两种方法做一个介绍: 方法一: // CDepartmentDlg窗体确认按钮的代码 DestroyWindow(); void CDepartmentDlg::OnDestroy() delete this; // 销毁当前对象 方法二: // 在CDepartmentDlg.h中增加如下两个定义 #define WM_DELETE_DLG (WM_USER+1) private: // 将CDepartmentDlg的构造函数改为: CDepartmentDlg(CWnd* pParent = NULL); // 在将CDepartmentDlg的构造函数实现中增加下面的代码: m_pParent = pParent; // CDepartmentDlg窗体确认按钮的代码 DestroyWindow(); void CDepartmentDlg::OnDestroy() m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this,0); // 发出销毁当前对象的消息 } // 在MainFrame.h中增加如下WM_DELETE_DLG消息处理函数的定义: afx_msgLONG OnDeleteDialog(WPARAM wP,LPARAM lP); // 在MainFrame.cpp中增加如下建立消息处理映射代码: ON_MESSAGE(WM_DELETE_DLG,OnDeleteDialog); // MainFrame类的WM_DELETE_DLG消息处理函数 LONGCMainFrame::OnDeleteDialog(WPARAM wp,LPARAM lp) return 0;} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |