回 帖 发 新 帖 刷新版面

主题:MFC学习进阶04

大家好,这是第四期。
在上一次,一位朋友说到视图,文档简单的讲就是一个类,只不过这个类有着前面我们所说的功能,可以改

善程序的结构。那我们先来看看这两个类:
1。文档类
文档类是由CDocument类派生出来的,CDocument类可以进行文档的创建,载入,储存等。下面讲几

个成员函数CDocument(),OnNewDocument(),OnOpenDocument(),OnSaveDocument();
CDocument()当然是一个构造函数,用来构造一个CDocument类,通常不用调用这个函数,因为文档

模板可以用来创建这个类对象。
OnNewDocument() 调用DeleteContents,保证文档为空,然后置新文档为空。可以重载该函数为运

用程序的文档类型初始化它的数据结构。
OnOpenDocument()用来打开指定的文件,先调用DeleteContents,保证文档为空,然后调用

CObject::Serialize读出文件内容,然后置文档为清洁。
OnSaveDocument()打开指定文件之后,调用CObject::Serialize,将文档写入文件。
以上都是我从专门的参考资料下抄的,不懂的话可以先放放。看来文档是用来管理文件的哈!

2。视图类
视图类是由CView类派生出来的,这个视图,是与文档联系起来,可以将用户的操作转化为对文档

的操作,比如说将用户的输入解释成文档的操作。(可以想象视图类一定有函数来与文档联系,可能是要取

得文档指针;还有必须有能将用户输入转化为文档操作的函数)
下面我又去找几个代表性的成员函数
GetDocument(),这个函数获得该视图的文档的指针。
我没有找到一个具体的实现把用户输入转化为文档的函数,但是我倒是看到很多关于打印的函数。
好,现在我们用我们前面学的东西来看看以文档/视图为结构的Skeleton程序,这个新的程序我们命名为
SkeletonDV。
下面看看文档对象的实现。
//file of skeletonDoc.h
#ifndef _SKELETONDOC_H_
#define _SKELETONDOC_H_
class CSkeletonDoc:public CDocument{

public:
CSkeletonDoc();
virtual ~CSkeletonDoc();
//好象这本书的代码都把这两个函数放到这个地方
public:
virtual BOOL OnNewDocument();
//这个函数初始化一个空文档
virtual void Serialize(CArchive&ar);
//这个函数用来保存文档

public:
#ifdef DEBUG
virtual void AssertValid()const;
virtual void Dump(CDumpContext&dc)const;
#endif
//这个是个新玩艺,查一查,把这两个函数放到DEBUG宏里时,只能编译到调试版本中,用户是看不到的。
所以里面的函数多半是用来检测用的。
//AssertValid通过对象的中间状态,执行有效性检查。什么叫有效性检查?
//Dump用来转储对象内容,以便检查它的中间状态。

protected:
DECLARE_MESSAGE_MAP()
DECLARE_DYNCREATE(CSkeletonDoc)
//如果我没有记错,这就是消息映射
};
#endif

下面是它的实现文件
//the file of SKeletonDoc.cpp

#include"StdAfx.h"
#include"SkeletonDoc.h"

#ifdef DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[]=__FILE__;
#endif

BEGIN_MESSAGE_MAP(CSkeletonDoc,CDocument)
END_MESSAGE_MAP()

IMPLEENT_DYNCREATE(CSkeletonDoc,CDocument)

CSkeletonDoc::CSkeletonDoc()
{};

CSkeletonDoc::~CSkeletonDoc()
{};

BOOL CSkeletonDco::OnNewDocument(){
if(!CDocument:OnNewDocument())
   return FALSE;

//初始化文档
//因为这是一个最简单的程序,所以没有其他代码。这里可以添加其他代码


    return TURE;
}

void CSkeletonDoc::Serialize(CArchive&ar)
{
if(ar.lsStoring()){
//保存文档
//这里添加代码
}
else
{
//添加代码以载入文档
}
}

#ifdef DEBUG
void CSkeletonDoc::AssertValid()const{
CDocument::AssertValid();
}
//这个函数可以检查自己的成员书句的完整性。因为这个类没有定义的成员数据,里面没有什么代码

void CSkeletonDoc::Dump(CDumpContext&dc)const{
CDocument::Dump(dc);
}
//这个函数用来转储对象的内容,因为类中没有什么自定义的成员函数,所以没有什么要转储的内容

#endif


以上就是文档类的实现,同志们可以多查点资料。好,这次就到这(明天要考试!不好意思)
下次的内容是视图类的实现了,下次见。

回复列表 (共2个回复)

沙发

Thank you!!!!

板凳

支持LZ写下去

我来回复

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