///===================该段是自己总结的一个小结=================================

InvalidateRect()函数的作用是设置一个无效区域,并发送一个WM_PAINT消息到消息队列中,不过这个消息在众多的消息之中优先级比较级。

在VC++编程中,对无效区域的处理方式是:

在OnPaint()中绘图,不管它绘制了什么图形,有一点应该明白,有效区域是绘制不上去图形的,或者是尽管绘制上去了,但也不会显示出来。总之就是在有效区域上绘制的图形不能生效。

换一种说法就是:在OnPaint()中绘图,不管它绘制了什么图形,只有设置为无效区域的区域才会显示它所绘制的图形。

///====================================================

InvalidateRect(&Rect)和Invalidate()两个函数形式和功能差不多,但Invalidate是使得整个窗口无效,形成无效矩形,而InvalidateRect(&Rect)是使得指定的区域无效。如果你的OnPaint比较简单时,InvalidateRect(&Rect)和Invalidate()区别不是很大,因为相对重绘量少,所以整个重绘和局部重绘区别不是很明显。当你界面比较复杂时,重绘全部和重绘局部的量就比较明显,InvalidateRect(&Rect)明显效率高于Invalidate()。但是InvalidateRect(&Rect)需要你自己判断哪些区域是无效,而Invalidate()不需要(因为它是全部重绘)。所以当全部重绘的计算量高于判断局部无效的计算量时,更适合使用InvalidateRect(&Rect)。 多个WM_PAINT消息之间通过InvalidateRect使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的。

InvalidateRect(HWND) 使窗口无效 产生消息WM_PAINT;  
ValidateRect(HWND)使窗口有效 清除消息队列中的WM_PAINT消息

在编程的时候经常把UpdateData、Invalidate、InvalidateRect和UpdateWindow四个函数混淆,在这里将简单介绍它们的区别。
UpdateData():
    当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE),将控件的输入映射到变量中。

Invalidate():
     该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
   Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。 Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放函数哪个地方,(作用相当于)都是(放在)最后的(但并不是推荐你一律放在函数最后一行)。

InvalidateRect():
    该函数的功能与Invalidate基本一样,不同的是,它是使指定的某个区域无效,需要输入一个区域。

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

只将窗口显示区域标记为无效以产生WM_PAINT消息,对于某些应用程序来说也许不是完全令人满意的选择。在呼叫InvalidateRect之后,Windows将WM_PAINT消息放入消息队列中,最后由窗口消息处理程序处理它。然而,Windows将WM_PAINT消息当成低优先级消息,如果系统有许多其它的动作正在发生,那么也许会让您等待一会儿工夫。这时,当对话框消失时,将会出现一些空白的「洞」,程序仍然等待更新它的窗口。

如果您希望立即更新无效区域,可以在呼叫InvalidateRect之后呼叫UpdateWindow:

UpdateWindow (hwnd) ;
如果显示区域的任一部分无效,则UpdateWindow将导致Windows用WM_PAINT消息呼叫窗口消息处理程序(如果整个显示区域有效,则不呼叫窗口消息处理程序)。这一WM_PAINT消息不进入消息队列,直接由Windows呼叫窗口消息处理程序。窗口消息处理程序完成更新后立即退出,Windows将控制传回给程序中UpdateWindow呼叫之后的叙述。

您可能注意到,UpdateWindow与WinMain中用来产生第一个WM_PAINT消息的函数相同。最初建立窗口时,整个显示区域内容变为无效,UpdateWindow指示窗口消息处理程序绘制显示区域。

-----------------------------------------------------------------------

1. UpdateWindow:如果有无效区,则马上sending a WM_PAINT message到窗口处理过程,不进消息队列进行排队等待,立即刷新窗口,否则,什么都不做。

2. InvalidateRect:设置无效区,如果为NULL参数,则设置整个窗口为无效区。当应用程序的那个窗口的消息队列为空时,则sending a WM_PAINT message(即使更新区域为空).在sending a WM_PAINT message的所有InvalidateRect的更新区域会累加。

3. 如果不调用 InvalidateRect就调用 UpdateWindow,那么UpdateWindow什么都不做。 ??????

4. 如果调用 InvalidateRect 后不调用UpdateWindow,则系统会自动在窗口消息队列为空的时候,系统自动发送一WM_PAINT消息。

5. 调用UpdateWindow()时将会发送一个WM_PAINT消息,而应用程序在接收到WM_PAINT消息后,将自动地调用Invalidate(),所以,在程序代码中,不一定要出现Invalidate()!

6. UpdateWindow()就是立即发送WM_PAINT消息,只对声明无效的区域起作用。Invalidate()则是声明无效的方式之一。

7. Invalidate()表示客户区域无效,在下次WM_PAINT发生时重绘。而WM_PAINT是由系统进行维护的,每当CWnd的更新区域不为空,并且在应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。   
   Invalidate里面有个bool型的参数,用来标识重绘的时候是否用背景色填充。

8. updateWindow则是要求系统对区域进行立即重绘。

