转自与https://blog.csdn.net/piaopiaopiaopiaopiao/article/details/41521211

使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息。

使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_PAINT消息。

WM_ERASEBKGND消息的作用以背景色填充客户区,因此他会将之前绘制的图像情况,然后响应WM_PAINT消息后,会调用OnPaint函数,进行响应图像绘制工作。故Invalidate(TRUE)相当于将原来画的内容清空后,重新绘制。

而Invalidate(TRUE)只发送WM_PAINT消息,会调用OnPaint函数,进行响应图像绘制工作。故Invalidate(TRUE)的作用相当于在原来绘图的基础上继续画图。

打个比方:小明准备在黑板上画画,他准备画一只鸡和一只鸭

情形一:当画完小鸡后,小明觉得画的不像,于是将黑板擦擦除所画的小鸡,重新画。这相对于Invalidate(TRUE)函数的处理过程。

情形二:当画完小鸡后,小明觉得画得想当逼真,于是在此基础上继续画另一只鸭。这相对于Invalidate(FALSE)处理过程。

实验源码(对话框工程,在OnPaint函数中添加代码):

[cpp] view plaincopyprint?
  1. CPaintDC dc(this);
  2. int x = rand()%200;
  3. int y = rand() % 200;
  4. dc.Ellipse(CRect(CPoint(x, y), CSize(100, 100)));
  5. x = rand() % 200;
  6. y = rand() % 200;
  7. CBrush brush(RGB(0, 0, 255));
  8. dc.FillRect(CRect(CPoint(x, y), CSize(100, 100)), &brush);
CPaintDC dc(this);
int x = rand()%200;
int y = rand() % 200;
dc.Ellipse(CRect(CPoint(x, y), CSize(100, 100)));
x = rand() % 200;
y = rand() % 200;
CBrush brush(RGB(0, 0, 255));
dc.FillRect(CRect(CPoint(x, y), CSize(100, 100)), &brush);

在OnInitDialog函数中设置定时器:

SetTimer(1, 1000, NULL);

添加WM_TIME消息响应,在OnTimer函数中添加:

Invalidate(TRUE);

运行结果:

而将Invalidate(TRUE)改为:

Invalidate(FALSE);

运行结果为:

可见:Invalidate(FALSE)不会清空之前所画图像。

如果你想用Invalidate(TRUE)来实现Invalidate(FALSE)一样的效果,你可以添加对WM_ERASEBKGND消息响应的函数,修改OnEraseBkgnd函数为:

[cpp] view plaincopyprint?
  1. BOOL CaaDlg::OnEraseBkgnd(CDC* pDC)
  2. {
  3. return TRUE;
  4. }
BOOL CaaDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}

此时Invalidate(TRUE)与Invalidate(FALSE)的效果是一样的。

            </div>

Invalidate用法相关推荐

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

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

  2. Android中对Handler用法的总结

    Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...

  3. flash TweenMax用法

    二,TweenMax主类: 这里分几个大块来介绍,分别是:第三个参数特有属性(29个),PlugIn(17个),公共属性(10个),公共方法(20个). 1,第三个参数特有属性(29个): 这29个参 ...

  4. Android Scroller用法

    为什么80%的码农都做不了架构师?>>>    概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义 ...

  5. Guava Cache用法介绍

    背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...

  6. RedrawWindow, UpdateWindow,InvalidateRect 用法

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

  7. Android属性动画进阶用法

    2019独角兽企业重金招聘Python工程师标准>>> 在上周二文章中介绍补间动画缺点的时候有提到过,补间动画是只能对View对象进行动画操作的.而属性动画就不再受这个限制,它可以对 ...

  8. (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...

  9. Invalidate() UpdateData() OnPaint()与OnDraw

    Invalidate()函数 UpdateData()用法 OnPaint()与OnDraw 收藏 vc++ MFC 2010-11-08 16:42:49 阅读208 评论0   字号:大中小 订阅 ...

最新文章

  1. 最快破亿,荣耀实力验证中高端领军地位
  2. 使用 SQL Server Management Studio (SSMS) 连接 SQL Server实例
  3. jQuery二维数组遍历
  4. 一个注解搞懂 Sentinel,@SentinelResource总结
  5. bootstrap panel 和table的使用
  6. dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径
  7. 彻底搞懂 Java 中的注解 Annotation
  8. MySQL 中while loop repeat 的基本用法
  9. 硬盘分区后的逻辑结构
  10. Cfs三层靶机内网渗透模拟
  11. Eclipse Paho MQTT客户端Java源码分析
  12. QT 处理TCP粘包问题
  13. 有道云笔记Markdown图片链接解决办法
  14. 自学考试java语言程序设计_自考java 04747《Java语言程序设计(一)》教材电子版...
  15. Vue3 Fragment(碎片化节点)
  16. 明解C语言 入门 课后习题练习答案 第四章(1)
  17. Steven H. Simon《The Oxford Solid State Basics》(史蒂文·H·西蒙《牛津固态物理学基础》)中文目录
  18. 车辆违章查询接口,获取支持城市参数接口示例
  19. 概率论_证明_伯努利大数定律
  20. 全屏播放PPT时,播放音乐

热门文章

  1. 轻松将扫描图片转文字
  2. Coursera 吴恩达 DeepLearning Sequence model 第二周作业 Emojify - v2(多分类问题,有彩蛋,性能超过预期)
  3. Android_SVG概述及生成使用SVG详解
  4. Leetcode刷题 9
  5. 解决Android Studio读取不了SD卡上的文件
  6. jQuery侧边栏手风琴菜单效果(1+X Web前端开发初级 例题)
  7. PS 快速实现局部变色
  8. JAVA:实现十进制转八进制算法(附完整源码)
  9. 小学生计算机德育渗透总结,小学科学德育渗透总结.doc
  10. arch linux密码忘记,如何在Arch Linux中重设忘记的root密码