Invalidate用法
转自与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函数中添加代码):
- 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);
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函数为:
- BOOL CaaDlg::OnEraseBkgnd(CDC* pDC)
- {
- return TRUE;
- }
BOOL CaaDlg::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}
此时Invalidate(TRUE)与Invalidate(FALSE)的效果是一样的。
</div>
Invalidate用法相关推荐
- InvalidateRect()与Invalidate()的用法(转)
本文转载之:http://blog.sina.com.cn/s/blog_63393f440100nddq.html, 在此特感谢原作则的辛苦总结,非常好,转载此处,以便查阅. BOOL Invali ...
- Android中对Handler用法的总结
Android之Handler用法总结 方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用 ...
- flash TweenMax用法
二,TweenMax主类: 这里分几个大块来介绍,分别是:第三个参数特有属性(29个),PlugIn(17个),公共属性(10个),公共方法(20个). 1,第三个参数特有属性(29个): 这29个参 ...
- Android Scroller用法
为什么80%的码农都做不了架构师?>>> 概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义 ...
- Guava Cache用法介绍
背景 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用.在日长开发有很多场合,有一些数据量不是很大,不会经常改动,并且访问非常频繁.但是由于受限于硬盘IO的性能或者远程网络 ...
- RedrawWindow, UpdateWindow,InvalidateRect 用法
RedrawWindow, UpdateWindow,InvalidateRect 用法 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个 ...
- Android属性动画进阶用法
2019独角兽企业重金招聘Python工程师标准>>> 在上周二文章中介绍补间动画缺点的时候有提到过,补间动画是只能对View对象进行动画操作的.而属性动画就不再受这个限制,它可以对 ...
- (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...
- Invalidate() UpdateData() OnPaint()与OnDraw
Invalidate()函数 UpdateData()用法 OnPaint()与OnDraw 收藏 vc++ MFC 2010-11-08 16:42:49 阅读208 评论0 字号:大中小 订阅 ...
最新文章
- 最快破亿,荣耀实力验证中高端领军地位
- 使用 SQL Server Management Studio (SSMS) 连接 SQL Server实例
- jQuery二维数组遍历
- 一个注解搞懂 Sentinel,@SentinelResource总结
- bootstrap panel 和table的使用
- dev可以运行mysql文件夹_Linux查看mysql 安装路径和运行路径
- 彻底搞懂 Java 中的注解 Annotation
- MySQL 中while loop repeat 的基本用法
- 硬盘分区后的逻辑结构
- Cfs三层靶机内网渗透模拟
- Eclipse Paho MQTT客户端Java源码分析
- QT 处理TCP粘包问题
- 有道云笔记Markdown图片链接解决办法
- 自学考试java语言程序设计_自考java 04747《Java语言程序设计(一)》教材电子版...
- Vue3 Fragment(碎片化节点)
- 明解C语言 入门 课后习题练习答案 第四章(1)
- Steven H. Simon《The Oxford Solid State Basics》(史蒂文·H·西蒙《牛津固态物理学基础》)中文目录
- 车辆违章查询接口,获取支持城市参数接口示例
- 概率论_证明_伯努利大数定律
- 全屏播放PPT时,播放音乐
热门文章
- 轻松将扫描图片转文字
- Coursera 吴恩达 DeepLearning Sequence model 第二周作业 Emojify - v2(多分类问题,有彩蛋,性能超过预期)
- Android_SVG概述及生成使用SVG详解
- Leetcode刷题 9
- 解决Android Studio读取不了SD卡上的文件
- jQuery侧边栏手风琴菜单效果(1+X Web前端开发初级 例题)
- PS 快速实现局部变色
- JAVA:实现十进制转八进制算法(附完整源码)
- 小学生计算机德育渗透总结,小学科学德育渗透总结.doc
- arch linux密码忘记,如何在Arch Linux中重设忘记的root密码