导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

有问题了,帮我看看。vc单文档做的打开文件小程序

苏克贝塔03 2010-07-20 04:46:50
vc单文档做的打开文件小程序,
现在假如已经打开file1.res,我想在打开file2.res,
但这样就出错,程序退出。。
想问一下怎么解决啊?什么思路?
...全文
109 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
3jaja 2010-07-21
[Quote=引用 6 楼 jichao1010 的回复:]

if(file)
file.Close();
你这样好像还是不对啊,我刚刚试了。。
[/Quote]

注释 //if(file)
-----------------------------------------------------------------------
很少用CFile
我常用 CreateFile 返回值 INVALID_HANDLE_VALUE 表示失败
因为 CloseHandle 关闭已关闭的文件句柄会出错,用惯了加了个if(file)
而打开文件对话框是时有可能是取消的,所以放到把file.Close()函数放到fileDlg.DoModal()之前和之后是不同的。放到之前会关闭多次,放到后面操作一次。
回复
向立天 2010-07-21
[Quote=引用 10 楼 jichao1010 的回复:]
解决了。把file.Close()函数放到fileDlg.DoModal()里,而不是放在以前的
if (m_fileOpen==2)//第二次打开
的后面,问题是解决了,可我不知道他俩有什么区别啊?
[/Quote]
应该是一样
确实比较奇怪
就是看你这代码没什么问题才问你的
不过从逻辑上说应该是确定要打开一个新文件才关闭以前的
所以放到你现在这个位置更正确一些
回复
magic7004 2010-07-21
打开第二个文件前,要先把第一个文件关掉,因为你是单文档。
回复
ac_de 2010-07-21
文件 打开后 记得关闭
回复
苏克贝塔03 2010-07-21
解决了。把file.Close()函数放到fileDlg.DoModal()里,而不是放在以前的
if (m_fileOpen==2)//第二次打开
的后面,问题是解决了,可我不知道他俩有什么区别啊?
回复
苏克贝塔03 2010-07-21
不是看错了,到
if (IDOK==fileDlg.DoModal())
{
file.Open(fileDlg.GetFileName(),CFile::modeRead); Invalidate();
}
到这里错了。。调到了这里
LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
{
if (m_pfnSuper != NULL)
return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
WNDPROC pfnWndProc;
if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
else
return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
}
调到了这里的红色那句,帮我分析分析啊,谢谢了。。
回复
苏克贝塔03 2010-07-21
[Quote=引用 7 楼 xianglitian 的回复:]
引用 4 楼 jichao1010 的回复:
我想这么解决:
void CReadFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码

if (m_fileOpen==2)//第二次打开
{
file.Close();
CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Te……
[/Quote]
到红色的那地方错了。。
回复
向立天 2010-07-21
[Quote=引用 4 楼 jichao1010 的回复:]
我想这么解决:
void CReadFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码

if (m_fileOpen==2)//第二次打开
{
file.Close();
CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.res;*log;*RES……
[/Quote]
你这么做有什么问题
回复
苏克贝塔03 2010-07-21
if(file)
file.Close();

你这样好像还是不对啊,我刚刚试了。。
回复
3jaja 2010-07-20
//m_fileOpen 没必要吧
void CReadFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码

CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.res;*log;*RES;*LOG)\0*.res;*log;*RES;*LOG\0\0");

if (IDOK==fileDlg.DoModal())
{
if(file)
file.Close();

file.Open(fileDlg.GetFileName(),CFile::modeRead);

Invalidate();
}

}
回复
苏克贝塔03 2010-07-20
我想这么解决:
void CReadFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码

if (m_fileOpen==2)//第二次打开
{
file.Close();
CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.res;*log;*RES;*LOG)\0*.res;*log;*RES;*LOG\0\0");

if (IDOK==fileDlg.DoModal())
{

file.Open(fileDlg.GetFileName(),CFile::modeRead);

Invalidate();
}

}
else//第一次打开
{
m_fileOpen=1;
CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.res;*log;*RES;*LOG)\0*.res;*log;*RES;*LOG\0\0");

if (IDOK==fileDlg.DoModal())
{

file.Open(fileDlg.GetFileName(),CFile::modeRead);

Invalidate();
}
m_fileOpen=2;

}
但还是不对。。
回复
苏克贝塔03 2010-07-20
void CReadFileView::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
m_fileOpen=1;
CFileDialog fileDlg(true);
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.res;*log;*RES;*LOG)\0*.res;*log;*RES;*LOG\0\0");

if (IDOK==fileDlg.DoModal())
{

file.Open(fileDlg.GetFileName(),CFile::modeRead);

Invalidate();
}

}
这是我的OnFileOpen()函数,问题就是打开第二个文件就错。。
在哪解决啊?
回复
Eleven 2010-07-20
SDI单文档,view选择CEditView默认就可以打开和显示文件内容
回复
精锐掷矛手 2010-07-20
代码
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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