【100分求助】CFileDialog 打开文件对话框 双击打开文件 的问题

liaohuming 2012-02-23 08:38:24
我的问题是这样的:

我想通过 CFileDialog 打开文件对话框来打开文件

(1)当我通过“选中一个文件,然后单击打开按钮”的方式打开文件的时候,一切都很正常

(2)当我通过“选中一个文件,然后双击打开文件”的方式打开文件的时候,出现问题了

我的程序是个绘图程序,打开的文件是绘图的数据

当通过(1)打开文件时,该文件所包含的图形信息可以绘图窗口正常显示出图形来

当通过(2)打开文件时,绘图窗口上,数据所描述的图形,只是闪现一下,然后就不见了,但是数据是读进去了,就是不显示,不知道为什么。

我之前怀疑是不是自己重载鼠标左键双击捣的鬼,但是我后面把重载函数去了,以及在重载函数中加上视图更新,发现效果一样,这样就排除了重载左键双击引起这个问题的可能性了

我现在想知道,默认的双击打开函数怎么去重载,因为通过“打开”按钮打开文件的时候,我是加入了视图更新的函数,我猜想,默认的双击打开文件,应该没有这个视图更新的操作

下面是我的代码,大家帮忙分析一下,谢谢~

CFileDialog dlg(TRUE, _T("fta"), NULL, OFN_OVERWRITEPROMPT, _T("Fault Tree Analysis Files(*.fta)|*.fta||"));
if(dlg.DoModal()==IDOK)
{
CFile theFile;
ASSERT(theFile.Open(dlg.GetPathName(), CFile::modeRead));
CArchive archive(&theFile, CArchive::load);
Serialize(archive);
//close
archive.Close();
theFile.Close();
}

Invalidate();


还有一个问题,我刚刚说了,双击打开文件,数据是读进去了,要是双击的时候并没有执行视图更新,那么数据读进去,在之后的操作里面包含了视图更新(比如说,移动操作),那么我执行移动操作后,应该更新出图形才对,事实证明,并没有。

所以我以上的分析应该是错误的

有没有人遇到过类似的问题,或者知道是什么原因吗?
...全文
255 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
Onpain,OnDraw,OnEraseBkgnd,这几个函数都用了几个,如果用了OnEraseBkgnd()函数,改成return FALSE;试试,另外Invalidate()都哪些地方用到了,是不是少用了或多用了
搬砖的奶霸 2012-02-24
  • 打赏
  • 举报
回复
我现在怀疑你的问题,不是这块代码的问题。 按照你说的,数据读进去 重绘应该会显示,
1.你确定数据已经处理? 2数据处理是否有遗漏;

你的第二种双击读入数据 是不是已经进行了第一种选择的操作??
副组长 2012-02-24
  • 打赏
  • 举报
回复
好诡异的问题。
试试两次打开不打开同一个文件。
CFileDialog只是帮你选取的一个文件名,文件名得到了文件也打开的那就不是CFileDialog的问题了,别处找找吧。
smpowy 2012-02-24
  • 打赏
  • 举报
回复
数据都读出来了,应该就和双击读取没关系了吧。
要不你试试 读一个数 画一下,等图形都画完,再close。
liaohuming 2012-02-24
  • 打赏
  • 举报
回复
谢谢大家,这个问题我解决了,是我自己重载下面这个函数引起的,现在已经没问题了,散分散分~
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
liangbina07 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gordon3000 的回复:]
好诡异的问题。
试试两次打开不打开同一个文件。
CFileDialog只是帮你选取的一个文件名,文件名得到了文件也打开的那就不是CFileDialog的问题了,别处找找吧。
[/Quote]

顶下
liaohuming 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hdg3707 的回复:]
可能还有其它地方响应双击的事件,查查都有哪些能引起更新视图的地方,然后全去掉,一个一个加,看是哪块有引起的问题
[/Quote]

是我重载afx_msg void OnLButtonUp(UINT nFlags, CPoint point);引起的,我刚刚把这个重载的函数注释掉,再双击打开文件就不会出现上面说的问题
liaohuming 2012-02-24
  • 打赏
  • 举报
回复
谢谢大家的关注,我找到问题的根源了,但是我还不知道怎么解决

目前我只知道,是我重载afx_msg void OnLButtonUp(UINT nFlags, CPoint point);引起的
hdg3707 2012-02-24
  • 打赏
  • 举报
回复
可能还有其它地方响应双击的事件,查查都有哪些能引起更新视图的地方,然后全去掉,一个一个加,看是哪块有引起的问题
liaohuming 2012-02-24
  • 打赏
  • 举报
回复
用到OnPaint,OnEraseBkgnd,这几个函数,OnEraseBkgnd()函数是return FALSE的[Quote=引用 10 楼 hdg3707 的回复:]
Onpain,OnDraw,OnEraseBkgnd,这几个函数都用了几个,如果用了OnEraseBkgnd()函数,改成return FALSE;试试,另外Invalidate()都哪些地方用到了,是不是少用了或多用了
[/Quote]
liaohuming 2012-02-24
  • 打赏
  • 举报
回复
第二种双击读入数据我没有定义,就是打开文件对话框默认双击也是打开文件的功能,我定义的就是代码块贴的,IDOK时执行读入数据和刷新界面[Quote=引用 9 楼 coverkelly 的回复:]
我现在怀疑你的问题,不是这块代码的问题。 按照你说的,数据读进去 重绘应该会显示,
1.你确定数据已经处理? 2数据处理是否有遗漏;

你的第二种双击读入数据 是不是已经进行了第一种选择的操作??
[/Quote]
liaohuming 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hdg3707 的回复:]
CFileDialog dlg(TRUE, _T("fta"), NULL, OFN_OVERWRITEPROMPT, _T("Fault Tree Analysis Files(*.fta)|*.fta||"));
if(dlg.DoModal()==IDOK)
{
CFile theFile;
ASSERT(theFile.Open(dlg.GetPathNam……
[/Quote]我试过了,没有用呢,还是一样。
liaohuming 2012-02-23
  • 打赏
  • 举报
回复
我是放到UG里用的,dll调试的时候,设置UG的目录,然后运行不起来[Quote=引用 4 楼 heksn 的回复:]
DLL可以调试啊 你运行DLL工程可是设置调用DLL的可执行程序
[/Quote]
  • 打赏
  • 举报
回复
DLL可以调试啊 你运行DLL工程可是设置调用DLL的可执行程序
hdg3707 2012-02-23
  • 打赏
  • 举报
回复
CFileDialog dlg(TRUE, _T("fta"), NULL, OFN_OVERWRITEPROMPT, _T("Fault Tree Analysis Files(*.fta)|*.fta||"));
if(dlg.DoModal()==IDOK)
{
CFile theFile;
ASSERT(theFile.Open(dlg.GetPathName(), CFile::modeRead));
CArchive archive(&theFile, CArchive::load);
Serialize(archive);
//close
archive.Close();
theFile.Close();
Invalidate();
}
把Invalidate();加到if里试试,双击和单击打开都是一样的,让Invalidate();只在打开文件对话框按OK时再执行

liaohuming 2012-02-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
你Debug下调试一下,看看DoModal()返回以后
[/Quote]

我弄的是一个dll,需要放到其他程序中去调用的,在调用的时候来测试,所以也没法设断点什么的来调试
Eleven 2012-02-23
  • 打赏
  • 举报
回复
你Debug下调试一下,看看DoModal()返回以后

16,472

社区成员

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

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

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