MFC单文档工程文档及序列化

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、修改文档标题:(以下都是在MFC单文档工程Graphic下)

1、单击【文件/新建】菜单项,或者程序启动时,程序会进入到CGraphicDoc类的OnNewDocument函数,该函数是【文件/新建】命令处理的一部分,是由框架调用的一个虚函数,用于建立一个文档。通过该函数设置程序标题:

BOOL CGraphicDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

SetTitle("MY MFC");//设置程序标题为MY MFC。

return TRUE;

}

提示:当单击保存时,默认文件名会是设置的文档名。

2、通过IDR_MAINFRAME字符串资源修改文档标题

在ResourceView选项卡下->展开String Table文件夹->双击String Table字符串资源->找到ID 为IDR_MAINFRAME的字符串资源->在头两个”\n”间添加文档标题。

符串资源的各个子串。实际上利用MFC AppWizard生成应用程序框架的第四步,单击【Advanced】按钮也可以修改IDR_MAINFRAME字符串中的子串。

3、OnNewDocument函数的调用过程

OnNewDocument函数并不是一个消息响应函数,它只是一个虚函数。

(1)、程序启动时OnNewDocument函数的调用过程,第一次启动程序时,在OpenDocumentFile

函数内部创建了文档类对象,同时还创建了框架类对象和视类对象。这就是MFC提供的文档/视类结构的一个特点:每当有一份文档产生时,总是会产生一个文档类对象、框架类对象和视类对象,它们三位一体来为这份文档服务。

提示:当程序运行时,MFC框架内部接受的无论是文档类指针、框架类指针,或者视类指针,它们都是指向派生类的指针。也就是说,pDocument对象的OnNewDocument函数是CDocument类的子类CGraphicDoc类的OnNewDocument函数调用。

(2)、新建菜单命令调用OnNewDocument函数的过程:

提示:对于单文档类型的应用程序来说,CSingleDocTemplate的OpenDocumentFile函数会重复的利用已创建的框架类对象、文档类对象和视类对象。而如果是多文档类型的应用程序,则此时还是会去创建一个新的文档类对象、框架类对象和视类对象。

二、文档类的Serialize函数:

文档类负责管理数据,提供对数据的保存和加载;视类负责显示数据,为用户提供编辑数据和修改数据的功能。Serialize函数(一般在Doc类下,如:CGraphicDoc)是文档类提供的用来保存和加载数据的函数。当保存或打开不同文件时都会进入到该函数。

1、Serialize函数实现文件的写入和读取:

void CGraphicDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())//若是保存命令

{

int i=5;

char ch='b';

float f=1.2f;

CString str("Hello MFC!");

ar<

}

else

{

int i;

char ch;

float f;

CString str;

CString strResult;

ar>>i>>ch>>f>>str;

strResult.Format("%d,%c,%f,%s",i,ch,f,str);

AfxMessageBox(strResult);

}

}

注意:单击【文件/保存】菜单项,保存文件名a.txt,然后单击【文件/打开】菜单项打开刚保存的a.txt,发现并未显示数据。原因分析,当保存数据时,先前创建的文档类的对象就与该数据关联在一起了,表示了该数据;当再次打开刚保存的文件时,在MFC框架内部,它判断出这是同一份数据,并且和这个数据相关联的文档类对象的指针已经存在了,它就不会再去调用文档类的Serialize函数了,所以刚才我们在打开同一份文档时就没有进入CGraphicDoc类的Serialize函数。详细如下,CDocManager的OpenDocumentFile函数中运行到MatchDocType函数时,发现pOpenDocument这个指针有值了(指向CGraphicDoc类型),也就是说,程序发现这个文件已经与先前的一个文档对象相关联了,那么CDocManager将直接返回pOpenDocument这个指针,这个函数的执行就结束了,它没有调用CSingleDocTemplate类的OpenDocumentFile函数,也就没有调用CDocument的Serialize函数,当然其子类CGraphicDoc的Serialize函数也就没有被调用。

说明:对单文档来说,文档对象本身并不会销毁,它只是将数据清空,然后再与一个新的文件相关联。

2、文件打开菜单命令项调用Serialize函数的过程:

(1)、在单击【文件/打开】菜单命令后,程序框架会激活”文件打开”对话框,让用户指定将要打开的文件,然后程序自动调用CGraphicDoc类的Serialize函数读取该文件;程序框架还会调用CGraphicView类的OnDraw函数,传递一个显示DC,以便重新绘制窗口内容。【文

相关文档
最新文档