有同学写了一个程序,主要操作是在一个循环中读入若干图像,对图像进行操作后显示,连续循环操作。为了更新显示,在操作完成后,调用UpdateAllViews函数进行更新窗口,但是结果只能显示最后一次处理的结果。
看了程序,然后试图将程序改称死循环,发现没有办法更新窗口了。发现问题了。。。
一般对于文档-视图框架的操作是在Document文件中操作数据,使用UpdateAllViews来进行显示更新,没有任何问题。但在循环中调用UpdateAllViews为何会出现问题?我参考了一些书,再Goole、Buidu了一下,找到了结果。依然做一下笔记。
关于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/