MFC中文档视图框架和文档模板之间的关系

来源:互联网 发布:钢筋抽料软件 编辑:程序博客网 时间:2024/05/16 18:47
文档对象:是用来保存数据的。
视图对象:是用来显示和编辑数据的。
应用程序框架:框架是用来管理不同文档显示界面的。例如你有一个数据网格显示界面,还有一个图形显示界面,它们的数据可能都来自你的文档,但是视图不同,怎么办用框架。为什么不用视图?为的是把界面管理独立的拿出来。
文档模板: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
     如果我使用数据库作为数据源是否意味着可以不需要文档类?

看你自己,但是我建议使用。因为可以文档,视图这一个清晰方便的框架结构,以及方便完成三者之间的相互作用。



转帖:http://blog.csdn.net/snoopy93/article/details/5815589

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩一年级不自觉做作业怎么办 小孩会读不会写怎么办 好多字都不会写怎么办 写作业怎么办才能写快 五周宝宝爱玩不写字怎么办 爱玩手机的小孩怎么办? 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办 4岁宝宝不写字怎么办 四岁宝宝不写字怎么办 孩子学习粗心计算能力差怎么办 一年级的小朋友不爱看书怎么办 马上要生了害怕怎么办 孩子做题不爱读题怎么办 孩子作业写的慢怎么办 孩子学习不好怎么办我们有绝招 英语不会做题怎么办呢? 小学二年级孩子厌学怎么办 狗狗拉肚子不吃东西怎么办 小孩做作业时容易发呆怎么办 一上高速就犯困怎么办 孩子初中数学学不好怎么办 高三注意力不集中怎么办 考砸了家长打我怎么办? 高三学生困疲劳怎么办 高三晚上很困怎么办 孩子上高三压力大不想上学怎么办 高三的孩子压力大怎么办 高三复读压力大怎么办 孩子一年级做数学粗心怎么办 一年级的孩子数学总粗心怎么办 天生手脚笨的人怎么办 高三的孩子厌学怎么办