UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow的比较
来源:互联网 发布:如何把iphone投影到mac 编辑:程序博客网 时间:2024/05/16 01:15
Invalidate和UpdateWindow的区别: Invalidate在消息队列中加入一条WM_PAINT消息,其无效区为整个客户区。而UpdateWindow直接发送一个WM_PAINT消息,其无效区范围就是消息队列中WM_PAINT消息(最多只有一条)的无效区。效果很明显,调用Invalidate之后,屏幕不一定马上更新,因为WM_PAINT消息不一定在队列头部,而调用UpdateWindow会使WM_PAINT消息马上执行的,绕过了消息队列。如果你调用Invalidate之后想马上更新屏幕,那就加上UpdateWindow()这条语句。
1.UpdateData():
2.Invalidate():
3.InvalidateRect():
4.UpdateWindow():
5.UpdateWindow:如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。
InvalidateRect:设置无效区,如果为NULL参数,则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时,则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。
1:设置无效区
InvalidateRect
2:立即刷新
UpdateWindow()
如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。
调用UpdateWindow()时将会发送一个WM_PAINT消息,而应用程序在接收到WM_PAINT消息后,将自动地调用Invalidate()。所以,在程序代码中,不一定要出现Invalidate()!
UpdateWindow()就是立即发送WM_PAINT消息,updateWindow要求系统对区域进行立即重绘,其只对声明为无效的区域起作用,而Invalidate()是声明无效区域的方式之一。
Invalidate()表示客户区域无效,在下次WM_PAINT发生时重绘。而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。
Invalidat最后也是调用InvalidatRect。
RedrawWindow
*****************************************************************************************************************************************
看到有人在网上提出问题,他在Invalidate后面又写了绘图的函数但是没有执行,这是因为invalidate执行过以后就转到PAINT命令了,所以后面的都没有显示。
也终于想通我绘的图一直在闪啊闪,这是因为我在PAINT里面用到了Invalidate()函数,所以他不停的自嵌套,导致绘的图在不停的闪。
总之:Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它首先需判断客户区是否为空,不空则UpdateWindow不执行,为空才执行重画。
*********************************************************************************************************************************************
在刷新窗口时经常要调用重绘函数MFC提供了三个函数用于窗口重绘
OnDraw,一般是收到WM_PAINT消息时调用,所以应用程序一般通过Invalidate产生WM_PAINT消息来间接调用OnDraw。当窗体无效等情况下,window也会产生WM_PAINT消息,这时OnDraw
OnUpdate
OnUpdate,OnUpdate的默认实现是通过Invalidate产生WM_PAINT,这时OnDraw又被调用了。
OnDraw除了你和应用程序框架间接调用外,window还可能间接调用它。
OnUpdate一般只有你的程序和应用程序框架会调用的。当然它的默认实现你可以改变的
**********************************************************************************************************************
OnInitUpdate是VIEW的初始化
OnUpdate是文档多视时,响应其它视图的改变
OnDraw和OnPaint都是绘图。OnPaint调用OnDraw,并且调用OnPrepareDC
---------------------------------------------------------------
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow的比较
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- Invalidate、InvalidateRect、UpdateData、UpdateWindow的用法和区别
- UpdateData、Invalidate、InvalidateRect和UpdateWindow(转)
- UpdateData、Invalidate、InvalidateRect、UpdateWindow、GetMessage
- Invalidate/InvalidateRect/UpdateWindow/RedrawWindow区别与联系
- Invalidate() 、RedrawWindow()和UpdateWindow()的区别
- 发外链
- KMP模板
- hdu 1569 最大权独立集
- Libgdx 实现技能冷却效果
- 小心陷阱: 迁移应用到Cluster遇到的Timer问题
- UpdateData、Invalidate、InvalidateRect和UpdateWindow及RedrawWindow的比较
- typedef int(init_fnc_t) (void);这句话是什么意思啊?
- loopj----Android Asynchronous Http Client(AHC)
- 判断一个对象是否为空
- 拿什么拯救你,我的WiFi共享精灵!
- SDL2.0在mfc窗口中显示yuv的一种方法
- 使用socket实现简单数据文件传输
- bind远程Service 过程分析,基于4.4.3源码
- hdu 4912 Paths on the tree LCA + 贪心