文档视图结构中,定制其行为的一次实践


在使用文档视图结构时,有时框架提供的默认功能,与我们希望的功能不一致,这时我们就要改变框架的默认行为,改变的方法就是在继承的类中,重载基类的虚拟函数来实现。本文就是一次实践的经历。
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值