新手请教:为何在MDI项目中映射了ID_FILE_OPEN命令,在其中调用重载的CFileDialog后,点击打开图标,能打开文件对话框,但怎么不建立子窗
如题 问题点数: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




