本文主要介绍: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);//关闭文档后保存
}