MFC深入浅出-应用程序的退出

jMFC对象的创立

  1. 应用程序的淡出

     

    三个Windows应用程序运转之后,日常是步入音讯循环,等待恐怕处理客商的输入,直到顾客关闭应用程序窗口,退出应用程序停止。

     

    比方,客户按主窗口的倒闭开关,也许选拔施行系统菜单“关闭”,也许从“文件”菜单选用实行“退出”,都会产生主窗口被关门。

    当客商从“文件”菜单选取实行“退出”时,将发送MFC标准命令音信ID_APP_EXIT。MFC实现了函数CWinApp::OnAppExit(卡塔尔(قطر‎来实现对该命令音信的缺省管理。

     

    void CWinApp::OnAppExit()

    {

    // same as double-clicking on main window close box

    ASSERT(m_pMainWnd != NULL);

    m_pMainWnd->SendMessage(WM_CLOSE);

    }

    可以看出,其达成是向主窗口发送WM_CLOSE消息。主窗口管理完WM_CLOSE音信之后,关闭窗口,发送WM_QUIT信息,退出新闻循环(见图5-3),进而退出整个应用程序。

     

  2. 边框窗口对WM_CLOSE的处理

     

前方几章介绍了MFC的大旨概念和酌量,即介绍了MFC对Windows对象的包装方法和特征;MFC对象的动态创设、系列化;MFC音信映射机制。

MFC提供了函数CFrameWnd::OnClose来管理每一类边框窗口的关门:不止包涵SDI的边框窗口(从CFrameWnd派生卡塔尔(قطر‎,何况包涵MDI的主边框窗口(从CMDIFrameWnd派生)或许文书档案边框窗口(从CMDIChildWnd派生卡塔尔(قطر‎的关闭。

今昔,调查MFC的应用程序构造系列,即以文书档案-视为基本的编程情势。学习本章,应该弄驾驭以下难题:

 

MFC中众多MFC对象的涉嫌:应用程序对象,文书档案对象,边框窗口对象,文书档案边框窗口对象,视目的,文书档案模板对象等。

该函数的原型如下,流程如图6-1所示:

MFC对象的创办和销毁:由哪些指标创制或销毁什么指标,曾几何时创制,曾几何时销毁?

 

MFC提供了这些接口来支撑其编制程序形式?

void CFrameWnd::OnClose()

MFC完毕了一个Idle管理机制,就是在并未有新闻能够拍卖时,进行Idle管理。Idle管理的二个行使是修改客户接口对象的情景。更新客户接口状态的从头到尾的经过见音信映射的章节。

从图6-1中得以见见,它首先剖断是还是不是足以关闭窗口(m_lpfnCloseProc是函数指针类型的分子变量,用于打字与印刷预览等状态下),然后,根据具体情形进行拍卖:

从图5-3中Run的流水生产线上能够驾驭的见到MFC空闲管理的情景。

 

本节描述了应用程序从InitInstance开首开始化、从Run进入消息循环的长河,上面将就SDI应用程序的事例描述该进度中成立各样所需MFC对象的流程。

  • 若果是主窗口被关门,则关闭程序的兼具文档,销毁全部窗口,退出程序;

     

  • 假使不是主窗口被关门,则是文书档案边框窗口被关闭,又分二种处境:若该窗口所体现的文书档案被且仅被该窗口体现,则关闭文书档案和文书档案窗口并销毁窗口;若该窗口体现的文书档案还被此外文书档案边框窗口所展示,则只是关闭和销毁文书档案窗口。

     

其次步是创建或许打开文件。

图片 1

对此SDI程序,MFC对象的动态成立进程是在开立或然展开文件中发出的。不过怎么向来不观看文件操作相关的语句呢?

 

图5-8陈诉的全体进度中一类别新闻管理函数和伪造函数被调用。比如:在Windwos边框窗口和视窗口被创立时会发生WM_CREATE等音信,招致OnCreate等音信处理函数的调用,CFrameWnd和CView都隐蔽了该函数,所以在边框窗口和视窗口的制造中,相像的新闻调用了分裂的拍卖函数CFrameWnd::OnCreate和CView::OnCreate。

上面是管理WM_CLOSE新闻中提到的片段函数。

图5-8关系的多少个虚构函数的流水生产线分别由图5-9、图5-10图解。图5-9代表CDocument的OnNewDocument的流程;图5-10代表CDocument的OpenDocument的流水生产线。那八个函数分别在开立新文书档案恐怕张开叁个文书档案时被调用。从流程能够阅览,对于OpenDocument函数,MFC的缺省落实首要用于设置更正标记、系列化读入展开文档的剧情。图5-10体现了系列化的操作进度:

 

率先,使用文书档案对象展开也许成立的文本句柄创立一个用以读出多少的CArchive对象loadarchive;然后使用它通过Serialize举办类别化操作,完成,CArchive对象被电动销毁,文件句柄被关门。

图片 2

从这么些图中能够看出什么时候、哪个地方调用了何等音信管理函数和虚构函数,那几个函数用来作了怎样事情。须要的话,程序猿能够在派生类覆盖它们。

  • BOOL CDocument::SaveModified() 

在创制专门的工作成功之后,实行初始化,使用文书档案对象的数额来更新视和出示窗口。

该设想函数的缺省得以完毕:首先调用IsModifed推断文书档案是还是不是被改动,没有改变就重回,不然继续。

迄今停止,本节描述了MFC的SDI程序从解析命令行到创造或展开文件的管理进程,文书档案对象已经动态创制。总计如下:

 

当精通客户是或不是保存被改造的文书档案时,若客户表示“cancel”,再次回到FALSE;若顾客表示“no”,则赶回TRUE;若顾客表示“yes”,则存盘退步再次回到FALSE,存盘成功再次回到TRUE。存盘管理首先要获得被保留文件的名称,然后调用虚构函数OnSaveDocument实现存盘专门的学业,并行使SetModifidFlag(FALSEState of Qatar设置文书档案为未有改造。

 

  • BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName) 

该函数是虚构函数,用来保存文件。其落到实处的功用和OpOpenDocument相反,但拍卖流程近似,描述如下:

 

基于lpszPathName张开文件pFile;

 

应用pFile布局二个用以写入数据的CArchive对象,此指标用来保存数据到文件;

 

设置鼠标为时间瓶形状;

选择Serialize函数实现系列化写;

 

终结,复苏鼠标的造型。

  • CWinApp::SaveAllModified() 

CWinApp::CloseAllDocuments(BOOL bEndSession)

那四个函数都遍历模板微处理机列表,并各自对列表中的模板微电脑对象每个调用CDocManager的同名成员函数:

 

CDocManager::SaveAllModified()

CDocManager::CloseAllDocuments(BOOL bEndSession)

那多少个函数都遍历其文书档案模板列表,并各自对列表中的模板对象每个调用CDocTemplate的同名成员函数:

 

CDocTemplate::SaveAllModified()

CDocTemplate::CloseAllDocuments(BOOL bEndSession)

那多个函数都遍历其文书档案列表,并各自对列表中的文书档案对象各种调用CDocuemnt的成员函数:

 

CDocument::SaveModified()

CDocument::OnCloseDocument()

  • CDocument::SaveModified() 

CDocument::OnCloseDocument()

CDocument::SaveModified前边已作了表达。OnCloseDocument是三个假造函数,其流程如图6-2所示。

 

经过文书档案对象所对应的视,获得全数字突显示该文书档案的边框窗口的指针:在SDI程序关闭窗口时,获取的是主边框窗口;在MDI程序关闭窗口时,获取的是MDI子窗口。

 

下一场,关闭并销毁对应的边框窗口。

一经文书档案对象的m_bAutoDelete为真,则销毁文书档案对象自己。

 

图片 3

 

  1. 窗口的销毁进度

     

  2. 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给客商窗口(父窗口State of Qatar发送音讯WM_MDIDESTROY,让客商窗口来销毁本身。

     

  3. 处理WM_DESTROY消息

     

消息管理函数OnDestroy管理WM_DESTROY音讯,CFrameWnd、CMDIChildWnd、CWnd、CView及其派生类(如CEditView等等)、CControlBar等都提供了对该消息的管理函数。这里,首要表达边框、文书档案边框、视类的新闻管理函数OnDestroy。

 

  1. CWnd::OnDestroy()

     

    调用缺省管理函数Default(卡塔尔(قطر‎。

     

  2. CFrameWnd::OnDestroy()

     

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

     

  3. CMDIFrameWnd::OnDestroy()

     

    首先,调治客商窗口的界限类型;然后,调用基类CframeWnd的OnDestroy。这时候,MDI子窗口的工具栏窗口列表为空,故并未有工具栏窗口能够销毁。

     

  4. CView::OnDestroy()

     

先是,推断本身是或不是是边框窗口的活动视,要是是则调用边框窗口的SetActivateView使和煦失去激活;然后,调用基类CWnd的OnDestroy。

 

  1. 处理WM_NCDESTROY消息 

窗口的非顾客区被灭亡时,窗口接受WM_NCDESTROY消息,由OnNcDestroy处理WM_NCDESTROY音讯。在MFC中,OnNcDestroy是Windows窗口被消亡时调用的末尾三个成员函数。

 

CWnd、CView的少数派生类提供了对该音信的管理函数,这里只谈谈CWnd的兑现。

 

  1. CWnd::OnNcDestroy()

     

    先是剖断当前线程的主窗口是还是不是是该窗口,如若是且模块非DLL,则发送WM_QUIT消息,使得程序甘休;

     

    然后,判定当前线程的移位窗口是不是是该窗口,要是是则设置活动窗口为NULL;

     

    接着,清理Tooltip窗口,调用Default由Windows缺省管理WM_NCDESTROY新闻,UNSUBCLASS,把窗口句柄和MFC窗口对象分别(Detach卡塔尔(قطر‎;

     

    末尾,调用虚构函数PostNcDestoy。

     

  2. PostNcDestoy

     

CWnd、CFrameWnd、CView、CControlBar等都隐蔽了该函数。文书档案边框窗口和边框窗口都选取CFrameWnd::PostNcDestroy。

  • CWnd::PostNcDestroy() 

MFC缺省完毕空

  • void CFrameWnd::PostNcDestroy() 

调用delete this销毁自己那些MFC对象。

 

  • void CView::PostNcDestroy() 

调用delete this销毁自个儿这些MFC对象。

 

  1. 析构函数 

delete this招致析构函数的调用。必要提到的是CFrameWnd和CView的析构函数。

 

  • CFrameWnd::~CFrameWnd() 

边框窗口在创制时,把自家投入到模块-线程状态的边框窗口列表m_frameList中。今后,从列表中移走该窗口对象。

 

必备的话,删除m_phWndDisable数组。

 

  • CView::~CView() 

在视创制时,把自己投入到文书档案对象的视列表中。今后,从列表中移走该视对象。

应用程序调用CloseAllDocument关闭文书档案时。参数为FALSE,它事实上并未把视从列表中消逝,而结尾的破除是由析构函数来成功的。

 

到现在结束,边框窗口关闭的长河商量结束。上面,结合具体意况──SDI窗口的闭馆、MDI主窗口的闭馆、MDI子窗口的闭馆──描述对WM_CLOSE新闻的拍卖。

 

  1. SDI窗口、MDI主、子窗口的关闭 

仿效图6-1剖判SDI窗口、MDI主、子窗口的倒闭流程。

 

  1. SDI窗口的关门

     

    在这里种景况下,主窗口将被关门。首先,关闭应用程序的文档对象。文书档案对象的设想函数OnCloseDocument调用时销毁了主窗口(Windows窗口和MFC窗口对象),同期也变成视、工具条窗口的消亡。主窗口销毁后,应用程序的主窗口对象为空,故发送WM_QUIT新闻截止程序。

     

  2. MDI主窗口的停业

     

    首先,关闭应用程序的保有文书档案对象。文档对象的OnCloseDocument函数关闭文档时,将销毁文书档案对象对应的文书档案边框窗口和它的视窗口。那样,全体的MDI子窗口(富含其子窗口视)被灭亡,但应用程序的主窗口还在。接着,调用DestroyWindow成员函数销毁主窗口自己,DestroyWindow开掘被衰亡的是应用程序的主窗口,于是发送WM_QUIT音讯甘休程序。

     

  3. MDI子窗口(文书档案边框窗口)的倒闭

     

在此种情况下,被关门的不是主窗口。剖断与该文书档案边框窗口对应的文书档案对象是不是还被此外三个照旧多少个文书档案边框窗口使用,如若是,则独自销毁该文书档案边框窗口(包蕴其子窗口视);否则,关闭文书档案,文书档案对象的OnCloseDocument将销毁该文书档案边框窗口(包含其子窗口视)。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图