回 帖 发 新 帖 刷新版面

主题:MFC学习进阶03

先跟大家说声抱歉,昨天晚上我不知道怎么回事,老是登陆不上,所以今天才来。

好,这是第三期。在上一次中提供了一个运用程序的框架给大家,如果大家暂时看不懂,没关系。只要知道一个程序的运行流程就行了,开始由WinMain()函数调用InitInstance()进行初始化,然后剩下的交由“消息映射机制”来处理用户的输入。

好,这一期的主题是“文档/视图结构”(我也不太明白为什么提供这么一个概念)

书上说,这是为了学习以文档为中心的运用程序开发方法(这个方法有什么用啊,还有啊,我们上一个程序是不是一文档为中心的运用程序呢,看来不太象。不管,继续)

看一看以文档为中心的概念:
以文档为中心是将运用程序数据和用户界面分开,让开发者分别描述运用程序和显示数据。(还是不明白,难道是运用程序数据放到一个文件里面,要显示数据时才去拷贝,不明白)
然后书上用了一个例子来说明:用一个字处理运用程序来理解,比如写字板,如果用户双击了a.doc,随着a.doc的打开,写字般的一个实例被创建。(难道说是a.doc一个数据是交由文档来管理的,而不是运用程序)
视图是根据文档的不同而改变的。(看来是有点眉目了,比如说,一个运用程序用多种功能,可以打开文档和图片,当文档类型不同,运用程序的视图也不一样,打开图片时显示一种视图,打开文档时显示另一种视图。文档,视图有一种对应关系)文档是一幅图像的时候,视图允许对他进行修改。看来视图是根据不同的文档来提供相应的服务,即视图。视图只是与用户交互的一种工具。我还想到一个例子,当多个程序同时用一个文件时,当一个程序修改了这个文件时,另一个程序会提示是否要重新载入。我想这也应该是文档/视图结构吧。
书上还说,载入和保存文档是文档的任务,看来文档也不是那么简单的把数据放到一起了。还提供了对文件进行处理的功能。
看来真的有点眉目了,文档是对数据进行处理,而视图则是与用户交互。文档可以和视图交互。
MFC 以文档为中心的程序使用文档模板将文档,视图和运用程序窗口框架关联起来。(注意:视图并不是指窗口图形界面,不应该包括菜单)。运用程序先创建文档,视图,窗口框架类,然后创建文档模板把他们联系起来(看来视图和文档并不是直接交互,还有文档模板做桥梁。但是,它们之间到底是怎么联系的呢?是有一套通信规则,还是提供了一系列函数来调用相应功能?不晓得。上一个程序并没有创建什么文档模板,看来不是视图/文档的程序)

下面一节,来的是MFC应用程序结构,好像前面也有说过这个问题,不过听书上的口气,书上要详细介绍Skeleton程序。

不管是不是以文档为中心,MFC程序都有以下部分:
一个运用程序对象,一个主窗口框架用户界面元素,和数据资源。

其实各部分的作用我们前面都知道了,但是我想到了一个比方:运用程序相当于一个副校长,在幕后控制着一切活动,校长相当于主窗口,外当家,是与外界交往的主角;而数据资源就是后勤部长。

然后看看对运用程序对象的深入讨论,我们看看与我们以前的看法有什么不对的地方?
运用程序创建对象的目标是控制程序的初始化,运行和终止。在封装的WIN32函数WinMain()的外部,对象提供了几个重要的成员函数:
InitInstance(),Run(),OnIdle(),ExitInstance()
到底WinMain函数被封装到哪里了?查了一下,结果不是类的成员函数,可能在头文件中?其中函数之间的关系为:

                             ___________InitInstance()
                                        


                     WinMain()___________Run()____________OnIdle()


   
                              ___________ExitInstance()

由图可以知道,WinMain()一直运行在后台,然而对象通过成员函数实现对WinMain的访问,也就是说WinMain()在后台并不是控制程序,而是作为一个工具。

InitInstance在WinMain启动不久,对运用程序对象的每一个实例进行初始化,这时运用程序按需要重载InitInstance,通常用来创建对象窗口,设置继承的数据成员m_pMainWnd.(这个继承数据成员到底在什么地方呢?他有什么作用呢?)

Run()函数
在Win32 API中,WinMain()用大量的消息循环来接受用户的操作,然而在MFC中,不是WinMain,而是Run()来完成这个任务,来接受用户输入。
当很就没有用户输入时,Run()调用OnIdele()重载让程序进行后台任务。
当要退出时Run()调用ExitInstance()来结束程序


看来这次还是有收获:
WinMain()函数一直存在,其他函数可以调用WinMain(),而不是象c语言中用main()控制程序。
好,这次初步了解文档/视图为中心的程序的概念,下一次会用这个概念再次学习Skeleton程序。

回复列表 (共11个回复)

沙发

作者留个联系方式吧!渴望交流会!!我的QQ:5688274  EMAIL:ich32@sina.com

板凳

简单地说文档与视图都是类 文档类的用途是新建、打开、读写、关闭数据文件  当然是方法  而视图类的方法使用户采用树形、列表等方式查看那些数据文件的内容。

3 楼

我的QQ是109312700,email是dasanlang_1983@mail.china.com

4 楼

谢谢楼上兄台的支持!

5 楼

文档CDocument,视图CView,框架CFrameWnd,类的关系:
    文档CDocument类是处理数据的类
    CView是处理用户和数据之间关系的类,一是根据用户输入改变数据; 二是根据数据不同来显示不同的视图供用户编辑,它是一个桥梁.
    CFrameWnd是一个框架类,是用来包括视图和诸如工具栏一类东西的类,也是程序的用户接口;
    三个类是通过CDocumentTemplate来联系并构建的,大家可以在每一个支持VIEW/DOCUMENT的程序中的CWINAPP::INITINSTANCE()中看到这个函数;

6 楼

讲的好,透彻得很.
我想到,如果把应用程序比喻成一台可以使用的电视机的话:
 CView类的对象是我们看到画面的屏幕,它负责把画面显示出来
 CFramWnd类的对象是电视机的外壳,用来固定显示屏幕,还安装一些调节按钮
 CDocument类的对象是电视节目,当然这个节目是通过电波及时传播来的,电视机接受器里一定有个暂时的信心存储器,我们可以认为存储器里的信息(节目)就是CDocument类的对象.

7 楼

谢谢楼主!!!1

8 楼


楼主电视机的比喻很精妙

9 楼

今天看了一下《深入浅出MFC》,主函数貌似被封装到MFC的链接库里面了,相当于主函数编程了一个库函数,链接时会自动加载,而不必我们自己写主函数。详细信息可参看《深入浅出MFC》第三章,隐晦不明的WinMain。感觉《深入浅出MFC》也还不错,介绍了从WinAPI程序到MFC程序过渡过程及方法,可惜的是太老了,讲的还是VC5,MFC 4.2。
初步感觉MFC杂合了许多(C++认为已经过时并且不推荐使用的)C语言的东西,算不上纯正的C++库,强制类型转换最明显。不知道新版的MFC还是不是如此。

10 楼

lz好文章,6楼的朋友的比喻实在是太贴切了.谢谢...

我来回复

您尚未登录,请登录后再回复。点此登录或注册