-------------------- 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消息的三种不同处理(虚函数的特点就是升升降降)的更多相关文章

  1. RocketMQ(6)---发送普通消息(三种方式)

    发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...

  2. ActiveMQ持久化消息的三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...

  3. Kafka生产者发送消息的三种方式

    Kafka是一种分布式的基于发布/订阅的消息系统,它的高吞吐量.灵活的offset是其它消息系统所没有的. Kafka发送消息主要有三种方式: 1.发送并忘记 2.同步发送 3.异步发送+回调函数 下 ...

  4. Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)

    实例1 unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...

  5. 终于懂了:WM_PAINT中应该用BeginPaint与EndPaint这两个api,它们的功能正是使无效区域恢复(所以WM_PAINT里即使什么都不做,也必须写上BeginPaint与EndPaint)——Delphi里WM_PAINT消息的三个走向都做到了这一点 good

    程序本来是想实现鼠标单击改变背景颜色.可是,程序运行时,为什么没有任何消息触发,背景颜色就一直不断的改变了?WM_PAINT怎么被触发的 #include <windows.h> #inc ...

  6. TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)

    前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...

  7. 终于懂了:TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处)

    我忽然发现:TButton既没有处理WM_PAINT,又没有Paint()或者PaintWindow(),那么它是什么时候被绘制的? Form1上放2个TButton,然后设置代码: procedur ...

  8. 用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good

    fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来. VCL 无标题栏窗口的阴影很麻烦 280425268 我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinContro ...

  9. TWinControl与TControl的覆盖函数(TWinControl对TControl的10个消息覆盖函数,17个覆盖函数,私有虚函数仍可多态)

    手工找出来,对比一下,有助于VCL框架的理解.----------------------------------------------------------------------------- ...

随机推荐

  1. BQ25890 charging ic evb 使用注意事項

    Origin : 今天做了一個小實驗, 從 bq25890 spec 可以知道, enable bq25896 充電的功能,有二個條件, 1.CHG_CONFIG bit 需為1. 2.ce pin ...

  2. poj 2253(kruskal)

    Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34968   Accepted: 11235 Descrip ...

  3. LeetCode OJ-- Sqrt(x) *

    https://oj.leetcode.com/problems/sqrtx/ 求一个数的开方,二分查找一个数,直到这个数的平方 - target 小于 0.001. 但这道题出的不好,返回值竟然是 ...

  4. 回调函数 typedef bool (*IsUsed)(const string &name,boost::shared_ptr<ShpGeometry> oneGeometry);

    就是指向函数的指针. 回调函数,表示了一个函数的地址,将函数作为参数进行使用.参考百度百科:http://baike.baidu.com/view/414773.htm 常用的大概就是在sort函数中 ...

  5. Codeforces 321D Ciel and Flipboard(结论题+枚举)

    题目链接   Ciel and Flipboard 题意  给出一个$n*n$的正方形,每个格子里有一个数,每次可以将一个大小为$x*x$的子正方形翻转 翻转的意义为该区域里的数都变成原来的相反数. ...

  6. DNA的分子结构

    DNA是由两条链组成的, 这两条链按反相平行的方式盘旋成双螺旋结构 DNA分子中的脱氧核糖和磷酸交替连接, 排列在外侧, 构成基本骨架; 碱基排列在内侧. 两条链上的碱基通过氢键连接成碱基对, 并且其 ...

  7. Delphi Helper Record Class

    unit Unit1; {$DEFINE USESGUIDHELP} interface implementation {$IFDEF USESGUIDHELP} uses System.SysUti ...

  8. iOS -- app全局字体设置

    方法一: 写一个UILabel(FontExtension)扩展重写initWithFrame(手写代码必走方法)和awakeFromNib(xib必走方法)当然UIButton.UITextView ...

  9. win7 32位配置apache+wsgi+django环境

    1下载xampp,里面有apache,mysql,phpmyadmin, 2 下载wsgi,http://download.csdn.net/download/copter/9192361 将对应的模 ...

  10. java单测时的等待模块awaitility

    单测时,可以用来等待异步任务完成 在编写自动化测试用例过程中,往往会遇见被测代码有异步或者队列处理的中间过程:如果需要校验这部分结果,必须等待异步操作结束或队列消费完,而这个中间等待的时间是不确定的, ...