} 通过该函数的实现,可以理解消息循环的过程,和SCK不太一样,它是封装在MFC下的,实际上,它在PumpMessage函数的定义中,学员下去可以自己看看CWinThread中的PumpMessage函数。这个函数需哎哟首先从消息队列中提取消息,接着调用PreTranslateMessage虚函数过滤窗口消息。此处不详细讲解啦。
5.MFC的终止过程
应用处挂起状态时,如果不小心单击了“关闭”按钮,或者用键盘或鼠标从系菜单中选择关闭,这时,系统都会给窗口过程发送一个WM_SYSCOMMAND消息,窗口过程将这个消息传给默认的窗口过程,而默认的窗口过程会给窗口过程发送一个WM_CLOSE消息来响应,窗口过程再次将它传给默认的窗口过程,默认窗口过程调用DestroyWindow来响应这个WM_CLOSE消息,此后,DestroyWindow将导致Windows给窗口过程发送一个WM_DESTROY消息,此消息导致窗口过程再调用PostQuitMessage,将一个WM_QUIT消息置入消息队列中,以此来响应此消息,Run函数收到WM_QUIT消息后,会结束内部的消息循环,然后调用ExitInstance()函数,最后回到AfxWinMain(),执行AfxWinTerm,以此来终止程序的运行。
6.MFC程序流程小结
1. Windows将用户程序装入内存。
2. 构造全局对象theApp,在程序被装入时,所有全局对象都会立刻被创建。 3. Windows调用全局函数WinMain,它是类库的惟一实例 4. WinMain里面只调用函数AfxWinMain,
5. AfxWinMain执行AfxWininit,调用AfxinitThred,接着
6. AfxWinMain执行InitApplication,然后执行Initinstance,Initinstance是CWinApp的虚函数,在此改写。
7. InitInstance函数里面启动文档的装入以及主要框架和视图显示处理过程。
8 .在这里new 一个CMyFrameWnd ,CMyFrameWnd构造函数调用Create产生主窗口 9. InitInstance 执行ShowWindow,UpdateWindow,发出WM_PAINT
10. WinMain调用theApp的Run函数,它启动窗口消息和命令消息的传递处理过程。 11:单击file/close,则发出WM_CLOSE 12:CMainFrame交默认处理
13:调用::DestroyWindow发出WM_DESTROY
14 :默认处理调用::postQuitMessage 发出WM_QUIT 15: CWinapp::Run收到WM_QUIT结束内部循环,调用ExitInsance(若CCExcmpleApp改写 Exitinstance,则调用CCExcmpleApp::ExitInstance;
16. ExitInstance函数负责完成应用程序结束之前的清除工作。
17 . ExitInstance函数返回时,Run函数也返回了,MFC完成了一些清除工作,Windows终止应用程序
18. 回到AfxWinMain,执行AfxWinTerm,程序结束!!
5.文档/视图类
文档视图类以及主框架之间的关系
文档视图较好的实现了数据显示和数据操作的分离,具体的说,用户对数据所做的任何改变的都是由文档类负责管理的,而视图通过调用此接口,以实现对数据的访问和更新。 框架窗口,文档,视图他们之间的关系如下图所示:
从上图可以看到,视图占据了框架窗口的客户区,框架窗口只是相当于视图的容器。这样,即使直接在框架窗口的客户区内执行绘制操作,在屏幕上也不会由任何的输出信息,输出被视图所覆盖。必须通过视图显示应用输出。
注意:文档至少应有一个相关的视图,相反,视图只能与一个文档向关联。
CCExcmpleDoc类的基类为CDocument类,CDocument类为用户定义的文档类提供了基本的功能,框架通过使用CDocument提供的接口来操作文档,用户通过与文档相关联的CView对象来与之交互。
CCExcmpleView类的基类为CView,CView类为用户定义的视图类CCExcmpleView提供了
基本功能,视图是数据的用户窗口,为用户提供了文档数据的可视显示,它在窗口中显示文档的内容,视图还给用户提供了一个与文档中的数据交互的界面,它把用户的输入转换为对文档中的数据的操作。每个文档都会与一个或多个视图相关联,甚至可以与多个不同的视图相关联。
视图类里面的几个重要函数:
CCExcmpleDoc* CCExcmpleView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCExcmpleDoc))); return (CCExcmpleDoc*)m_pDocument; } 解析:每个视图对象只有一个文档与其相关联,用户可以通过该视图对象的成员函数
GetDocument获取与其关联的文档,然后,就可以在视图类中对文档类的公有成员函数及成员变量进行访问。
void CCExcmpleView::OnInitialUpdate() { CView::OnInitialUpdate(); }
解析:在视图与文档关联后,在视图显示之前,或者当用户选择了“File|New”或“File|Open”时,框架就会调用此虚函数,它调用基类的OnInitialUpdate();函数。 void CView::OnInitialUpdate() { OnUpdate(NULL, 0, NULL); // initial update }
在基类里面又调用了OnUpdate函数 void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/) { ASSERT(pSender != this); UNUSED(pSender); // unused in release builds // dxq 使整个面板无效,同时擦除背景 Invalidate(TRUE); } 它的功能主要包括:读取文档数据,然后对视图对象的数据成员或控制进行更新,以便反映文档的便哈,还可以使视图的部分客户区无效,就有WM_PAINT消息产生,从而触发对函
数OnDraw的调用,利用更新后的文档数据对窗口进行重绘。
OnDraw函数:此函数为虚函数,必须在派生类中重载此函数,它主要由框架来调用,以呈现文档数据,依据其参数不同,可以分别完成屏幕显示,打印以及打印预览等任务,在MFC应用程序中,几乎所有的绘制操作都是在OnDraw中完成的(鼠标绘制除外)。