-------------------- 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. ping探测在线主机

    一.实验要求: 1.对于给定范围的ip地址进行主机在线测试 2.ping测试结果保存在/tmp/ping目录下以时间戳为文件名的文件里,以便后续查看 二.实验过程: #!/bin/env/ bash# ...

  2. delphi 四舍五入Round函数【百帖整理】

    在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的.这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 ...

  3. jq 全选、反选、判断选中的条数

    1.全选或全不选.当勾选全选按钮#selectAll旁边的复选框#all时,列表中的选项全部选中,反之取消勾选则列表中的选项全部为未选中状态. $("#all").click(fu ...

  4. ES6之Array.includes()函数

    一.定义 includes() 方法用来判断一个数组是否包含一个指定的值,如果是返回 true,否则false. 二.语法 arr.includes(searchElement) arr.includ ...

  5. unity3d Resources.Load动态加载资源

    初步整理并且学习unity3d资源加载方法,预计用时两天完成入门学习Unity3d常用两种加载资源方案:Resources.Load和AssetBundle Resources.Load就是从一个缺省 ...

  6. Skiing(最短路)

    poj——3037 Skiing Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4921   Accepted: 1315 ...

  7. NLP项目

    GitHub NLP项目:自然语言处理项目的相关干货整理 自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域.本文作者为自然语言处理NLP初学者整理了 ...

  8. JVM 常用命令

    对于有图形化界面的用户来,jconsole就可以搞定,界面使用很简单 还可以查看很多信息,例如检测死锁. 下面是没有图形化界面的系统 可以用命令 : jps 查看jvm 进程 jstack -l  6 ...

  9. SpringMVC整合MongoDB

    首先,在pom文件中新增spring-data-mongodb的依赖: <dependency> <groupId>org.springframework.data</g ...

  10. PHP微信公众平台OAuth2.0网页授权,获取用户信息代码类封装demo(二)

    一.这个文件微信授权使用的是OAuth2.0授权的方式.主要有以下简略步骤: 第一步:判断有没有code,有code去第三步,没有code去第二步 第二步:用户同意授权,获取code 第三步:通过co ...