林欣甫无法拒绝的长大:理解MFC文档/视图框架

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 06:25:13
[转]理解MFC文档/视图框架 by 雷神2008年06月13日 星期五 下午 10:03 了解文档和视图的相互作用关系是编写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、     如果我使用数据库作为数据源是否意味着可以不需要文档类?
看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用。
.net下c++,mfc 文档/视图结构 单文档多视图结构怎么创建? MFC单文档视图中如何生成类似对话框中的控件啊?谢谢大侠了!! c++,mfc中的视图怎样保存? 文档与视图的区别 关于MFC单文档画图 怎样在MFC中首先启动视图类窗口?? MFC的框架上总是有MFC这个图标,怎样才能改变? Word文档中,普通视图、Web版式、大纲视图、页面视图有何区别? 当启动Word时,什么 视图是其默认的文档视图 在word文档中使用主控文档视图和使用文档的超级链接有什么区别? word 文档预览有空白页,但普通视图状态看不见 WTL的单文档中怎么显示2个视图? 关于VC-MFC单文档菜单的问题 关于VC-MFC单文档画图的问题 MFC中怎么在单文档中导入对话框 使用mfc怎样使框架窗口在开始显示时就最大化? 写出html文档框架代码,它分几部分? 一个MFC程序,文档类的析构函数在什么时候执行啊?关闭文档时? 在VC/MFC中,什么是加速键,它的作用是什么?怎么理解?怎样在MFC中找到它? word文档在页面视图中显示内容不全,而在普通视图、大纲视图中则能显示全部内容,请教各位是什么原因? 1、请简述Word中各种视图在文档编辑中的作用. 1.请简述Word中各种视图在文档编辑中的作用。 急!求WORD文档中四种视图模式的区别和特征 在Word2003下,使用文档结构视图时,如何改变其中字的颜色?