看到有人在网上提出问题,他在Invalidate后面又写了绘图的函数但是没有执行,因为invalidate执行过以后转到PAINT命令了。所以后面的都没有显示。
    也终于想通我绘的图一直在闪啊闪,因为我在PAINT里面用到Invalidate()函数,所以他不停的自嵌套,倒是绘的图不停的闪。

9. Invalidate让客户区处于可以重画的状态,而UpdateWindow开始重画,但是它先判断客户区是否为空,不空UpdateWindow不执行,为空才执行重画。

10.Invalidat最后也是调用InvalidatRect,在windows API里只有InvalidatRect的

InvalidateRect() 与 Invalidate()函数相关推荐

  1. Invalidate函数

    void Invalidate( BOOL bErase = TRUE ); 参数: bErase 决定了是否要在WM_PAINT消息前发送WM_ERASEBKGND 该函数的作用是使整个窗口客户区无 ...

  2. Invalidate()函数

    InvalidateRect只是增加重绘区域,在下次WM_PAINT的时候才生效 InvalidateRect函数中的参数TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以 ...

  3. InvalidateRect()与Invalidate()的用法(转)

    本文转载之:http://blog.sina.com.cn/s/blog_63393f440100nddq.html, 在此特感谢原作则的辛苦总结,非常好,转载此处,以便查阅. BOOL Invali ...

  4. MFC InvalidateRect和Invalidate

    BOOL InvalidateRect(HWND hWnd, // 窗口句柄CONST RECT* lpRect, // 矩形区域BOOL bErase //是否擦除背景);InvalidateRec ...

  5. InvalidateRect和Invalidate的区别

    Invalidate();   执行时,是先用背景刷清屏以后,再重新绘画 InvalidateRect(rect), 他执行时, rect区域以背景刷清屏,rect以外的区域不调用背景刷,而是将屏幕上 ...

  6. InvalidateRect()函数

    BOOL InvalidateRect( HWND hWnd, // handle of window with changed update region CONST RECT *lpRect, / ...

  7. InvalidateRect函数

    http://blog.csdn.net/zwb8848happy/article/details/7408499 问题: 函数中的参数TURE FALSE到底怎么用阿? 清说得具体一点 TURE就是 ...

  8. MFC中的Invalidate、OnDraw、OnPaint函数的作用及绘图概念

    1.绘图概念 GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制, Invalidate()     如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行 ...

  9. win32 API函数( InvalidateRect)

    1. InvalidateRect是一个函数,该函数向指定的窗体更新区域添加一个矩形,然后窗体跟新区域的这一部分将被重新绘制. 函数原型:BOOL InvalidateRect( HWND hWnd, ...

最新文章

  1. [置顶] 应广大童鞋的要求提供一个封装模块,直接和ADB 服务进程交互
  2. 2018-01-11 Antlr4实现数学四则运算
  3. Android中解析XML---数据存储
  4. [win7] 去除将窗口拖到屏幕边缘时“自动最大化”
  5. 基于java Springboot实现课程评分系统设计和实现
  6. C++带参数控制台(实例)
  7. 爱立信将携手DOCOMO和英特尔构建5G测试环境
  8. lambda理解与应用
  9. p20怎么用android auto,奔驰23P/P20驾驶辅助系统到底有哪些功能,怎么使用?
  10. mysql中的索引什么意思_索引是什么意思(数据库中的索引是什么)
  11. JS 实现 Tab标签切换功能
  12. NSA漏洞预防,关闭有漏洞的端口
  13. 苹果mac文档处理工具:microsoftword
  14. 中美深度对比,资产管理行业的核心是什么?
  15. 再读《Java编程思想 》
  16. cad灯具图标_灯具在CAD中怎么表示出来 都代表哪种灯 谢谢
  17. WPCMS插件自动采集发布文章WordPress插件
  18. python moviepy 从视频中提取音频
  19. 基于希克斯需求价格弹性计算_西方经济学(微观部分)计算题
  20. c语言流星雨程序下载,c语言 流星雨的实现.doc

热门文章

  1. org.springframework.core.type.AnnotationMetadata.introspect(Ljava/lang/Class;)Lorg/springframework/c
  2. 兰州理工大学计算机与通信学院挑战杯课外学术科技作品,我校开展第十三届“挑战杯”甘肃省大学生课外学术科技作品竞赛校级成果展览暨省级推荐作品路演活动...
  3. VS2013+Windows+CPU下搭建caffe框架并利用mnist数据集实验
  4. 【BP预测】基于差分进化算法优化BP神经网络实现汇率数据预测matlab代码​
  5. H5高仿淘宝(html模板)
  6. ADG配置(主备库环境)
  7. Ruby教程_编程入门自学教程_菜鸟教程-免费教程分享
  8. 学通信工程考计算机等级证书,通信工程专业可以考什么证书
  9. 第二十四次CSP考试第二题,速度拿70分。
  10. android透明屏幕软件,全局透明屏幕