zoukankan      html  css  js  c++  java
  • Delphi中有关窗口绘制

    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中分不同情况作了不同处理,逻辑稍复杂一些,但功能是一样的.

  • 相关阅读:
    validation 参数效验框架
    小酌一下:Maven
    小酌一下:git 常用命令
    小酌一下:anaconda 基本操作
    小酌一下:Win10 解决fetch_20newsgroups下载速度巨慢
    学习笔记:Python3 异常处理
    学习笔记:Python3 面向对象
    学习笔记:Python3 函数式编程
    学习笔记:Python3 函数
    学习笔记:Python3 高级特性
  • 原文地址:https://www.cnblogs.com/Master-Qi/p/9674610.html
Copyright © 2011-2022 走看看