CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

新手请教:为何在MDI项目中映射了ID_FILE_OPEN命令,在其中调用重载的CFileDialog后,点击打开图标,能打开文件对话框,但怎么不建立子窗

楼主zxphxh(天雨)2006-03-18 08:23:52 在 VC/MFC / 基础类 提问

如题 问题点数:20、回复次数:7Top

1 楼xiaoqiqixiao(七七)回复于 2006-03-18 08:57:59 得分 19

调用你的CWinApp的OpenDocumentFile(yourfilepath)函数Top

2 楼zxphxh(天雨)回复于 2006-03-18 09:57:46 得分 0

请问xiaoqiqixiao(七七)   :我调用了theApp.OpenDocumentFile(FileName),能建立子窗体并打开文件,但是同一个文件只能打开一次,再次打开只能把以前已打开的同名的文件的子窗体调到前端。这是为何?Top

3 楼xiaoqiqixiao(七七)回复于 2006-03-18 10:12:35 得分 0

你有看过哪个MDI程序可以同一个文件打开多次的,有这个必要吗?  
  根据你的意图请参考下列选项:  
  1.调用你的CDocument的OnFileClose关闭你的文件,再重新打开。  
  2.调用你的CDocument的OnFileSaveAs将你的文件另存为别的文件名,再打开你原来的文件。  
  3.新建一个视图,同一个文件有不同的视图,或许会满足你的需要。Top

4 楼zxphxh(天雨)回复于 2006-03-18 10:25:47 得分 0

非常谢谢xiaoqiqixiao(七七)   !  
   
  我参考《突破Visual   C++.NET编程实例五十讲》第1篇第7讲实现了,代码如下,只是还没有完全明白其过程:  
   
          CDocument   *pDoc   =   NULL;  
          POSITION   pos   =   Application.GetFirstDocTemplatePosition();  
          ASSERT(pos   !=   NULL);  
          CDocTemplate   *pTemplate   =   Application.GetNextDocTemplate(pos);  
          pTemplate->OpenDocumentFile(pszFileName);  
           
          pos   =   pTemplate->GetFirstDocPosition();  
          if   (pos   !=   NULL   )   pDoc   =   pTemplate->GetNextDoc(pos);  
   
          return   pDoc;Top

5 楼jiangsheng(蒋晟.Net[MVP])回复于 2006-03-18 10:46:50 得分 1

http://www.codeproject.com/docview/MultiViewsMFC_MDI.aspTop

6 楼xiaoqiqixiao(七七)回复于 2006-03-20 09:26:36 得分 0

没必要打开,不表示不能打开,请参考以下源代码,和本人的注释  
  CDocument*   CWinApp::OpenDocumentFile(LPCTSTR   lpszFileName)  
  {  
  ASSERT(m_pDocManager   !=   NULL);  
  return   m_pDocManager->OpenDocumentFile(lpszFileName);  
  }  
  CDocument*   CDocManager::OpenDocumentFile(LPCTSTR   lpszFileName)  
  {  
  //   find   the   highest   confidence  
  POSITION   pos   =   m_templateList.GetHeadPosition();  
  CDocTemplate::Confidence   bestMatch   =   CDocTemplate::noAttempt;  
  CDocTemplate*   pBestTemplate   =   NULL;  
  CDocument*   pOpenDocument   =   NULL;  
   
  TCHAR   szPath[_MAX_PATH];  
  ASSERT(lstrlen(lpszFileName)   <   _countof(szPath));  
  TCHAR   szTemp[_MAX_PATH];  
  if   (lpszFileName[0]   ==   '\"')  
  ++lpszFileName;  
  lstrcpyn(szTemp,   lpszFileName,   _MAX_PATH);  
  LPTSTR   lpszLast   =   _tcsrchr(szTemp,   '\"');  
  if   (lpszLast   !=   NULL)  
  *lpszLast   =   0;  
  AfxFullPath(szPath,   szTemp);  
  TCHAR   szLinkName[_MAX_PATH];  
  if   (AfxResolveShortcut(AfxGetMainWnd(),   szPath,   szLinkName,   _MAX_PATH))  
  lstrcpy(szPath,   szLinkName);  
   
  //先搜索是否有相同文件名的已打开的文档  
  while   (pos   !=   NULL)  
  {  
  CDocTemplate*   pTemplate   =   (CDocTemplate*)m_templateList.GetNext(pos);  
  ASSERT_KINDOF(CDocTemplate,   pTemplate);  
   
  CDocTemplate::Confidence   match;  
  ASSERT(pOpenDocument   ==   NULL);  
  //请注意此处MatchDocType即是判断是否有打开的文件以及找到最适当的CDocTemplate,如果你想//的话,你也可以自己看看MatchDocType是怎么编的。  
  match   =   pTemplate->MatchDocType(szPath,   pOpenDocument);  
  if   (match   >   bestMatch)  
  {  
  bestMatch   =   match;  
  pBestTemplate   =   pTemplate;  
  }  
  if   (match   ==   CDocTemplate::yesAlreadyOpen)  
  break;             //   stop   here  
  }  
   
  //如果有找到已经打开的文档的话,就将该文档调到前台  
  if   (pOpenDocument   !=   NULL)  
  {  
  POSITION   pos   =   pOpenDocument->GetFirstViewPosition();  
  if   (pos   !=   NULL)  
  {  
  CView*   pView   =   pOpenDocument->GetNextView(pos);   //   get   first   one  
  ASSERT_VALID(pView);  
  CFrameWnd*   pFrame   =   pView->GetParentFrame();  
  if   (pFrame   !=   NULL)  
  pFrame->ActivateFrame();  
  else  
  TRACE0("Error:   Can   not   find   a   frame   for   document   to   activate.\n");  
  CFrameWnd*   pAppFrame;  
  if   (pFrame   !=   (pAppFrame   =   (CFrameWnd*)AfxGetApp()->m_pMainWnd))  
  {  
  ASSERT_KINDOF(CFrameWnd,   pAppFrame);  
  pAppFrame->ActivateFrame();  
  }  
  }  
  else  
  {  
  TRACE0("Error:   Can   not   find   a   view   for   document   to   activate.\n");  
  }  
  return   pOpenDocument;  
  }  
   
  if   (pBestTemplate   ==   NULL)  
  {  
  AfxMessageBox(AFX_IDP_FAILED_TO_OPEN_DOC);  
  return   NULL;  
  }  
   
  //最后调用所选的CDocTemplate打开你的文档,至于CDocTemplate怎么打开你的文档,请自已继续  
  return   pBestTemplate->OpenDocumentFile(szPath);  
  }  
  Top

7 楼zxphxh(天雨)回复于 2006-03-22 10:45:10 得分 0

非常谢谢xiaoqiqixiao(七七)   !  
   
  有问题继续向你请教。Top

相关问题

  • 高分求助,重载CFileDialog消息的问题
  • 重载()
  • 重载!
  • 在线等答案!Windows窗口右上方的关闭按钮所映射的函数是哪个?我要对它进行重载!
  • 重载问题!
  • 重载,,,模板。。。。。
  • 关于重载。
  • 函数重载
  • SqlParameterCollection 重载
  • 如何重载==

关键词

  • 文件
  • null
  • 调用
  • 打开
  • popendocument
  • pappframe
  • opendocumentfile
  • ptemplate
  • cdoctemplate
  • bestmatch

得分解答快速导航

  • 帖主:zxphxh
  • xiaoqiqixiao
  • jiangsheng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo