怎样写OnFileOpen()消息映射函数

wlfrdwu 2000-11-07 10:33:00
写MDI时自己写的OnFileOpen(),死活没有新的文档出现,
我的目的是用不同的文档对象保存不同的BMP图象,请高手赐教
...全文
225 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingsg 2000-11-08
  • 打赏
  • 举报
回复


有了多文档,还要有多个视配合,这样才能达到你的效果
wlfrdwu 2000-11-08
  • 打赏
  • 举报
回复
非常感谢,问题得到初步解决,现在能出现新的视图,但是新打开的文件被显示在原来的窗口,
而不是那个刚刚被打开的窗口。下面是我的OnFileOpen()
{
CWinApp* pWinApp;
pWinApp = (CWinApp*) AfxGetApp( );
static char szFilter[]="BMP FILES(*.BMP)|*.BMP||";
FileDialog FileDlg(TRUE, NULL, NULL,
OFN_HIDEREADONLY, szFilter);
if(FileDlg.DoModal()==IDOK){
pWinApp->OpenDocumentFile(FileDlg.GetPathName());
m_pDib->Load( FileDlg.GetPathName());
}
}
其中,m_pDib是定义在CMyDoc中的一个指向图象类(CDib)的指针,Load()用来读取文件进内存
andygood 2000-11-07
  • 打赏
  • 举报
回复

另外,出错的原因还可能是因为你注册的多个模板中没有与打开文件匹配的类型。这时CDocManager::OpenDocumentFile(LPCTSTR lpszFileName)将返回NULL,即无法打开文档。这个函数如下(copy自MFC,^_^):

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);
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;
}

return pBestTemplate->OpenDocumentFile(szPath);
}
andygood 2000-11-07
  • 打赏
  • 举报
回复

“没有新的文档出现”是什么意思?不明白。能不能说的具体一点?

MFC打开文档的过程是这样的:首先是CWinApp::OnFileOpen(),这个函数只是简单调用CDocManager::OnFileOpen()。CDocManager::OnFileOpen()负责显示文件对话框,然后调用CWinApp::OpenDocumentFile()打开选择的文件。

你使用CWinApp::OpenDocumentFile()了吗?仔细检查你的代码,这个问题应该比较简单。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