Delphi Invalidate的用法

起初听说delphi有个invalidate的函数,它可以使窗体画板上被“抹掉”的图像重新出现。当时我十分不解,因为电脑怎么知道原来的图应该是什么样的呢?难道它能记住CPU执行过的最新一条绘图指令并再度运行?看看作者这篇,让你恍然大悟。

 

Delphi Invalidate的用法

 

作者:张志峰

1、Invalidate介绍  void Invalidate( BOOL bErase = TRUE );
  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
2、与UpdateWindow( )的区别
  UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。

Delphi中的代码

procedure TWinControl.Invalidate;
begin
  Perform(CM_INVALIDATE, 0, 0);
end;

这个方法会使窗口重绘。

分类: Delphi

 

————————————————————————————————————————

读后感:但invalidate绝不仅仅是执行用户在onpaint函数内编写的语句,那些shape、image也会在form刷完笔画后重绘,并按一定顺序覆盖。真实的运行比我们看到的函数要复杂得多。一个窗口配备有onpaint、onclick等诸多敏感事件,待命阶段随时可以因触发而进入,你点了button1click(这其实在button1的event内,但却是为button1的parent即form所为),就会执行之内函数,结束在出来。但如果拿窗口去刷,那么只有被刷的部分会执行上述重绘操作,其余部分仿佛没有受函数管辖一样。对于填写onpaint事件的程序,如果在程序运行时乱刷屏,那么很多触发(比如定时器)就极有可能丢失!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值