于MFC中循环中调用UpdateAllViews无效的问题

有同学写了一个程序,主要操作是在一个循环中读入若干图像,对图像进行操作后显示,连续循环操作。为了更新显示,在操作完成后,调用UpdateAllViews函数进行更新窗口,但是结果只能显示最后一次处理的结果。

看了程序,然后试图将程序改称死循环,发现没有办法更新窗口了。发现问题了。。。

一般对于文档-视图框架的操作是在Document文件中操作数据,使用UpdateAllViews来进行显示更新,没有任何问题。但在循环中调用UpdateAllViews为何会出现问题?我参考了一些书,再GooleBuidu了一下,找到了结果。依然做一下笔记。

 

关于UpdateAllViews函数的处理过程:

UpdateAllViews连接文档-视图结构,要求各视图进行更新,而具体的更新操作由各视图的UpdateView来决定。而在View类的OnUpdate函数对其进行相应后,默认的操作是调用Invalidate函数,Invalidate只是标记一块需要更新的区域,并放消息WN_PAINT到消息队列中,具体只有当该消息得到操作才会更新窗口,即调用你的OnDraw函数。

在连续的循环操作过程中,消息没有能够得到机会被处理,因此也就没有办法实现在每次处理完成后更新窗口。

 

解决办法:

    重写View中的OnUpdate函数,直接在里面调用你的OnDraw函数,如:

    CDC   *pDC=GetDC();  

    OnDraw(pDC);  

    ReleaseDC(pDC);

这样就保证你的OnDraw函数在每次你调用UpdateAllViews函数后得到执行,即跳过了原先的消息队列。这个方法也直接解决了我同学的问题。

 

相关网上资源:

http://chenyi515.blog.163.com/blog/static/68123549200810223536624/

http://topic.csdn.net/t/20040508/15/3042066.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值