ImageVerifierCode 换一换
格式:DOCX , 页数:44 ,大小:323.06KB ,
资源ID:9561274      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9561274.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC文档视图架构编程.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC文档视图架构编程.docx

1、MFC文档视图架构编程MFC文档/视图架构编程理解了MFC文档视图类的意义及它们纵横交错的关系也就理解了“文档/视图”结构的基本概念,在此基础上,我们再进一步研究“文档/视图”结构的MFC程序消息流动的方向,这样就完全彻底明白了基于文档/视图结构MFC程序的“生死因果”。“文档/视图”结构是MFC中结构最为复杂,体系最为庞大,而又最富有特色的部分,其中涉及到应用、文档模板、文档、视图、SDI窗口、MDI框架窗口、MDI子窗口等多种不同的类,如果不了解这些类及其盘根错节的内部联系的话,就不可能编写出高水平的文档/视图程序。学习文档/视图结构的意义还不只于其本身,通过该架构的学习,一步步领略MFC

2、设计者的神功奥妙,也将进一步增强我们自身对庞大程序框架的把握能力。一个优秀的程序员是可以写出一个个优秀函数的程序员,而一个优秀的系统设计师则需从全局把握软件的架构,分析和学习文档/视图结构将是我们成为软件系统设计师之旅的一个重要阶段。第一讲 基本概念MFC引入了文档/视图结构的概念,理解这个结构是编写基于MFC编写复杂Visual C+程序的关键。MFC文档/视图结构被认为是一种架构,关于什么是架构,这是个仁者见仁,智者见智的问题。引言MFC引入了文档/视图结构的概念,理解这个结构是编写基于MFC编写复杂Visual C+程序的关键。文档/视图中主要涉及到四种类:(1)文档模板:class C

3、DocTemplate; / template for document creationclass CSingleDocTemplate; / SDI supportclass CMultiDocTemplate; / MDI support(2)文档:class CDocument; / main document abstraction(3)视图:/ views on a documentclass CView; / a view on a documentclass CScrollView; / a scrolling view(4)框架窗口:/ frame windowsclass

4、CFrameWnd; / standard SDI frameclass CMDIFrameWnd; / standard MDI frameclass CMDIChildWnd; / standard MDI childclass CMiniFrameWnd; / half-height caption frame wnd理解了这4个类各自的意义及它们纵横交错的关系也就理解了文档/视图结构的基本概念,在此基础上,我们还需要进一步研究文档/视图结构的MFC程序消息流动的方向,这样就完全彻底明白了基于文档/视图结构MFC程序的生死因果。出于以上考虑,本文这样组织了各次连载的内容:第1次连载进行基

5、本概念的介绍,第25次连载分别讲述文档模板、文档、视图和框架窗口四个类的功能和主要函数,连载6则综合阐述四个类之间的关系,接着以连载7讲解消息流动的方向,最后的连载8则以实例剖析连载17所讲述的所有内容。本文所有的代码基于WIN32平台开发,调试环境为Visual C+6.0。在本文的连载过程中,您可以通过如下方式联系作者(热忱欢迎读者朋友对本文的内容提出质疑或给出修改意见):作者email:21cnbao(可以来信提问,笔者将力求予以回信解答);另外,对本文的转载请务必注明作者和出处。未经同意,不得用于任何形式的商业目的。架构MFC文档/视图结构被认为是一种架构,关于什么是架构,这是个仁者见

6、仁,智者见智的问题。在笔者看来,成其为架构者,必具备如下两个特性:(1)它是一种基础性平台,是一个模型。通过这个平台、这个模型,我们在上面进一步修饰,可以得到无穷无尽的新事物。譬如,建筑学上的钢筋混凝土结构、ISO(国际标准化组织)的OSI(开放式系统互连)七层模型。架构只是一种基础性平台,不同于用这个架构造出的实例。钢筋混凝土结构是架构,而用钢筋混凝土结构造出的房子就不能称为架构。这个特性强调了架构的外部特征,即架构具有可学习、可再生、可实例化的特点,是所有基于该架构所构造实例的共性,是贯串在它们体内的一根筋,但各个基于该架构所构造的实例彼此是存在差异的。(2)它是一个由内部有联系的事物所组

7、成的一个有机整体。架构中的内部成员不是彼此松散的,并非各自占山为王,它们歃血为盟,紧密合作,彼此都有明确的责任和分工,因此共同构筑了一个统一的基础性平台、一个统一的模型。譬如,OSI模型从物理层到应用层进行了良好的合作,虽然内部包含了复杂的多个层次,但仍然脉络清晰。由此可见,架构的第2个特性是服务于第1个特性的。理解架构,关键是理解以上两个特性。而针对特定的文档/视图结构,则需理解如下两个问题:(1)学习这个架构,并学会在这个架构上造房子(编写基于文档/视图结构的程序);(2)理解这个架构内部的工作机理(文档模板、文档、视图和框架窗口四个类是如何联系为一个有机整体的),并在造房子时加以灵活应用

