TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)
-------------------- TWinControl收到WM_Paint消息(以后找个例子)--------------------
1. 消息函数 TWinControl.WMPaint (默认不是双缓冲)
2.1 如果没有csCustomPaint状态,并且没有子控件,那么执行inherited,也就是寻找消息索引函数,以及TWinControl.DefaultHandler做进一步处理,后面怎么样不清楚。比如TButton就是继承自它的,有空做实验仔细看看。不过鉴于WM_Paint无处不在,IDE又会被它中断,因此调试研究有些困难。本来也可以写个文本文件记录消息,但是Delphi的消息又是没有句柄的,没法直接用来做比较,唉,还是得自己想明白了才行,做实验还在其次。
2.2 如果有csCustomPaint状态,就调用,普通函数 TWinControl.PaintHandler(Message);
1).API剪裁所有子控件 ExcludeClipRect;
2).重画自己,虚函数 TWinControl.PaintWindow;
3).重画所有子控件,普通函数 PaintControls(挨个给子控件发送WM_PAINT消息,最后还要给窗口控件画边框。如果没有子控件这步什么都不做。)
-------------------- TCustomControl收到WM_Paint消息(大多数窗口控件)--------------------
1. 消息函数 TCustomControl.WMPaint,增加csCustomPaint状态
2. 有csCustomPaint状态,就调用,inherite TWinControl.WMPaint
3. 调用,普通函数 TWinControl.PaintHandler(Message);
1). API剪裁所有子控件 ExcludeClipRect;
2). 重画自己,TCustomControl.PaintWindow; 这里又会进一步调用TCustomControl.Paint; 函数(最关键的一步)
3). 重画所有子控件,普通函数 PaintControls(挨个给子控件发送WM_PAINT消息,最后还要给窗口控件画边框。如果没有子控件这步什么都不做。)
最后还要去掉csCustomPaint状态
-------------------- TGraphicControl收到WM_Paint消息(大多数图形控件)--------------------
1. 消息函数 TGraphicControl.WMPaint
2. 调用,虚函数 TGraphicControl.Paint; (到这步就完成了)
总结1:虚函数的特点就是升升降降,在重复利用父类函数(资源)的同时,即使调用同一名称的函数(必须是虚函数;即使是普通函数里也有可能调用其它虚函数),如有必要就自动调用子类覆盖的虚函数,而不必重新修改父类函数的代码。
总结2:这里只说收到WM_PAINT以后怎么做,没说之前是怎么做的,谁来发送WM_PAINT,为什么要发送这个消息等等,其实就是当系统探测到当前显示窗口有无效区域,就会发送WM_PAINT消息来要求重绘.
TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)的更多相关文章
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...
- ActiveMQ持久化消息的三种方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...
- Kafka生产者发送消息的三种方式
Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...
- Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)
实例1 unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...
- 终于懂了:WM_PAINT中应该用BeginPaint与EndPaint这两个api,它们的功能正是使无效区域恢复(所以WM_PAINT里即使什么都不做,也必须写上BeginPaint与EndPaint)——Delphi里WM_PAINT消息的三个走向都做到了这一点 good
程序本来是想实现鼠标单击改变背景颜色.可是,程序运行时,为什么没有任何消息触发,背景颜色就一直不断的改变了?WM_PAINT怎么被触发的 #include <windows.h> #inc ...
- TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...
- 终于懂了:TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处)
我忽然发现:TButton既没有处理WM_PAINT,又没有Paint()或者PaintWindow(),那么它是什么时候被绘制的? Form1上放2个TButton,然后设置代码: procedur ...
- 用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good
fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来. VCL 无标题栏窗口的阴影很麻烦 280425268 我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinContro ...
- TWinControl与TControl的覆盖函数(TWinControl对TControl的10个消息覆盖函数,17个覆盖函数,私有虚函数仍可多态)
手工找出来,对比一下,有助于VCL框架的理解.----------------------------------------------------------------------------- ...
随机推荐
- BQ25890 charging ic evb 使用注意事項
Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...
- poj 2253(kruskal)
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 34968 Accepted: 11235 Descrip ...
- LeetCode OJ-- Sqrt(x) *
https://oj.leetcode.com/problems/sqrtx/ 求一个数的开方,二分查找一个数,直到这个数的平方 - target 小于 0.001. 但这道题出的不好,返回值竟然是 ...
- 回调函数 typedef bool (*IsUsed)(const string &name,boost::shared_ptr<ShpGeometry> oneGeometry);
就是指向函数的指针. 回调函数,表示了一个函数的地址,将函数作为参数进行使用.参考百度百科:http://baike.baidu.com/view/414773.htm 常用的大概就是在sort函数中 ...
- Codeforces 321D Ciel and Flipboard(结论题+枚举)
题目链接 Ciel and Flipboard 题意 给出一个$n*n$的正方形,每个格子里有一个数,每次可以将一个大小为$x*x$的子正方形翻转 翻转的意义为该区域里的数都变成原来的相反数. ...
- DNA的分子结构
DNA是由两条链组成的, 这两条链按反相平行的方式盘旋成双螺旋结构 DNA分子中的脱氧核糖和磷酸交替连接, 排列在外侧, 构成基本骨架; 碱基排列在内侧. 两条链上的碱基通过氢键连接成碱基对, 并且其 ...
- Delphi Helper Record Class
unit Unit1; {$DEFINE USESGUIDHELP} interface implementation {$IFDEF USESGUIDHELP} uses System.SysUti ...
- iOS -- app全局字体设置
方法一: 写一个UILabel(FontExtension)扩展重写initWithFrame(手写代码必走方法)和awakeFromNib(xib必走方法)当然UIButton.UITextView ...
- win7 32位配置apache+wsgi+django环境
1下载xampp,里面有apache,mysql,phpmyadmin, 2 下载wsgi,http://download.csdn.net/download/copter/9192361 将对应的模 ...
- java单测时的等待模块awaitility
单测时,可以用来等待异步任务完成 在编写自动化测试用例过程中,往往会遇见被测代码有异步或者队列处理的中间过程:如果需要校验这部分结果,必须等待异步操作结束或队列消费完,而这个中间等待的时间是不确定的, ...