理解MFC 文档、视图、框架[转]


理解文档/视图框架
                                     出处.雷神

了解文档和视图的相互作用关系是编写MFC程序的基本功。但是MFC的应用程序框架把文档和视图之间的关系封装了起来,初学的朋友往往不得要领,因此写程序往往被局限于在用向导生成的框架中。本文希望能够尽可能说明白文档视图框架之间是如何进行作用,希望能给一些朋友带来小小的帮助。  
  几个概念:  
  (虽然大家都知道了,雷神还是要重申一次)  
  文档对象:是用来保存数据的。  
  视图对象:是用来显示和编辑数据的。  
  应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。  
  文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:  
   
  BOOL   CMyHtmlApp::InitInstance()  
  {  
  //。。。。。。  
  CSingleDocTemplate*   pDocTemplate;  
  pDocTemplate   =   new   CSingleDocTemplate(  
  IDR_MAINFRAME,  
  RUNTIME_CLASS(CMyHtmlDoc),  
  RUNTIME_CLASS(CMainFrame),            
  //   main   SDI   frame   window  
  RUNTIME_CLASS(CMyHtmlView));  
  AddDocTemplate(pDocTemplate);  
  //。。。。。。  
  }  
   
  单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。  
  多文档:就是你可以打开多个文件,和文档类型也无关。你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。  
   
  何时需要文档/视图框架结构?  
  首先你可以不使用文档视图这种框架结构,即便是在MFC中。你可以在你需要的时候选择使用这种方式。你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。  
  哪什么时候需要呢?  
  当你想将你的数据层和界面层分开的时候。  
 通常我们对数据的操作放在文档类中,例如存取,打开,关闭。在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新,那么程序会将你对数据所做的改变呈现给你的程序的用户。由此可见视图的作用就是提供一个用户和数据之间进行数据交换的界面,它的作用就是在需要的时候显示数据,并在需要的时候提供输入界面。当用户输入后实际的数据操作工作是由文档类来做的。那框架类有在做什么呢?  
 框架类是为了便于管理你的文档类和视图类而存在的。通常我们的操作都是通过视图窗口完成,消息由视图进行接收并且进行处理。所以消息映射定义一般在视图中。但如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。另外框架窗口可以方便的处理非窗口消息。

再来说一边典型的单文档程序的生成过程(不完整,只挑有用的)  
  1、   CwinApp对象被建立,这个对象是全局的且只能有一个,名字叫theApp。这时你可以完成一些工作,例如对注册表的操作,(如果你想写一个不修改注册表的软件,需要在这里做写工作)  
  2、   在InitInstance()函数中创建文档模板,文档模板以CruntimClass静态成员指针做构造参数。  
  3、   执行MFC框架默认的命令行参数。命令行参数有很多其中之一是,Cmd1它会创建一个新文件。(如果没有命令行参数则执行默认的ID_FILE_NEW)  
  4、   文档模板的实例根据三个类的动态创建信息创建出文档、视图、框架。  
  5、   对文档、视图、框架进行初始化。  
   
  我们对文档,视图,框架如何产生以及他们的用途有了一定的了解,如何有效的使用它们呢。  
     文档,视图,框架之间的相互作用。  
 由上面的典型的单文档程序的生成过程可以看出一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd框架类,CDocument文档类,CView视图类。我将四个类常用的成员函数列出,大家一看便知。不过参数,返回值均未列出,大家可以从MSDN上了解更多。几个重要的虚函数也未做说明。大家自己看吧。

通过全局函数AfxGetApp可以得到CWinApp应用类的全局对象theApp.  
  CwinApp  
  数据成员:  
  m_pszAppName   应用程序名称  
  m_pszExeName   可执行文件的名称  
  m_pszProfileName   INI文件的名  
  m_pszRegistryKey   注册表或INI文件的KEY
 
  m_hInstance   实例的句柄  
  m_pMainWnd   为框架窗口指针  
  成员函数:  
  InitInstance()     //初始化  
  ParseCommandLine()   //完成命令行的解析处理  
   
  CFrameWnd  
  GetActiveDocument()   //得到当前活动文档指针  
  GetActiveView()   //得到当前活动视指针  
  SetActiveView()   //设置当前视图为活动视图  
   
  CDocument  
  OnNewDocument()  
  OnOpenDocument()  
  OnSaveDocument()  
  OnFileClose()  
  //以上是用来对文档的操作  
  GetFirstViewPosition()   //文档对象链表中的第一个文档位置  
  GetNextView()   //下一个  
  //以上是用来遍历所有和文档关联的视图  
  GetDocTemplate()得到文档模板指针  
  AddView()   //增加一个视图  
  RemoveView()   //删除一个视图  
  UpdateAllView()   //更新所有视图  
   
  Cview  
  GetDocument()得到对应的文档指针    
   
  其他的就不列出了,大家还是看MSDN。你可以直接查看CWinApp应用类,CFrameWnd框架类,CDocument文档类,CView视图类的类成员。  
   
   
  最后说说几个常见到的问题。  
  1、   为什么在对话框的应用程序中没有发现文档模板?  
  默认的对话框程序没有使用文档/视图框架结构。  
   
  2、   如果我使用数据库作为数据源是否意味着可以不需要文档类?  
  看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用。