8、(重载相关的类)。在这里,我们再引用几位专家(或企业)关于架构的定义以供读者进一步参考:The key ideas of a commercial application framework : a generic app on steroids that provides a large amount of general-purpose functionality within a well-planned, welltested, cohesive structure.(Application framework is) an extended collection of classes

9、 that cooperate to support a complete application architecture or application model, providing more complete application development support than a simple set of class libraries.MacApp(Apples C+ application framework)An application framework is an integrated object-oriented software system that offe

10、rs all the application-level classes(documents, views, and commands)needed by a generic application.An application framework is meant to be used in its entirety, and fosters both design reuse and code reuse. An application framework embodies a particular philosophy for structuring an application, an

11、d in return for a large mass of prebuilt functionality, the programmer gives up control over many architectural-design decisions.Ray Valdes什么是Application Framework?Framework 这个字眼有组织、框架、体制的意思,Application Framework 不仅是一般性的泛称,它其实还是对象导向领域中的一个专有名词。 基本上你可以说,Application Framework 是一个完整的程序模型,具备标准应用软件所需的一切基本

12、功能,像是档案存取、打印预视、数据交换.,以及这些功能的使用接口(工具列、状态列、选单、对话盒)。如果更以术语来说,Application Framework 就是由一整组合作无间的对象架构起来的大模型。喔不不,当它还没有与你的程序产生火花的时候,它还只是有形无体,应该说是一组合作无间的类别架构起来的大模型。侯捷最后,要强调的是,笔者之所以用一个较长的篇幅来连载关于文档/视图结构的内容,是因为文档/视图结构是MFC中结构最为复杂,体系最为庞大,而又最富有特色的部分,其中涉及到应用、文档模板、文档、视图、SDI窗口、MDI框架窗口、MDI子窗口等多种不同的类,如果不了解这些类及其盘根错节的内部联

13、系的话,就不可能编写出高水平的文档/视图程序。当然,学习文档/视图结构的意义还不只于其本身,通过该架构的学习,一步步领略MFC设计者的神功奥妙,也将进一步增强我们自身对庞大程序框架的把握能力。一个优秀的程序员是可以写出一个个优秀函数的程序员,而一个优秀的系统设计师则需从全局把握软件的架构,分析和学习文档/视图结构相信将是我们成为系统设计师之旅的一个有利环节。第二讲 文档模板在文档/视图架构的MFC程序中,提供了文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板。本讲的内容,您只需要建立基本的印象。最初的浅尝辄止是为了最终的深入脊髓!文档模板管理者类CDocManager在

14、文档/视图架构的MFC程序中,提供了文档模板管理者类CDocManager,由它管理应用程序所包含的文档模板。我们先看看这个类的声明:/ CDocTemplate manager object class CDocManager : public CObjectDECLARE_DYNAMIC(CDocManager)public:/ ConstructorCDocManager();/Document functionsvirtual void AddDocTemplate(CDocTemplate* pTemplate);virtual POSITION GetFirstDocTemplat

15、ePosition() const;virtual CDocTemplate* GetNextDocTemplate(POSITION& pos) const;virtual void RegisterShellFileTypes(BOOL bCompat);void UnregisterShellFileTypes();virtual CDocument* OpenDocumentFile(LPCTSTR lpszFileName); / open named filevirtual BOOL SaveAllModified(); / save before exitvirtual void

16、 CloseAllDocuments(BOOL bEndSession); / close documents before exitingvirtual int GetOpenDocumentCount();/ helper for standard commdlg dialogsvirtual BOOL DoPromptFileName(CString& fileName, UINT nIDSTitle,DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate);/Commands/ Advanced: process asyn

17、c DDE requestvirtual BOOL OnDDECommand(LPTSTR lpszCommand);virtual void OnFileNew();virtual void OnFileOpen();/ Implementationprotected:CPtrList m_templateList;int GetDocumentCount(); / helper to count number of total documentspublic:static CPtrList* pStaticList; / for static CDocTemplate objectssta

18、tic BOOL bStaticInit; / TRUE during static initializationstatic CDocManager* pStaticDocManager; / for static CDocTemplate objectspublic:virtual CDocManager();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endif;从上述代码可以看出,CDocManager类维护一个CPtrList类型的链表m_templa

