CWinApp::OnFileOpen

问题: 用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.返回  

原文:http://topic.csdn.net/t/20001213/18/48208.html

posted @ 2010-05-31 21:47  微笑的艾米  阅读(1836)  评论(0编辑  收藏  举报