zoukankan      html  css  js  c++  java
  • 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消息来要求重绘.

  • 相关阅读:
    PHPStorm打开文件所在目录
    登录顺序图与项目部署图
    JAVA配置Tomcat
    设计模式与足球
    JAVA设计模式之【模板方法模式】
    JAVA设计模式之【策略模式】
    JAVA设计模式之【状态模式】
    JAVA设计模式之【观察者模式】
    phpstorm 或 webstorm 设置打开多个项目,多个项目并存。
    JAVA设计模式之【迭代器模式】
  • 原文地址:https://www.cnblogs.com/findumars/p/3681385.html
Copyright © 2011-2022 走看看