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

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(转)相关推荐

  1. InvalidateRect()、UpdateWindow()、RedrawWindow()区别

    先看一段移动图片的程序: 绘图工作都在ReDraw()中 响应MouseMove  改变图片的位置,鼠标移动后需要重绘窗口 实验一: ReDraw()在MouseMove函数中调用 [html] vi ...

  2. 【转】VC窗口刷新InvalidateRect和UpdateWindow RedrawWindow

    首先说说WM_PAINT 这个重要的消息: The WM_PAINT message is generated by the system and should not be sent by an a ...

  3. RedrawWindow, UpdateWindow,InvalidateRect 用法

    RedrawWindow, UpdateWindow,InvalidateRect 用法 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个 ...

  4. VC++ InvalidateRect

    该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制. BOOL InvalidateRect( HWND hWnd, // handle of window with change ...

  5. InvalidateRect和Invalidate的区别

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

  6. VC窗口刷新InvalidateRect和…

    学习了 原文地址:VC窗口刷新InvalidateRect和UpdateWindow 作者:玩世不恭 首先说说WM_PAINT这个重要的消息: The WM_PAINT message is gene ...

  7. Invalidate()、InvalidateRect()、InvalidateRgn、UpdateWindow()

    1.Invalidate()使整个客户区无效,客户区无效则会发送WM_PAINT消息对整个客户区进行重绘.如果消息队列非空则Invalidate()不会立即重绘窗口,直到消息队列为空才向窗口发送WM_ ...

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

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

  9. 39.文本颜色设置SetTextColor、SetBkColor、SetCharacterExtra、GetSysColor、InvalidateRect

    SetTextColor设置文本前景色 __gdi_entry WINGDIAPI COLORREF WINAPI SetTextColor( __in HDC hdc, //绘图设备上下文__in ...

  10. InvalidateRect() 与 Invalidate()函数

    ///===================该段是自己总结的一个小结================================= InvalidateRect()函数的作用是设置一个无效区域,并 ...

最新文章

  1. GPIO代码使用流程(伪代码部分示例)
  2. tensorflow tf.nn.max_pool_with_argmax返回最大池化对应索引值
  3. python需要变量命名规则_和孩子一起学习python之变量命名规则
  4. QT实现maroon游戏
  5. 2020云栖大会奖品大盘点(持续更新中)
  6. C#中使用tao.opengl绘制三维模型
  7. linux shell 原理,linux下shell的工作原理
  8. slow log php,善用php-fpm的慢执行日志slow log,分析php性能问题
  9. TIOBE 9 月编程语言:C++ 突起、R 越进前十
  10. 关于tx-lcn分布式事务框架的几个问题
  11. java优先级队列使用
  12. vue2.0中vue-router使用总结
  13. 随笔写一个简单的爬虫
  14. java条件运算查询学生成绩_java条件运算符的应用实例之成绩分级
  15. linux yum仓库制作,yum仓库搭建之RPM包制作
  16. 代码简洁之道:一行Python代码解决问题是时尚还是玄学
  17. 【文本】HTML5 Canvas小项目:为坐标轴添加数字标签(带刻度线)
  18. Qt 新建文件夹并在该文件夹下新建文件
  19. 多径效应和多普勒效应
  20. 2018 ACM-ICPC, Syrian Collegiate Programming Contest I. Rise of the Robots 最小圆覆盖 模板

热门文章

  1. Arduino与Proteus仿真实例-TFT液晶显示屏(ST7735SR驱动器)SPI驱动仿真
  2. 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示
  3. 国二计算机c 考试内容,计算机国二C语言考试试题第三套
  4. 用LSTM进行情感分析原理
  5. 利用Canvas制作旋转的矩形
  6. 从源码全面解析 Java SPI 的来龙去脉
  7. 数据库-identifying 与non-identifying realtionship 区别
  8. [hiho 18]带修改的RMQ问题
  9. 1、vRealize Operations Manager 介绍
  10. CCBN2017中广互联采访观止云(内附视频)