第3章MFC应用程序框架(2)

上传人:痛*** 文档编号:244993781 上传时间:2024-10-06 格式:PPT 页数:14 大小:267.50KB
返回 下载 相关 举报
第3章MFC应用程序框架(2)_第1页
第1页 / 共14页
第3章MFC应用程序框架(2)_第2页
第2页 / 共14页
第3章MFC应用程序框架(2)_第3页
第3页 / 共14页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,3,章,MFC,应用程序框架,(2),本章主要内容,Document/View,结构,10/6/2024,1,Document/View结构,MS,在设计,MFC,时,考虑以要把数据本身,(,用,CDocument,类,来实现,),与它的显示,(,用,CView,类来实现,),分离,于是就采用,Document/View,结构来实现一想法。,10/6/2024,2,在,MFC,中引入了,文档,/,视,(Doc/View),结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。,用AppWizard生成SDI程序,看一下由框架生成的类。,一个完整的应用一般由五个类组成:,1.,CWinApp,应用程序类,2.,CFrameWnd,窗口框架类,3.,CDocTemplate,文档模板类,4.,CDocument,文档类,5.,CView,视类。,10/6/2024,3,应用程序对象,文档模板对象,文档对象,窗口框架对象,视对象,创建,创建,创建,图,1 Doc/View,程序主要对象建立方法,(1),CWinApp,派生类创建一个应用程序对象,theApp,(2),在应用程序对象的初始化函数,InitInstance,(),中创建文档模板对象,该文档模板被添加到应用程序模板链表中,(3),文档模板对象生成框架窗口对象,、文档对象,(4),框架窗口对象创建,视图对象。,10/6/2024,4,virtual BOOL,OnNewDocument,(),文件,新建,此菜单的消息响应函数,OnFileNew,(,在工程中不可见,),在,MFC,内部响应,此函数创建文档对象,(,生命期直到主框架窗口被销毁,),,框架对象和视对象,,OnFileNew,再调用虚函数,OnNewDocument,(),来初始化文档对象的数据成员。,virtual void,DeleteContents,(),清理文档数据,10/6/2024,5,一般来讲我们只需对文档和视进行操作,框架的各种行为已经被,MFC,安排好了而不需人为干预,这也是,MS,设计文档,-,视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。,10/6/2024,6,在应用中一个视对应一个文档,但一个文档可以包含多个视。,一个应用中只用一个框架窗口,对多文档界面来讲可能有多个,MDI,子窗口。,每一个视都是一个子窗口,在,SDI,中框架窗口由,CFrameWnd,派生,在,MDI,中主窗口框架由,CMDIFrameWnd,派生,子窗口由,CMDIChildWnd,派生。,一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。,10/6/2024,7,文档,/,视图结构的优点:,把数据处理类从用户界面处理类中分离出来,使得每一个类都能集中地执行一项工作。,把,Windows,程序通常要做的工作分成若干定义好的类,这样有助于应用程序的模块化,程序也易于扩展,编程时只需修改所涉及的类。,虽然文档,/,视图结构牵涉到许多类,其中的也关系比较复杂,但,MFC AppWizard,向导建立的,MFC,应用程序框架已经把程序的主要结构完成了,模块间的消息传递以及各函数的功能都已确定。,MFC,应用程序框架起到了穿针引线的作用,按照消息处理函数功能的不同,将不同消息的响应分别分布在文档类和视图类中。,10/6/2024,8,包含多个类的,MFC,文档,/,视图,结构应用程序要管理这些类中的数据,除了考虑在程序的哪一部分拥有数据和在哪一部分显示数据,一个主要的问题是文档数据更改后如何保持视图显示的同步,即文档与视图如何进行交互。,在文档、视图和应用程序框架之间包含了一系列复杂的相互作用过程,文档与视图的交互是通过类的公有成员变量和成员函数实现的。,文档与视图之间的相互作用,10/6/2024,9,1,视图类的成员函数,GetDocument,(),一个视图对象只有一个与之相关联的文档对象。在,MFC,应用程序中,视图对象通过调用成员函数函数,GetDocument,(),得到当前文档。,GetDocument,(),是视图类的成员函数,调用它可以返回与视图相关联的文档对象的指针,利用这个指针可以访问文档类及其派生类的公有成员。,当利用,MFC AppWizard,向导创建一个,SDI,单文档应用程序,Mysdi,时,生成了视图类的一个派生类,并在派生类中定义了函数,GetDocument,(),。,文档和视图类常用的成员函数,10/6/2024,10,CMysdiDoc,*,CMysdiView:GetDocument,(),ASSERT(m_pDocument,-,IsKindOf(RUNTIME_CLASS(CMysdiDoc,);,return (,CMysdiDoc,*,),m_pDocument,;,/,m_pDocument,是,CArchive,类的数据成员,,/,指向当前文档对象,GetDocument,(),的,Debug,版函数代码:,10/6/2024,11,一个文档对象可以有多个与之相关联的视图对象,当一个文档的数据通过某个视图被修改后,与它关联的每一个视图都必须反映出这些修改。因此,视图在需要时必须进行重绘,即当文档数据发生改变时,必须通知到所有相关联的视图对象,以便更新所显示的数据。,更新与该文档有关的所有视图的方法是调用成员函数,CDocument:UpdateAllViews,(),。,2,CDocument,类的成员函数,UpdateAllViews,(),10/6/2024,12,当程序调用,CDocument:UpdateAllViews,(),函数时,实际上是调用了所有相关视图的,OnUpdate,(),函数,以更新相关的视图。需要时,可以直接在视图派生类的成员函数中调用该函数刷新当前视图。,3,视图类的成员函数,OnUpdate,(),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,(),更新整个视图窗口,基类,CView,的成员函数,10/6/2024,13,在,OnUpdate,(),中通过调用函数,CWnd:Invalidate,(),刷新整个客户区,我们也可以在自己的,CWnd,派生类中直接调用函数,Invalidate(),。,总结,:刷新视图时默认的函数调用过程:,CDocument:UpdateAllViews,(),CView:OnUpdate,(),CWnd:Invalidate,(),OnPaint,(),OnDraw,(),10/6/2024,14,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!