Invalidate()

转载 2013年12月05日 13:52:50

Invalidate介绍

void Invalidate( BOOL bErase = TRUE );

参数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND

该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

与UpdateWindow( )的区别

UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

与WM_PAINT之间的关系

        系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变的时候,这一般是通过InvalidateRect和  InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定的区域加到窗口的Update  Region中,当应用的消息队列没有其他消息时,如果窗口的Update Region不为空时,系统就会自动产生WM_PAINT消息。

        系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做,这样有利于提高绘制的效率:在两个WM_PAINT消息之间多个Invalidate调用使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机  制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用SendMessage  发送一条WM_PAINT消息来强制立即重画,但不如使用Windows  GDI为我们提供的更方便和强大的函数:UpdateWindow和RedrawWindow。UpdateWindow会检查窗口的Update  Region,当其不为空时才发送WM_PAINT消息;RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT消息而不管Update  Region是否为空等

分析invalidate流程例子

  • 2012年12月23日 09:05
  • 118KB
  • 下载

Android中View绘制流程以及invalidate()等相关方法分析

转载请注明出处:http://blog.csdn.net/qinjuning               前言: 本文是我读《Android内核剖析》第13章----View工作原理总结而成的,在此膜...

Invalidate.doc

  • 2012年08月13日 11:12
  • 32KB
  • 下载

invalidate

  • 2014年05月13日 09:47
  • 14KB
  • 下载

Android中View绘制流程以及invalidate()等相关方法分析

转载请注明出处:http://blog.csdn.net/qinjuning                   前言: 本文是我读《Android内核剖析》第13章----V...

Invalidate()函数用法

Invalidate(false)不擦除背景,直接画 Invalidate(true)擦除背景 InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效 Invalida...

Android中View绘制流程以及invalidate()

  • 2014年10月25日 11:13
  • 1.09MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Invalidate()
举报原因:
原因补充:

(最多只允许输入30个字)