19、teList(即文档模板链表,实际上,MFC的设计者在MFC的实现中大量使用了链表这种数据结构),CPtrList类型定义为:class CPtrList : public CObjectDECLARE_DYNAMIC(CPtrList)protected:struct CNodeCNode* pNext; CNode* pPrev;void* data;public:/ ConstructionCPtrList(int nBlockSize = 10);/ Attributes (head and tail)/ count of elementsint GetCount() const;BO

20、OL IsEmpty() const;/ peek at head or tailvoid*& GetHead();void* GetHead() const;void*& GetTail();void* GetTail() const;/ Operations/ get head or tail (and remove it) - dont call on empty list!void* RemoveHead();void* RemoveTail();/ add before head or after tailPOSITION AddHead(void* newElement);POSI

21、TION AddTail(void* newElement);/ add another list of elements before head or after tailvoid AddHead(CPtrList* pNewList);void AddTail(CPtrList* pNewList);/ remove all elementsvoid RemoveAll();/ iterationPOSITION GetHeadPosition() const;POSITION GetTailPosition() const;void*& GetNext(POSITION& rPositi

22、on); / return *Position+void* GetNext(POSITION& rPosition) const; / return *Position+void*& GetPrev(POSITION& rPosition); / return *Position-void* GetPrev(POSITION& rPosition) const; / return *Position-/ getting/modifying an element at a given positionvoid*& GetAt(POSITION position);void* GetAt(POSI

23、TION position) const;void SetAt(POSITION pos, void* newElement);void RemoveAt(POSITION position);/ inserting before or after a given positionPOSITION InsertBefore(POSITION position, void* newElement);POSITION InsertAfter(POSITION position, void* newElement);/ helper functions (note: O(n) speed)POSIT

24、ION Find(void* searchValue, POSITION startAfter = NULL) const;/ defaults to starting at the HEAD/ return NULL if not foundPOSITION FindIndex(int nIndex) const;/ get the nIndexth element (may return NULL)/ Implementationprotected:CNode* m_pNodeHead;CNode* m_pNodeTail;int m_nCount;CNode* m_pNodeFree;s

25、truct CPlex* m_pBlocks;int m_nBlockSize;CNode* NewNode(CNode*, CNode*);void FreeNode(CNode*);public:CPtrList();#ifdef _DEBUGvoid Dump(CDumpContext&) const;void AssertValid() const;#endif/ local typedefs for class templatestypedef void* BASE_TYPE;typedef void* BASE_ARG_TYPE;很显然,CPtrList是对链表结构体struct

26、CNodeCNode* pNext; CNode* pPrev;void* data;本身及其GetNext、GetPrev、GetAt、SetAt、RemoveAt、InsertBefore、InsertAfter、Find、FindIndex等各种操作的封装。作为一个抽象的链表类型,CPtrList并未定义其中节点的具体类型,而以一个void指针(struct CNode 中的void* data)巧妙地实现了链表节点成员具体类型的模板化。很显然,在Visual C+6.0开发的年代,C+语言所具有的语法特征模板仍然没有得到广泛的应用。而CDocManager类的成员函数virtual v

27、oid AddDocTemplate(CDocTemplate* pTemplate);virtual POSITION GetFirstDocTemplatePosition() const;virtual CDocTemplate* GetNextDocTemplate(POSITION& pos) const;则完成对m_TemplateList链表的添加及遍历操作的封装,我们来看看这三个函数的源代码:void CDocManager:AddDocTemplate(CDocTemplate* pTemplate)if (pTemplate = NULL)if (pStaticList !

28、= NULL)POSITION pos = pStaticList-GetHeadPosition();while (pos != NULL)CDocTemplate* pTemplate = (CDocTemplate*)pStaticList-GetNext(pos);AddDocTemplate(pTemplate);delete pStaticList;pStaticList = NULL;bStaticInit = FALSE;elseASSERT_VALID(pTemplate);ASSERT(m_templateList.Find(pTemplate, NULL) = NULL)

29、;/ must not be in listpTemplate-LoadTemplate();m_templateList.AddTail(pTemplate);POSITION CDocManager:GetFirstDocTemplatePosition() constreturn m_templateList.GetHeadPosition();CDocTemplate* CDocManager:GetNextDocTemplate(POSITION& pos) constreturn (CDocTemplate*)m_templateList.GetNext(pos);第三讲 文档 在文档/视图架构的MFC程序中,文档是一个CDocument派生对象,它负责存储应用程序的数据,并把这些信息提供给应用程序的其余部分。1、文档类CDocument在文档/视图架构的MFC程序中,文档是一个CDocument派生对象,它负责存储应用程序的数据,并把这些信息提供给应用程序的其余部分。CDocument类对文档的建立及归档提供

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1