Invalidate方法通知Windows应该重新绘制表单的整个表面。最重要的是Invalidate不会立即强制执行绘制操作。 Windows只是存储请求,并且只会响应它
当前程序完全执行后,并且只要系统中没有其他待处理事件。 Windows故意延迟绘画操作,因为它是最耗时的操作之一。有时,这种延迟,
只有在多次更改后才能绘制表单,避免多次连续调用(慢)绘制方法。
•Update方法要求Windows立即更新表单的内容并重新绘制
。但请记住,只有存在无效区域时才会执行此操作。如果刚刚调用了Invalidate方法或结果,则会发生这种情况
用户的操作。如果没有无效区域,则对Update的调用完全没有效果。出于这个原因,通常在调用Invalidate后才会看到对Update的调用。
这正是两个Delphi方法Repaint和Refresh所做的。
•Repaint方法按顺序调用Invalidate和Update。因此,它会立即激活OnPaint事件。此方法的版本略有不同,称为Refresh。对于表格,效果是一样的;对于组件,它可能会略有不同。

当您需要向表单请求重绘操作时,通常应该调用Invalidate,
遵循标准的Windows方法。这在您需要时尤为重要
经常请求此操作,因为如果Windows花费太多时间来更新
屏幕,重绘的请求可以累积成一个简单的重绘动作。该
Windows中的wm_Paint消息是一种低优先级消息。更确切地说,如果一个
请求重新绘制正在等待,但其他消息正在等待,其他消息在系统实际执行绘制操作之前处理。
另一方面,如果多次调用Repaint,则每次Windows可以处理其他消息之前必须重新绘制屏幕,​​并且由于绘制操作是计算密集型的,因此实际上可能会降低应用程序的响应速度。有时候,
但是,当您希望应用程序尽快重绘表面时。在这些不常见的情况下,调用Repaint是可行的方法。

另一个重要的考虑因素是在绘制操作期间,Windows只重绘了
所谓的更新区域,加快了操作。因此,如果您只使a无效
窗口的一部分,只有该区域将被重新绘制。要做到这一点,你可以使用
InvalidateRect和InvalidateRegion函数。实际上,这个功能是一把双刃剑。这是一种非常强大的技术,可以提高速度并减少频繁重绘操作引起的闪烁。另一方面,它也可能产生不正确的输出。
一个典型的问题是,只有一些受用户操作影响的区域实际被修改,而其他区域保持原样,即使系统执行应该更新它们的源代码。实际上,如果绘制操作落在更新区域之外,系统会忽略它,就好像它是ou

Refresh和Repaint是一样的,它只是简单地调用了Repaint.
Update会导致整个窗口(对于没有窗口的TGraphicControl来说,就是它的父控件的窗口)立即处理WM_PAINT消息,即重画应该画的部分.
Invalidate使控件所在窗口的控件客户区域(对于TWinControl来说就是它的客户区域,对于TGraphicControl来说就是它的父控件的窗口在它的区域范围内的部分)失效,从而产生一个WM_PAINT消息,

但并不马上重绘,直到其它消息处理完或遇到一个Update的调用.
Repaint是立即重绘该控件,在TWinControl中其实就是调用了Invalidate和Update,在TGraphiControl中分不同情况作了不同处理,逻辑稍复杂一些,但功能是一样的.

Delphi中有关窗口绘制的更多相关文章

  1. Delphi中正常窗口的实现

    摘要: 在Delphi的VCL库中,为了使用以及实现的方便,应用对象Application创建了一个用来处理消息响应的隐藏窗口.而正是这个窗口,使得用VCL开发出来的程序存在着与其他窗口不能正常排列平 ...

  2. 有谁知道Delphi中"窗口"的创建过程?

      求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...

  3. 在Delphi中如何控制其它应用程序窗口

    在编写Delphi的应用程序中,常常涉及对其它Windows应用程序的操作.例如,在数据库的管理系统中,财务人员需要使用计算器,即可调用Windows内含的计算器功能,若每次使用,均通过“开始/程序/ ...

  4. Delphi中使用Dos窗口输出调试信息

    在项目文件 *.DPR (Project->View Source)  里加上{$APPTYPE   CONSOLE} 然后,在需要输出处加上 Writeln(‘your debug messa ...

  5. DELPHI中MDI子窗口的关闭和打开

    DELPHI中MDI子窗口的关闭 和打开       Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会   发觉该子窗口只是最小化,而不是你预期的那样被 ...

  6. DELPHI中MDI子窗口的关闭 和打开

    Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭.解决办法是在子窗口的OnClose事件处理过程中加入如 ...

  7. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.

    Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.没有MS开发环境中的ShowI ...

  8. DELPHI中如何闪烁应用程序窗口或任务栏按钮

    使用FlashWindowEx函数: 一.设置FlashWInfoDelphi中TFlashWInfo申明如下:TypeTFlashWInfo = record cbSize : LongInt; h ...

  9. Delphi中编辑word

      其他(28)   //启动Word   try     wordapplication1.connect;   except     messagedlg('word may not be ins ...

随机推荐

  1. 在 windows 上安装免安装版的mysql

    在 windows 上安装免安装版的 1. 下载路径 https://downloads.mysql.com/archives/community/ 2. 解压 假设解压后的路径为:E:\Enviro ...

  2. struts表单域模型注入

    表单使用struts标签,表单中每一个字段都可以这样来赋值 类(action).成员变量 这个叫域模型注入 <s:form action="orders" method=&q ...

  3. 21 go并发编程-下

    如何等待一组goroutine结束 1. 使用不带缓冲区的channel实现. 原理: 每个goroutine都往一个channel里写入一个值,然后我们去遍历这个管道的数值,由于不带缓冲区,那么必须 ...

  4. js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合

    现在有一批手机,其中颜色有['白色','黑色','金色','粉红色']:内存大小有['16G','32G','64G','128G'],版本有['移动','联通','电信'],要求写一个算法,实现[[ ...

  5. 自己动手实现RPC

    一.需求:用户管理系统(UMS),仓库管理系统(WMS),订单管理系统(OMS) 现在OMS有一张订单表:[订单id,用户id,商品id,订单状态,订单时间],需要在客户端展示此订单对应的用户详情和商 ...

  6. 【面试题】java面试题整理(有空再贴答案)

    面试题+基础 各家的面试题其实都大同小异, 掌握基础和原理,走到哪都不怕. 基础 leetcode上有一些总结,star数非常高了.贴上url https://github.com/CyC2018/C ...

  7. tomcat启动出错 invalid LOC header

    tomcat启动出错 invalid LOC header,run as maven test 没有报错,只有警告: 'build.plugins.plugin.version' for org.ap ...

  8. nodejs electron 创建桌面应用

    //首先安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org //使用cnpm进行安装,使用方法和npm相同 cn ...

  9. Docker win10安装

    因为虚拟机还没装好,所以现在win10上安装Docker 1.首先下载Docker Toolbox,因为Docker for windows需要win10专业版或者其他64位版本,我的系统虽然也是wi ...

  10. python语法_字符串拼接

    +号可以用来做字符串拼接 print("abc"+"efg"+"def") abcefgdef 字符串(str)与数字(int)不能使用+进 ...