MFC教程(6)-- 应用程序的退出
2010-03-25 20:33:42 来源:WEB开发网PostNcDestoy
CWnd、CFrameWnd、CView、CControlBar等都覆盖了该函数。文档边框窗口和边框窗口都使用CFrameWnd::PostNcDestroy。
CWnd::PostNcDestroy()
MFC缺省实现空
void CFrameWnd::PostNcDestroy()
调用delete this销毁自身这个MFC对象。
void CView::PostNcDestroy()
调用delete this销毁自身这个MFC对象。
析构函数
delete this导致析构函数的调用。需要提到的是CFrameWnd和CView的析构函数。
CFrameWnd::~CFrameWnd()
边框窗口在创建时,把自身加入到模块-线程状态的边框窗口列表m_frameList中。现在,从列表中移走该窗口对象。
必要的话,删除m_phWndDisable数组。
CView::~CView()
在视创建时,把自身加入到文档对象的视列表中。现在,从列表中移走该视对象。
应用程序调用CloseAllDocument关闭文档时。参数为FALSE,它实际上并没有把视从列表中清除,而最后的清除是由析构函数来完成的。
至此,边框窗口关闭的过程讨论完毕。下面,结合具体情况──SDI窗口的关闭、MDI主窗口的关闭、MDI子窗口的关闭──描述对WM_CLOSE消息的处理。
SDI窗口、MDI主、子窗口的关闭
参考图6-1分析SDI窗口、MDI主、子窗口的关闭流程。
SDI窗口的关闭
在这种情况下,主窗口将被关闭。首先,关闭应用程序的文档对象。文档对象的虚拟函数OnCloseDocument调用时销毁了主窗口(Windows窗口和MFC窗口对象),同时也导致视、工具条窗口的销毁。主窗口销毁后,应用程序的主窗口对象为空,故发送WM_QUIT消息结束程序。
MDI主窗口的关闭
首先,关闭应用程序的所有文档对象。文档对象的OnCloseDocument函数关闭文档时,将销毁文档对象对应的文档边框窗口和它的视窗口。这样,所有的MDI子窗口(包括其子窗口视)被销毁,但应用程序的主窗口还在。接着,调用DestroyWindow成员函数销毁主窗口自身,DestroyWindow发现被销毁的是应用程序的主窗口,于是发送WM_QUIT消息结束程序。
MDI子窗口(文档边框窗口)的关闭
在这种情况下,被关闭的不是主窗口。判断与该文档边框窗口对应的文档对象是否还被其他一个或者多个文档边框窗口使用,如果是,则仅仅销毁该文档边框窗口(包括其子窗口视);否则,关闭文档,文档对象的OnCloseDocument将销毁该文档边框窗口(包括其子窗口视)。
更多精彩
赞助商链接