新手请教:为何在MDI项目中映射了ID_FILE_OPEN命令,在其中调用重载的CFileDialog后,点击打开图标,能打开文件对话框,但怎么不建立子窗 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用你的CWinApp的OpenDocumentFile(yourfilepath)函数 请问xiaoqiqixiao(七七) :我调用了theApp.OpenDocumentFile(FileName),能建立子窗体并打开文件,但是同一个文件只能打开一次,再次打开只能把以前已打开的同名的文件的子窗体调到前端。这是为何? 你有看过哪个MDI程序可以同一个文件打开多次的,有这个必要吗?根据你的意图请参考下列选项:1.调用你的CDocument的OnFileClose关闭你的文件,再重新打开。2.调用你的CDocument的OnFileSaveAs将你的文件另存为别的文件名,再打开你原来的文件。3.新建一个视图,同一个文件有不同的视图,或许会满足你的需要。 非常谢谢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; http://www.codeproject.com/docview/MultiViewsMFC_MDI.asp 没必要打开,不表示不能打开,请参考以下源代码,和本人的注释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);} 非常谢谢xiaoqiqixiao(七七) !有问题继续向你请教。 问题 VC求已知空间两点的线段中点 杭州哪里有<<COM技术内幕>>买啊 如何计算两个计算机之间或单个网络结点的网络流量? 哪里能得到ado中操作数据库的标准语法?! 怎样全部展开树型列表? 如何获得网页中窗口的句柄? 对数据库的一个菜鸟问题!!!请大家帮帮我这个菜鸟吧!! 如何改变jpg图片的像素 RasEnumDevices()为什么要调用2次 为何我的程序中CTreeView标签项名称全为大写,不能分辩大小写? 很简单的问题关于比较字符串
根据你的意图请参考下列选项:
1.调用你的CDocument的OnFileClose关闭你的文件,再重新打开。
2.调用你的CDocument的OnFileSaveAs将你的文件另存为别的文件名,再打开你原来的文件。
3.新建一个视图,同一个文件有不同的视图,或许会满足你的需要。
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;
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);
}