WEB开发网
开发学院软件开发VC MFC教程(6)-- 应用程序的退出 阅读

MFC教程(6)-- 应用程序的退出

 2010-03-25 20:33:42 来源:WEB开发网   
核心提示:DestroyWindow从图6-1、图6-2可以看出,销毁窗口是通过调用DestroyWindow来完成的,MFC教程(6)-- 应用程序的退出(3),DestroyWindow是CWnd类的一个虚拟函数,CWnd实现了该函数,UNSUBCLASS,把窗口句柄和MFC窗口对象分离(Detach);最后,而CMDICh

DestroyWindow

从图6-1、图6-2可以看出,销毁窗口是通过调用DestroyWindow来完成的。DestroyWindow是CWnd类的一个虚拟函数。CWnd实现了该函数,而CMDIChildWnd覆盖了该函数。

(1)CWnd::DestroyWindow()

主要就是调用::DestroyWindow销毁m_hWnd(必须非空),同时销毁其菜单、定时器,以及完成其他清理工作。

::DestroyWindow使将被销毁的窗口失去激活、失去输入焦点,并发送WM_DESTROY、WM_NCDESTROY消息到该窗口及其各级子窗口。如果被销毁的窗口是子窗口且没有设置WM_NOPARENTNOTFIY风格,则给其父窗口发送WM_PARENTNOFITY消息。

(2)CMDIChildWnd::DestroyWindow()

因为MDI子窗口不能使用::DestroyWindows来销毁,所以CMdiChildWnd覆盖了该函数,CMDIChildWnd主要是调用成员函数MDIDestroy给客户窗口(父窗口)发送消息WM_MDIDESTROY,让客户窗口来销毁自己。

处理WM_DESTROY消息

消息处理函数OnDestroy处理WM_DESTROY消息,CFrameWnd、CMDIChildWnd、CWnd、CView及其派生类(如CEditView等等)、CControlBar等都提供了对该消息的处理函数。这里,主要解释边框、文档边框、视类的消息处理函数OnDestroy。

CWnd::OnDestroy()

调用缺省处理函数Default()。

CFrameWnd::OnDestroy()

首先,销毁工具栏的窗口;然后,设置菜单为缺省菜单;接着,如果要销毁的是主边框窗口,则通知HELP程序本应用程序将退出,没有其他程序使用WINHELP则关闭WINHELP;最后调用CWnd::OnDestroy。

CMDIFrameWnd::OnDestroy()

首先,调整客户窗口的边界类型;然后,调用基类CframeWnd的OnDestroy。这时,MDI子窗口的工具栏窗口列表为空,故没有工具栏窗口可以销毁。

CView::OnDestroy()

首先,判断自身是否是边框窗口的活动视,如果是则调用边框窗口的SetActivateView使自己失去激活;然后,调用基类CWnd的OnDestroy。

处理WM_NCDESTROY消息

窗口的非客户区被销毁时,窗口接收WM_NCDESTROY消息,由OnNcDestroy处理WM_NCDESTROY消息。在MFC中,OnNcDestroy是Windows窗口被销毁时调用的最后一个成员函数。

CWnd、CView的某些派生类提供了对该消息的处理函数,这里只讨论CWnd的实现。

CWnd::OnNcDestroy()

首先判断当前线程的主窗口是否是该窗口,如果是且模块非DLL,则发送WM_QUIT消息,使得程序结束;

然后,判断当前线程的活动窗口是否是该窗口,如果是则设置活动窗口为NULL;

接着,清理Tooltip窗口,调用Default由Windows缺省处理WM_NCDESTROY消息,UNSUBCLASS,把窗口句柄和MFC窗口对象分离(Detach);

最后,调用虚拟函数PostNcDestoy。

上一页  1 2 3 4  下一页

Tags:MFC 教程 应用程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接