-------------------- 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. AC日记——爱改名的小融 codevs 2967

    2967 爱改名的小融  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 白银 Silver 题解       题目描述 Description Wikioi上有个人叫小融,他喜欢 ...

  2. [Inside HotSpot] Java分代堆

    [Inside HotSpot] Java分代堆 1. 宇宙初始化 JVM在启动的时候会初始化各种结构,比如模板解释器,类加载器,当然也包括这篇文章的主题,Java堆.在hotspot源码结构中gc/ ...

  3. spring boot教程(一):入门篇(非原创,总结笔记性质)

    一,什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  4. JAVA算法总结_时间复杂度_Demo

    JAVA面试中经常问到排序算法问题,本人结合网络上一些资源整理了编写一下常用的Demo,并附带运行结果,希望能帮助到大家. /** * @Title: 冒泡排序 * @Description: 将数组 ...

  5. RabbitMQ 最常用的三大模式

    目录 Direct 模式 Topic 模式 Fanout 模式 Direct 模式 所有发送到 Direct Exchange 的消息被转发到 RouteKey 中指定的 Queue. Direct ...

  6. PyTorch学习问题记录

    Q1:def train() 中的model.train()的作用是什么?为什么要写? A1:class torch.nn.Module中 train(mode=True) Sets the modu ...

  7. CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z

    public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...

  8. Android自己定义组件系列【6】——进阶实践(3)

    上一篇<Android自己定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计 ...

  9. VS&quot;后生成事件&quot; 菜单的使用

    网上有很多的文章都在介绍怎样创建一个自己定义的dll文件,以及怎样使用一个dll文件,在此不在赘述.本文主要介绍怎样使用VS2008的"生成后事件"的命令行,将一个dll文件直接复 ...

  10. ※版本管理※=>☆SVN工具=>※解决地域麻烦※№→搭建自己的网络SVN (SourceForge 免费) [转]

    源文 http://blog.csdn.net/xiaoting451292510/article/details/8562570 分类: 版本管理 2013-02-01 14:44 26057人阅读 ...