遇到的问题

问题: 用MFC AppWizard *.exe生成的多文档视图结构的程序中,当点击File菜单中的Open项时,程序将要调用应用程序类的CWinApp::OnFileOpen函数,请问该函数按照先后次序具体执行了哪些行为?这与当点击New项调用CWinApp::OnFileNew函数所执行的功能中哪些相同,哪些不同?

 CWinApp::OnFileOpen函数大概执行以下步骤: 
    1、提示用户选择文件; 
    2、选择一个匹配的文件模板; 
    3、创建文档、框架和视类; 
    4、打开文件; 
    5、将该文件和档案(CArchive)联系起来; 
    6、调用Serialize。 
    而OnFileNew不执行1、2、4、5几步,其他相同。具体的代码可以参考MFC/Src目录中的源程序。 
    如果你想实现OnFileOpen是为了读你自己定义的文件,一般不重载OnFileOpen,而是在Doc类的Serialize中写代码。如果不习惯CArchive类,也可以直接重载OnOpenDocument(它是Serialize的父函数)。这方面的例子可以参考VC++的diblook。 
    如果你只是想显示一个与众不同的选择文件的对话框,一般需要重载OnFileOpen。大致的步骤是: 
    void CYourApp::OnFileOpen() 
     CString newName; 
     if(!ShowYourDialog(newName)) 
     return; // 显示你的对话框 
     OpenDocumentFile(newName); 
    } 
    你只需要实现ShowYourDialog(newName)就可以了

原文:http://www.china-askpro.com/msg39/qa21.shtml

 

 

 一.创建文档   
  ON_COMMAND(ID_FILE_NEW,CWinApp::OnFileNew)   
  入口:CWinApp::OnFileNew   
  调用:CdocManager::OnFileNew()   
  1.判断有无文档模板,无则函数返回;   
  2.判断是否有多个文档模板,如有则启动文档模板选择对话框,   让用户选择一个模板后,返回模板指针.   
  3.由模板指针访问CMultiDocTemplate::OpenDocumentFile()   
  31.创建新文档对象   
  32.创建与新文档对象对应的子框架,构筑子框架,文档和视窗之间的关系   
  33.调用应用程序的OnNewDocument()   
  a.调用CDocument::OnNewDocument()   
  调用应用程序的DeleteContents();   
  b.用户代码   
  34.调用InitialUpdateFrame()显示视窗   
  35.返回文档指针   
  4.返回   
    
  二.打开文档   
  ON_COMMAND(ID_FILE_OPEN,CWinApp::OnFileOpen)   
  入口:CWinApp::OnFileOpen   
  调用:CDocManager::OnFileOpen()   
  1.弹出对话框让用户选择待打开的文件,返回该文件的全路径名称,   供下面函数调用时使用.   
  2.调用应用程序的OpenDocumentFile(LPCTSTR   lpszFileName)   
  21.用户代码   
  22.调用CWinApp::OpenDocumentFile(lpszFileName),   
  调用CWinApp::OpenDocumentFile(lpszFileName),   
  调用CDocManager::OpenDocumentFile   
  a.判断有无该文件的打开文档对象,有则激活该窗口并返回   
  b.调用CMultiDocTemplate::OpenDocumentFile()   
  b1.创建新的文档对象,创建新文档对象对应的子框架   
  b2.调用应用程序的OnOpenDocument()   
  (1)调用CDocument::OnOpenDocument()   
  .打开文件对象   
  .调用应用程序的DeleteDontents();   
  .建立与此文件对象相关联的CArchive对象   
  .调用应用程序文档对象的Serialize()函数   
  .关闭CArchive对象,文件对象   
  (2)显示该文件窗口   
  b3.返回   
    
  三.文件保存   
  ON_COMMAND(ID_FILE_SAVE,CDocument::OnFileSave)   
  入口:CDocument::OnFileSave()   
  调用:CDocument::DoFileSave()   
  如果当前文档对应的文件名为空或者为只读文件,以NULL   为参数调用CDocument::DoSave(NULL),否则,以当前文档对应的文件名为参数调用CDocument::DoSave(m_strPathName);   
    
  ON_COMMAND(ID_FILE_SAVEAS,CDocument::OnFileSaveAs)   
  入口:CDocument::OnFileSaveAs()   
  以NULL为参数直接调用CDocument::DoSave(NULL);   
  CDocument::DoSave(LPCTSTR   lpszPathName,BOOL   bReplace);   
  如果lpszPathName为NULL,   
  1.设定应用程序默认的文件名   
  2.打开通用文件保存对话框,由用户设定保存文件的名字,并返回该文件名   
  如果lpszPahtName不为NULL,则跳为以上两步,直接进入下一步   
  3.调用应用程序的OnSaveDocument()   
  31.用户代码   
  32.调用CDocument::OnSaveDocument()   
  a.创建或打开文件对象   
  b.建立相对应的CArchive对象   
  c.调用应用程序文档对象的序列化函数Serialize()   
  d.关闭文件对象,CArchive对象   
  e.设置文件未修改标志   
  4.返回  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值