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中分不同情况作了不同处理,逻辑稍复杂一些,但功能是一样的.
Delphi中有关窗口绘制的更多相关文章
- Delphi中正常窗口的实现
摘要: 在Delphi的VCL库中,为了使用以及实现的方便,应用对象Application创建了一个用来处理消息响应的隐藏窗口.而正是这个窗口,使得用VCL开发出来的程序存在着与其他窗口不能正常排列平 ...
- 有谁知道Delphi中"窗口"的创建过程?
求助:有谁知道Delphi中窗口的创建过程,此“窗口”不仅仅指 TForm 类型, 还包括一般的窗口控件,如TButton,TEdit等等,希望有能够十分详细的运作 过程,比如说CreatPara ...
- 在Delphi中如何控制其它应用程序窗口
在编写Delphi的应用程序中,常常涉及对其它Windows应用程序的操作.例如,在数据库的管理系统中,财务人员需要使用计算器,即可调用Windows内含的计算器功能,若每次使用,均通过“开始/程序/ ...
- Delphi中使用Dos窗口输出调试信息
在项目文件 *.DPR (Project->View Source) 里加上{$APPTYPE CONSOLE} 然后,在需要输出处加上 Writeln(‘your debug messa ...
- DELPHI中MDI子窗口的关闭和打开
DELPHI中MDI子窗口的关闭 和打开 Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会 发觉该子窗口只是最小化,而不是你预期的那样被 ...
- DELPHI中MDI子窗口的关闭 和打开
Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭.解决办法是在子窗口的OnClose事件处理过程中加入如 ...
- Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.
Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏. Delphi中,除了应用程序主窗口会显示在任务栏上,其它窗口默认都不会显示在任务栏.没有MS开发环境中的ShowI ...
- DELPHI中如何闪烁应用程序窗口或任务栏按钮
使用FlashWindowEx函数: 一.设置FlashWInfoDelphi中TFlashWInfo申明如下:TypeTFlashWInfo = record cbSize : LongInt; h ...
- Delphi中编辑word
其他(28) //启动Word try wordapplication1.connect; except messagedlg('word may not be ins ...
随机推荐
- go对json对象的生成和解析
https://blog.csdn.net/benben_2015/article/details/78917374
- 《转载》强大全面的C++框架和库推荐!
C++ 资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++标准库,包括了STL容器,算法和 ...
- 转载>>C# Invoke和BeginInvoke区别和使用场景
转载>>C# Invoke和BeginInvoke区别和使用场景 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程 ...
- [原]Docker-issue(2) http: server gave HTTP response to HTTPS client
系统环境 查看 文章末尾 附录 问题点:新建local registry后,push新的image到local registry 未能成功,并报错误: The push refers to repo ...
- MySQL 在高并发下的 订单撮合 系统使用 共享锁 与 排他锁 保证数据一致性
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- CentOS7.X安装LMMP环境Nginx+PHP+Mysql详解
前言: 作为PHP开发者,我们常用的线上环境就是LNMP,合理的搭建也是必须掌握的技能,下面就利用源码的方式详细介绍下LNMP环境Nginx+PHP+Mysql的详细搭建步骤: 版本说明: Nginx ...
- 下载Crypto,CyCrypto,PyCryptodome 报错问题
python下载Crypto,CyCrypto,PyCryptodome,如有site-packages中存在crypto.pycrypto,在pip之前,需要pip3 uninstall crypt ...
- laravel安装一直报错
laravel安装一直报错 原因: 1.找到php版本是否对应 2.缺少第三方扩展库vendor 需要composer update 解决链接:https://learnku.com/docs/lar ...
- 基本的sqlplus命令
以下是一些sqlpus命令 remark 注释行set headsep 标题分隔符ttitle 头标题btitle 尾标题column ...
- mysql日志分类
mysql的日志分类: (1)错误日志:记录mysql服务的启动,运行,停止mysql服务时出现的问题 [mysqld] log_error=[/path/filename] (2)通用查询日志:记录 ...