Invalidate(TRUE)与Invalidate(FALSE)区别

转载 2015年11月19日 16:08:37

使用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);
在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;
}
此时Invalidate(TRUE)与Invalidate(FALSE)的效果是一样的。

原文:http://m.blog.csdn.net/blog/piaopiaopiaopiaopiao/41521211

Invalidate以及Invalidate(false)和Invalidate(true)的区别

1.void Invalidate( BOOL bErase = TRUE );   该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了...

Invalidate()函数

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

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

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

Invalidate(TRUE)与Invalidate(FALSE)区别

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

从Invalidate();方法理解windows消息机制

Invalidate标记一个需要重绘的无效区域,并不意味着调用该函数后就立刻进行重绘。类似于PostMessage(WMPAINT),需要处理到WMPAINT消 息时才真正重绘。因为Invalida...
  • ghevinn
  • ghevinn
  • 2014年04月09日 17:46
  • 3114

Invalidate以及Invalidate(false)和Invalidate(true)的区别

1.void Invalidate( BOOL bErase = TRUE );  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口...
  • hhszf
  • hhszf
  • 2010年01月19日 16:30
  • 7376

Invalidate(TRUE)与Invalidate(FALSE)区别

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

Invalidate以及Invalidate(false)和Invalidate(true)的区别

1.void Invalidate( BOOL bErase = TRUE );   该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变...

Invalidate(TRUE)的闪屏问题

在使用Invalidate(TRUE)进行窗口重绘时,总是会遇到闪屏的问题。     一开始以为是绘图速度过慢照成的,但在对绘图时间做了一个测试之后发现,即使整个绘图过程只持续了几个毫秒,还是会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Invalidate(TRUE)与Invalidate(FALSE)区别
举报原因:
原因补充:

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