理解MFC 文档、视图、框架[转]

时间: 2024-08-09 22:01:41

理解MFC 文档、视图、框架[转]的相关文章

MFC 文档/视图

1.文档修改后,关闭时需要保存,主要用到2个函数,在需要更改文档内容的函数里调用SetModifiedFlag(TRUE),另一个就是SaveModified()函数,简单的例子: BOOL CMFC_Doc::SaveModified() { // TODO: 在此添加专用代码和/或调用基类 return CDocument::SaveModified(); } void CMFC_Doc::SetColor() { m_color=RGB(0,0,0); SetModifiedFlag(TR

MFC文档、视图和框架

文档.视图.框架 文档/视图结构是MFC提供的一种不错的设计,它将数据的处理和显示分开来,这样更便于我们对程序的维护和扩展. 文档 文档对象用于管理和维护数据,包括保存数据.取出数据以及修改数据等操作,在数据被修改以后,文档可以通知其对应的所有视图更新显示. 文档类继承于CDocument类,主要成员函数: virtual BOOL OnNewDocument( ); 创建新文档.可以重载使用. virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

MFC 文档view视图中根据鼠标指定的某个区域控制延迟显示tip的方法(原创)

前言 在处理文档视图中,有时候需要根据鼠标指定的位置显示相应的提示信息,对于软件功能优化设计,此功能很有必要. 一. 一般处理方法 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法.一般用法步骤: 1.添加CToolTipCtrl成员变量 m_ToolTip. 2.在父窗口中调用EnableToolTips(TRUE); 3.在窗口的OnCreate(或者其他适当的位置)中向ToolTip中

mfc创建文档视图过程

一.如何创建文档视图界面: 创建新的文档视图界面,只需要调用CDocTemplate::OpenDocumentFile(strpath)即可.(strpath为要打开的文档路径,如果是NULL,则生成新的文档). 二.上面这个函数为何能够生成文档视图对象? 因为 1.它调用了CDocTemplate::CreateNewDocument()函数生成了CDocument对象: 2.它调用了CDocTemplate::CreateNewFrame()函数生成了CFrameWnd对象: 3.在生成文

8.MFC多文档视图构架程序

一.多文档视图构架程序 1.相关问题 可以同时管理多个文档(可以有多个文档类对象) 2.相关类 CWinApp / CDocument / CView / CMIDChildWnd / CMIDFrameWnd CDocTemplate CMultiDocTemplate - 多文档模板类 CDocManager - 文档管理类

7.MFC单文档视图构架程序

一.单文档视图构架程序 1.相关问题 只能管理一个文档(只有一个文档类对象) 2.相关类 CWinApp / CFrameWnd / CView / CDocument CDocTemplate - 文档模板类 CSingleDocTemplate - 当文档模板类 CDocManager - 文档管理类 3.关系图

文档/视图结构详细介绍

以单文档界面(SDI)应用程序为例,介绍MFC的文档/视图程序结构. 学习要求 理解文档/视图结构,可在AppWizard生成的SDI程序框架的基础上添加必要的代码,以生成自己的应用程序. 授课内容 大部分应用程序均要使用数据,其主要工作可以分为两部分:一是对数据的管理,如存储.复制和查询等任务,一是对数据的处理和输入输出,包括显示和打印.MFC提供了“文档/视图”结构支持这类应用程序. 12.1文档/视图概念 在文档/视图结构里,文档可视为一个应用程序的数据元素的集合,MFC通过文档类提供了大

文档/视图结构的应用

用Visual C++的MFC AppWizar生成的函数,一般是"文档/视图"结构的. 在这种程序结构中,文档对象和视图对象的分工是十分明确的,文档对象用来存储.管理和维护数据,而视图对象用来显示和操作数据. 所以,在文档/视图结构的应用程序中,一般要在文档类的声明中定义数据对象,在文档类的构造函数中初始化数据对象,而对数据对象的操作和显示则在视图类对象中完成. 为了在视图对象中,对文档对象的成员进行访问,视图类提供了一个成员函数GetDocument,它的原型为: CDocumen