MFC中文档视图框架和文档模板之间的关系-程序员宅基地

技术标签: 数据结构与算法  数据库  

 文档对象:是用来保存数据的。
 视图对象:是用来显示和编辑数据的。

 应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。

文档模板:MFC把文档/视图/框架视为一体,只要你创建文档/视图框架结构的程序,必定会为你创建这三个类。这个工作在在应用程序初始化时完成,如下:

  •    1: BOOL CMyHtmlApp::InitInstance()
       2: {
           
       3:      //。。。。。。
       4:      CSingleDocTemplate* pDocTemplate;
       5:      pDocTemplate = new CSingleDocTemplate(
       6:          IDR_MAINFRAME,
       7:          RUNTIME_CLASS(CMyHtmlDoc),
       8:          RUNTIME_CLASS(CMainFrame),       // main SDI frame window
       9:          RUNTIME_CLASS(CMyHtmlView));
      10:      AddDocTemplate(pDocTemplate);
      11:      //。。。。。。
      12: }


    单文档:就是一次只能打开一个文件,和你的文档类型支持的多少无关。你完全可以做一个单文档的支持所有图象格式的程序,只不过它一次只能打开一个文档罢了。
    多文档:就是你可以打开多个文件,和文档类型也无关。你也可以作一个可以同时打开多个文档的程序,但它只支持一种文档类型。


    何时需要文档/视图框架结构?

    首先你可以不使用文档视图这种框架结构,即便是在MFC中。你可以在你需要的时候选择使用这种方式。你可以完成一个只有视图没有文档的程序,例如一个基于对话框的应用。
       

    哪什么时候需要呢?
    当你想将你的数据层和界面层分开的时候。
        通常我们对数据的操作放在文档类中,例如存取,打开,关闭。在这里你可以尽情的对你的数据进行操作,如果你需要,在对数据进行了改变后,对视图做一下更新, 那么程序会将你对数据所做的改变呈现给你的程序的用户。由此可见视图的作用就是提供一个用户和数据之间进行数据交换的界面,它的作用就是在需要的时候显示 数据,并在需要的时候提供输入界面。当用户输入后实际的数据操作工作是由文档类来做的。

      

    那框架类有在做什么呢?
    框架类是为了便于管理你的文档类和 视图类而存在的。通常我们的操作都是通过视图窗口完成,消息由视图进行接收并且进行处理。所以消息映射定义一般在视图中。但如果一个应用同时拥有多个视而 当前活动视没有对消息进行处理则消息会发往框架窗口。另外框架窗口可以方便的处理非窗口消息。
    再来说一边典型的单文档程序的生成过程(不完整,只挑有用的)
  •  
  • 1     CwinApp对象被建立,这个对象是全局的且只能有一个,名字叫theApp。这时你可以完成一些工作,例如对注册表的操作,(如果你想写一个不修改注册表的软件,需要在这里做写工作)
    2
         InitInstance()函数中创建文档模板,文档模板以CruntimClass静态成员指针做构造参数。
    3
         执行MFC框架默认的命令行参数。命令行参数有很多其中之一是,Cmd1它会创建一个新文件。(如果没有命令行参数则执行默认的ID_FILE_NEW
    4
         文档模板的实例根据三个类的动态创建信息创建出文档、视图、框架。
    5
         对文档、视图、框架进行初始化。
  •  
    •  
    • 文档,视图,框架之间的相互作用。
          由上面的典型的单文档程序的生成过程可以看出一个完整的应用一般由四个类组成:

      • CWinApp应用类,
      • CFrameWnd框架类,
      • CDocument文档类,
      • CView视图类。

      我将四个类常用的成员函数列出,大家一看便知。不过参数,

      返回值均未列出,大家可以从MSDN上了解更多。几个重要的虚函数也未做 说明。大家自己看吧。
      通过全局函数AfxGetApp可以得到CWinApp应用类的全局对象theApp.
      CwinApp

       

       

         1: 数据成员:
         2: m_pszAppName 应用程序名称
         3: m_pszExeName 可执行文件的名称
         4: m_pszProfileName INI文件的名
         5: m_pszRegistryKey 注册表或INI文件的KEY
         6: m_hInstance 实例的句柄
         7: m_pMainWnd 为框架窗口指针
         8: 成员函数:
         9: InitInstance()   //初始化
        10: ParseCommandLine() //完成命令行的解析处理
        11: CFrameWnd
        12: GetActiveDocument()     //得到当前活动文档指针
        13: GetActiveView()     //得到当前活动视指针
        14: SetActiveView()     //设置当前视图为活动视图
        15: CDocument
        16: OnNewDocument()
        17: OnOpenDocument()
        18: OnSaveDocument()
        19: OnFileClose()
        20: //以上是用来对文档的操作
        21: GetFirstViewPosition() //文档对象链表中的第一个文档位置
        22: GetNextView()         //下一个
        23: //以上是用来遍历所有和文档关联的视图
        24: GetDocTemplate()得到文档模板指针
        25: AddView()         //增加一个视图
        26: RemoveView()     //删除一个视图
        27: UpdateAllView()     //更新所有视图
        28: Cview
        29: GetDocument()得到对应的文档指针

      其他的就不列出了,大家还是看MSDN。你可以直接查看CWinApp应用类,CFrameWnd框架类,CDocument文档类,CView视图类的类成员。
      最后说说几个常见到的问题。

    • 1、为什么在对话框的应用程序中没有发现文档模板?
      默认的对话框程序没有使用文档/视图框架结构。

    •  2、如果我使用数据库作为数据源是否意味着可以不需要文档类?
      看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用。

     

       引用: http://blog.csdn.net/snoopy93/archive/2010/08/16/5815589.aspx

 

转载于:https://www.cnblogs.com/tianjinquan/archive/2011/01/18/1938568.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30408165/article/details/95144819

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签