MFC实现文件的自动保存

本文主要介绍:MFC中,在文件操作完成后,实现对操作结果自动保存。

自动保存有两种:一种是每步操作完成后,都进行自动保存;另一种是不在每步操作完成后保存,在文件关闭后自动保存。

要实现文件的自动保存,需要了解 File->Save的响应过程,因此请参考博文:

http://blog.csdn.net/hong__fang/article/details/41145141


由此可知,保存过程调用的函数依次为:CDocument::OnFileSave() 

                                                               CDocument::DoFileSave() 

                                                               CDocument::DoSave(LPCTSTR lpszPathName, BOOL bReplace)   

                                                               CDocument::OnSaveDocument(LPCTSTR lpszPathName)  

下面详细介绍如何实现这两种自动保存功能:

注:为了便于说明,以vc6.0 MSDN中一个关于图像打开例子DIBLOOK为例,进行解说。其中:dibdoc.cpp和dibview.cpp分别对应 “***Doc.cpp”和”***View.cpp“;文档类CDibDoc 和视图类CDibView分别对应”C***Doc“和”C***View“类(*** 代表工程名)。

一、每步操作完成后自动保存

      每步操作完成后都能实现自动保存,只需要在每次操作的最后,调用保存函数即可。

      由保存函数的响应过程可知,可以调用最后一个响应函数 OnSaveDocument(LPCTSTR lpszPathName)实现自保存,也可以调用DoFIleSave()函数来实现自保存。

1.调用OnSaveDocument(LPCTSTR lpszPathName)实现自保存

该响应函数在 dibdoc.cpp文件中,要进行重载,因为我们需要根据自己实现的功能来,编写相应的保存函数。

(1)首先,在dibdoc.h中声明OnSaveDocument(LPCTSTR lpszPathName)函数,注意声明为公有类public,因为要在***View.cpp中调用保存函数,进行每一步保存。

public:
	virtual ~CDibDoc();
	virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);

(2)然后,在dibdoc.cpp中编写保存函数,现在以位图为例说明,所以下面是位图保存的程序:

BOOL CDibDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
	CFile file;
	CFileException fe;
	if (!file.Open(lpszPathName, CFile::modeCreate |
	  CFile::modeReadWrite | CFile::shareExclusive, &fe))
	{
		ReportSaveLoadException(lpszPathName, &fe,
			TRUE, AFX_IDP_INVALID_FILENAME);
		return FALSE;
	}
	...//具体程序省略
	...
	...
	return bSuccess;
}
(3)最后,在每次操作的最后调用保存函数  OnSaveDocument(LPCTSTR lpszPathName)。由于操作程序一般在View视图类中,所以需要在***View.cpp中调用:

void CDibView::OnTest() 
{
	// TODO: Add your command handler code here
	CDibDoc* pDoc = GetDocument(); 
	...
	...//处理程序
	...
	CString strPathName(pDoc->GetPathName());//获取当前打开文件的路径
	pDoc->OnSaveDocument(strPathName);//调用保存函数进行保存
}

2.调用DoFIleSave()函数实现自保存

调用该函数,还是需要重载OnSaveDocument(LPCTSTR lpszPathName)函数,来编写自己的保存函数,所以重载过程与上面的相同。在View视图类中,调用方式如下:

void CDibView::OnTest() 
{
	// TODO: Add your command handler code here
	CDibDoc* pDoc = GetDocument();
	...
	...//操作程序
	...
	pDoc->DoFileSave();	//调用保存函数
}

二、在文件关闭后自动保存

由于在点击File->Close 或点击红叉关闭文件时,CDocument::OnFlieClose()函数和CDocument::CanCloseFrame()函数,都会调用CDocument::SaveModifiedFlag()函数来判断是否进行保存,所以可以在***Doc.cpp中,重载该函数,通过该函数调用DoFileSave()来实现自保存。

(1)首先,在dibdoc.h中声明该函数:

public:
	virtual ~CDibDoc();
	virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
	virtual BOOL SaveModified() ;

(2)然后,在dibdoc.cpp中,编写该函数响应程序:

BOOL CDibDoc::SaveModified()   
{  
    if( !IsModified() )  //IsModified()返回FALSE,则不进行保存,直接销毁窗口
        return TRUE;    
  
    return DoFileSave();  //IsModified()返回TRUE,则调用保存函数
}  

(3)最后,在每步操作的最后,设置IsModified的返回值,如果设置成 TRUE,则在关闭文档时,对该操作结果进行保存:

void CDibView::OnTest() 
{
	// TODO: Add your command handler code here
	CDibDoc* pDoc = GetDocument();
	...
	...//操作程序
	...
	pDoc->SetModifiedFlag(TRUE);//关闭文档后保存
}


你可能感兴趣的:(MFC,MFC,自动保存,文件关闭自动保存,每步自动保存,自保存)