第3章 MFC应用程序框架
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010-1-16 2
Doc/View程序主要对象建立方法(见图) (1) CWinApp派生类创建一个应用程序 对象theApp (2) 在应用程序对象的初始化函数 InitInstance()中创建文档模板对象,该文 档模板被添加到应用程序模板链表中 (3)文档模板对象生成框架窗口对象,文 档对象 (4)框架窗口对象创建视图对象.
第3章 MFC应用程序框架
本章主要内容 MS在设计MFC时,考虑以要把数据本 身(用CDocument类来实现)与它的显示 (用CView类来实现)分离,于是就采用 Document/View结构来实现一想法.
2010-1-16
1
在MFC中引入了文档 视(Doc/View)结构 文档/视 文档 的概念,文档相当于数据容器,视相当 于查看数据的窗口或是和数据发生交互 的窗口. 一个完整的应用一般由五个类组成: 1. CWinApp应用程序类 2. CFrameWnd窗口框架类 3. CDocTemplate文档模板类 4. CDocument文档类 5. CView视类.
2010-1-16
9
文档和视图类常用的成员函数
1.视图类的成员函数GetDocument() 一个视图对象只有一个与之相关联的文档对象. 在MFC应用程序中,视图对象通过调用成员函数 函数GetDocument()得到当前文档.GetDocument() 是视图类的成员函数,调用它可以返回与视图相关 联的文档对象的指针,利用这个指针可以访问文档 类及其派生类的公有成员. 当利用MFC AppWizard向导创建一个SDI单文 档应用程序Mysdi时,生成了视图类的一个派生类, 并在派生类中定义了函数GetDocument().
2010-1-16 13
在OnUpdate()中通过调用函数 CWnd::Invalidate()刷新整个客户区,我们也可以 在自己的CWnd派生类中直接调用函数 Invalidate(). 总结:刷新视图时默认的函数调用过程: 总结 CDocument::UpdateAllViews() →CView::OnUpdate() →CWnd::Invalidate() →OnPaint() →OnDraw()
2010-1-16
12
3.视图类的成员函数OnUpdate() 当程序调用CDocument::UpdateAllViews()函数时, 实际上是调用了所有相关视图的OnUpdate()函数,以 更新相关的视图.需要时,可以直接在视图派生类的 成员函数中调用该函数刷新当前视图.
基 类 CView 的成员函数 void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/) { ASSERT(pSender != this); UNUSED(pSender); // unused in release builds // invalidate the entire pane, erase background too Invalidate(TRUE); // 使整个窗口矩形无效,通过调 // 用OnDraw()更新整个视图窗口 }
2010-1-16
10
GetDocument()的Debug版函数代码: 版函数代码: 版函数代码
CMysdiDoc* CMysdiView::GetDocument() { ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CMysdiDoc))); return (CMysdiDoc*)m_pDocument; // m_pDocument是CArchive类的数据成员, // 指向当前文档对象 }
2010-1-16 8
文档与视图之间的相互作用
包含多个类的MFC文档/视图 文档/视图结构应用程序要管理这 文档 些类中的数据,除了考虑在程序的哪一部分拥有数 据和在哪一部分显示数据,一个主要的问题是文档 数据更改后如何保持视图显示的同步,即文档与视 图如何进行交互. 在文档,视图和应用程序框架之间包含了一系列复 杂的相互作用过程,文档与视图的交互是通过类的 公有成员变量和成员函数实现的.
2010-1-16 3
应用程序对象 文档窗口框架对象
创建
视对象
图1 Doc/View程序主要对象建立方法
2010-1-16
4
virtual BOOL OnNewDocument() 文件 新建,此菜单的消息响应函数 OnFileNew(在工程中不可见)在MFC内部 响应,此函数创建文档对象(生命期直到 主框架窗口被销毁),框架对象和视对象, OnFileNew再调用虚函数 OnNewDocument()来初始化文档对象的 数据成员. virtual void DeleteContents() 清理文档数据
2010-1-16 14
�
2010-1-16 5
一般来讲我们只需对文档和视进行操作, 框架的各种行为已经被MFC安排好了而 不需人为干预,这也是MS设计文档-视 结构的本意,让我们将注意力放在完成 任务上而从界面编写中解放出来.
2010-1-16
6
在应用中一个视对应一个文档,但一个文档 可以包含多个视. 一个应用中只用一个框架窗口,对多文档界 面来讲可能有多个MDI子窗口. 每一个视都是一个子窗口,在SDI中框架窗口 由CFrameWnd派生,在MDI中主窗口框架由 CMDIFrameWnd CMDIFrameWnd派生,子窗口由 CMDIChildWnd派生. 一个多文档应用中可以包含多个文档模板, 一个模板定义了一个文档和一个或多个视之 间的对应关系.同一个文档可以属于多个模 板,但一个模板中只允许定义一个文档.同 样一个视也可以属于多个文档模板.
2010-1-16
11
2.CDocument类的成员函数 UpdateAllViews()
一个文档对象可以有多个与之相关联的视图对 象,当一个文档的数据通过某个视图被修改后,与 它关联的每一个视图都必须反映出这些修改.因此, 视图在需要时必须进行重绘,即当文档数据发生改 变时,必须通知到所有相关联的视图对象,以便更 新所显示的数据. 更新与该文档有关的所有视图的方法是调用成 员函数CDocument::UpdateAllViews().
2010-1-16 7
文档/视图结构的优点: 文档 视图结构的优点: 视图结构的优点
把数据处理类从用户界面处理类中分离出来,使得 每一个类都能集中地执行一项工作. 把Windows程序通常要做的工作分成若干定义好的 类,这样有助于应用程序的模块化,程序也易于扩 展,编程时只需修改所涉及的类. 虽然文档/视图结构牵涉到许多类,其中的也关系比 / 较复杂,但MFC AppWizard向导建立的MFC应用程 序框架已经把程序的主要结构完成了,模块间的消 息传递以及各函数的功能都已确定. MFC应用程序框架起到了穿针引线的作用,按照消 息处理函数功能的不同,将不同消息的响应分别分 布在文档类和视图类中.
Doc/View程序主要对象建立方法(见图) (1) CWinApp派生类创建一个应用程序 对象theApp (2) 在应用程序对象的初始化函数 InitInstance()中创建文档模板对象,该文 档模板被添加到应用程序模板链表中 (3)文档模板对象生成框架窗口对象,文 档对象 (4)框架窗口对象创建视图对象.
第3章 MFC应用程序框架
本章主要内容 MS在设计MFC时,考虑以要把数据本 身(用CDocument类来实现)与它的显示 (用CView类来实现)分离,于是就采用 Document/View结构来实现一想法.
2010-1-16
1
在MFC中引入了文档 视(Doc/View)结构 文档/视 文档 的概念,文档相当于数据容器,视相当 于查看数据的窗口或是和数据发生交互 的窗口. 一个完整的应用一般由五个类组成: 1. CWinApp应用程序类 2. CFrameWnd窗口框架类 3. CDocTemplate文档模板类 4. CDocument文档类 5. CView视类.
2010-1-16
9
文档和视图类常用的成员函数
1.视图类的成员函数GetDocument() 一个视图对象只有一个与之相关联的文档对象. 在MFC应用程序中,视图对象通过调用成员函数 函数GetDocument()得到当前文档.GetDocument() 是视图类的成员函数,调用它可以返回与视图相关 联的文档对象的指针,利用这个指针可以访问文档 类及其派生类的公有成员. 当利用MFC AppWizard向导创建一个SDI单文 档应用程序Mysdi时,生成了视图类的一个派生类, 并在派生类中定义了函数GetDocument().
2010-1-16 13
在OnUpdate()中通过调用函数 CWnd::Invalidate()刷新整个客户区,我们也可以 在自己的CWnd派生类中直接调用函数 Invalidate(). 总结:刷新视图时默认的函数调用过程: 总结 CDocument::UpdateAllViews() →CView::OnUpdate() →CWnd::Invalidate() →OnPaint() →OnDraw()
2010-1-16
12
3.视图类的成员函数OnUpdate() 当程序调用CDocument::UpdateAllViews()函数时, 实际上是调用了所有相关视图的OnUpdate()函数,以 更新相关的视图.需要时,可以直接在视图派生类的 成员函数中调用该函数刷新当前视图.
基 类 CView 的成员函数 void CView::OnUpdate(CView* pSender, LPARAM /*lHint*/, CObject* /*pHint*/) { ASSERT(pSender != this); UNUSED(pSender); // unused in release builds // invalidate the entire pane, erase background too Invalidate(TRUE); // 使整个窗口矩形无效,通过调 // 用OnDraw()更新整个视图窗口 }
2010-1-16
10
GetDocument()的Debug版函数代码: 版函数代码: 版函数代码
CMysdiDoc* CMysdiView::GetDocument() { ASSERT(m_pDocument-> IsKindOf(RUNTIME_CLASS(CMysdiDoc))); return (CMysdiDoc*)m_pDocument; // m_pDocument是CArchive类的数据成员, // 指向当前文档对象 }
2010-1-16 8
文档与视图之间的相互作用
包含多个类的MFC文档/视图 文档/视图结构应用程序要管理这 文档 些类中的数据,除了考虑在程序的哪一部分拥有数 据和在哪一部分显示数据,一个主要的问题是文档 数据更改后如何保持视图显示的同步,即文档与视 图如何进行交互. 在文档,视图和应用程序框架之间包含了一系列复 杂的相互作用过程,文档与视图的交互是通过类的 公有成员变量和成员函数实现的.
2010-1-16 3
应用程序对象 文档窗口框架对象
创建
视对象
图1 Doc/View程序主要对象建立方法
2010-1-16
4
virtual BOOL OnNewDocument() 文件 新建,此菜单的消息响应函数 OnFileNew(在工程中不可见)在MFC内部 响应,此函数创建文档对象(生命期直到 主框架窗口被销毁),框架对象和视对象, OnFileNew再调用虚函数 OnNewDocument()来初始化文档对象的 数据成员. virtual void DeleteContents() 清理文档数据
2010-1-16 14
�
2010-1-16 5
一般来讲我们只需对文档和视进行操作, 框架的各种行为已经被MFC安排好了而 不需人为干预,这也是MS设计文档-视 结构的本意,让我们将注意力放在完成 任务上而从界面编写中解放出来.
2010-1-16
6
在应用中一个视对应一个文档,但一个文档 可以包含多个视. 一个应用中只用一个框架窗口,对多文档界 面来讲可能有多个MDI子窗口. 每一个视都是一个子窗口,在SDI中框架窗口 由CFrameWnd派生,在MDI中主窗口框架由 CMDIFrameWnd CMDIFrameWnd派生,子窗口由 CMDIChildWnd派生. 一个多文档应用中可以包含多个文档模板, 一个模板定义了一个文档和一个或多个视之 间的对应关系.同一个文档可以属于多个模 板,但一个模板中只允许定义一个文档.同 样一个视也可以属于多个文档模板.
2010-1-16
11
2.CDocument类的成员函数 UpdateAllViews()
一个文档对象可以有多个与之相关联的视图对 象,当一个文档的数据通过某个视图被修改后,与 它关联的每一个视图都必须反映出这些修改.因此, 视图在需要时必须进行重绘,即当文档数据发生改 变时,必须通知到所有相关联的视图对象,以便更 新所显示的数据. 更新与该文档有关的所有视图的方法是调用成 员函数CDocument::UpdateAllViews().
2010-1-16 7
文档/视图结构的优点: 文档 视图结构的优点: 视图结构的优点
把数据处理类从用户界面处理类中分离出来,使得 每一个类都能集中地执行一项工作. 把Windows程序通常要做的工作分成若干定义好的 类,这样有助于应用程序的模块化,程序也易于扩 展,编程时只需修改所涉及的类. 虽然文档/视图结构牵涉到许多类,其中的也关系比 / 较复杂,但MFC AppWizard向导建立的MFC应用程 序框架已经把程序的主要结构完成了,模块间的消 息传递以及各函数的功能都已确定. MFC应用程序框架起到了穿针引线的作用,按照消 息处理函数功能的不同,将不同消息的响应分别分 布在文档类和视图类中.