在使用文档视图结构时,有时框架提供的默认功能,与我们希望的功能不一致,这时我们就要改变框架的默认行为,改变的方法就是在继承的类中,重载基类的虚拟函数来实现。本文就是一次实践的经历。
1.程序开始运行时,我希望程序试图打开当前程序路径下的某个文件可以这样做:
在CXXXApp::InitInstance()中的CCommandLineInfo cmdInfo;行后插入代码行:
cmdInfo.m_nShellCommand=CCommandLineInfo::FileOpen;
cmdInfo.m_strFileName="要打开的文档(带路径)";
2.当打开的默认的文档不存在时,新建文档,并给新建的文档赋予名字:
重载CDocument::OnOpenDocument,把CDocument::OnOpenDocument的实现拷贝到CXXXDoc::OnOpenDocument中,进行必要的修改,如下:
BOOL CXXXDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (IsModified())
TRACE0("Warning: OnOpenDocument replaces an unsaved document.\n");
CFileException fe;
CFile* pFile = GetFile(lpszPathName,
CFile::modeRead|CFile::shareDenyWrite, &fe);
if (pFile == NULL)
{
return OnNewDocument();
}
DeleteContents();
SetModifiedFlag(); // dirty during de-serialize
CArchive loadArchive(pFile, CArchive::load | CArchive::bNoFlushOnDelete);
loadArchive.m_pDocument = this;
loadArchive.m_bForceFlat = FALSE;
TRY
{
CWaitCursor wait;
if (pFile->GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive.Close();
ReleaseFile(pFile, FALSE);
}
CATCH_ALL(e)
{
ReleaseFile(pFile, TRUE);
DeleteContents(); // remove failed contents
return FALSE;
}
END_CATCH_ALL
SetModifiedFlag(FALSE); // start off with unmodified
return TRUE;
}
3.当文档修改后,退出程序时,希望自动保存而不希望弹出输入文件名的对话框和提示保存的对话框。
重载CDocument::SaveModified和CDocument::DoFileSave,并拷贝其中的代码到重载的函数中进行适当修改,
BOOL CXXXDoc::SaveModified()
{
if (!IsModified())
return TRUE; // ok to continue
// If so, either Save or Update, as appropriate
if (!DoFileSave())
return FALSE; // don't continue
return TRUE; // keep going
}
BOOL CXXXDoc::DoFileSave()
{
if (!DoSave(m_strPathName))
{
TRACE0("Warning: File save failed.\n");
return FALSE;
}
return TRUE;
}