VS2010-MFC(文档视图和框架:概述)

Posted tang-tangt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2010-MFC(文档视图和框架:概述)相关的知识,希望对你有一定的参考价值。

 

转自:http://www.jizhuomi.com/software/221.html

 

 前面几节讲了菜单工具栏状态栏的使用,本节开始将为大家讲解文档、视图和框架的知识。

 

       文档、视图和框架简介

       在VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)创建的单文档工程Example34中,我们可以看到MFC向导自动为我们生成了CExample34Doc类、CExample34View类和CMainFrame类,它们就分别是文档类、视图类和框架窗口类

       文档/视图结构是MFC提供的一种不错的设计,它将数据的处理和显示分开来,这样更便于我们对程序的维护和扩展。下面分别介绍这种结构中涉及到的几个重要概念。

 

       文档

       文档对象用于管理和维护数据,包括保存数据、取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示。

 

       视图

       视图对象将文档中的数据可视化,负责从文档对象中取出数据显示给用户,并接受用户的输入和编辑,将数据的改变反映给文档对象。视图充当了文档和用户之间媒介的角色。

 

       框架

       一个文档可能有多个视图界面,这就需要有框架来管理了。框架就是用来管理文档和视图的。框架窗口是应用程序的主窗口,应用程序执行时会先创建一个最顶层的框架窗口。视图窗口是没有菜单和边界的子窗口,它必须包含在框架窗口中,即置于框架窗口的客户区内。

 

 

       文档模板

       文档模板中存放了与文档、视图和框架相关的信息。应用程序通过文档模板创建文档对象、框架窗口对象和视图对象。另外,文档、视图和框架之间的关系也是由文档模板来管理的。

       我们来看看Example34单文档程序中,CExample34App应用程序类的成员函数CExample34App::InitInstance()创建并注册文档模板的部分:

C++代码
BOOL CExample34App::InitInstance()   
{   
    ......略   
    // Register the application‘s document templates.  Document templates   
    //  serve as the connection between documents, frame windows and views   
    CSingleDocTemplate* pDocTemplate;   
    pDocTemplate = new CSingleDocTemplate(   
        IDR_MAINFRAME,   
        RUNTIME_CLASS(CExample34Doc),   
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window   
        RUNTIME_CLASS(CExample34View));   
    if (!pDocTemplate)   
        return FALSE;   
    AddDocTemplate(pDocTemplate);   
  
    ......略   
  
    return TRUE;   
}  
 

       在构造文档模板类CSingleDocTemplate的对象时,第一个参数是资源ID IDR_MAINFRAME,它包括框架窗口图标等,后面的三个参数都是RUNTIME_CLASS宏的调用,RUNTIME_CLASS用于获取类的运行时信息,文档模板可以根据这些动态创建信息来创建相应类的对象,即文档对象、框架窗口对象和视图对象。AddDocTemplate函数用来注册文档模板对象。

 

 

       框架类、文档类和视图类

       在VS2010自动生成的代码中,框架类继承于CFrameWndEx类,文档类继承于CDocument类,视图类继承于CView类。

       CFrameWndEx类又继承于CFrameWnd类,CFrameWnd类中用于管理文档和视图的成员函数包括:

       virtual CDocument* GetActiveDocument( );

       获得当前活动视图对应文档对象的指针,如果不存在则返回NULL。

       CView* GetActiveView( ) const;

       获得当前活动视图对象的指针,如果不存在则返回NULL。

       void SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);

       设置活动视图。参数pViewNew为要激活的视图对象的指针,参数bNotify指定视图是否接收激活通知。

 

       CDocument类的主要成员函数:

       virtual BOOL OnNewDocument( );

       创建新文档。可以重载使用。

       virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

       打开文档。参数lpszPathName为要打开的文档的路径。可以重载使用。

       virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);

       保存文档。参数lpszPathName指定文档保存到的全路径。可以重载使用。

       CDocTemplate* GetDocTemplate( ) const;

       获取此文档类型对应的文档模板对象的指针。如果此文档没有被文档模板管理则返回NULL。

       virtual POSITION GetFirstViewPosition( ) const;

       获取文档中视图列表的第一个视图的位置。

       virtual CView* GetNextView(POSITION& rPosition) const;

       利用此函数可以迭代处理文档的所有视图。参数rPosition为上一次调用GetFirstViewPosition或GetNextView成员函数返回的POSITION值的引用。

       void AddView(CView* pView);

       为文档增加一个视图。参数pView为要增加的视图对象的指针。

       void RemoveView(CView* pView);

       移除某个视图与文档的关联。参数pView为要移除的视图对象的指针。

       void UpdateAllViews(CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL);

       在文档被更改后调用此函数更新视图。参数pSender指向修改文档的视图,实际应用时常用来指定哪个视图不需要更新,如果更新所有视图则设为NULL,参数lHint包含了文档修改的信息,参数pHint指向存储文档修改信息的对象。

 

       CView类中与文档/视图结构相关的成员函数包括:

       CDocument* GetDocument( ) const;

       获取视图关联的文档对象的指针。如果视图没有关联到文档上则返回NULL。

 

以上是关于VS2010-MFC(文档视图和框架:概述)的主要内容,如果未能解决你的问题,请参考以下文章

VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

VS2010-MFC(VS2010应用程序工程中文件的组成结构)

(转载)VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)

VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

(转载)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

VS2010/MFC编程入门教程之目录和总结