zoukankan      html  css  js  c++  java
  • 【温故Delphi】之VCL消息机制小结

    TObject消息分派

      procedure Dispatch(var Message); virtual;  #负责分派消息到特定VCL组件的事件处理函数

      procedure DefaultHandler(var Message); virtual;  

      #消息分类:通过子类覆盖此方法,处理窗口命令消息,窗口标准消息,VCL自行触发消息,VCL通知消息,自定义

    VCL封装类的方法种类

      procedure WMButtonUp(var Message: TWMButtonUp); message WM_LButtonUP  #windows消息

      proceudre CMParentFontChanged(var Message: TMessage); message ...  #处理VCL内部定义的消息

      procedure Click; dynamic;  #鼠标点击事件处理方法

      procedure Button1Click(Sender: TObject);  #鼠标事件的回调函数,用户可以扩展

    TApplication

      TApplication的创建 在Controls单元的初始化代码中。

      TApplication的秘密窗口

       Create方法 -> CreateHandle ->

       {

          FObjectInstance := MakeObjectInstance

          SetWindowLong(FHandle, GWL_WNDPROC, Longint(FObjectInstance))

       }

      TWinControl类和它的派生类,使用MainWndProc方法作为处理窗口消息的进入点函数。

        TControl的WndProc是真正处理窗口消息的函数。

    消息分派流程

    关键的一些函数:

      1、如何用类方法取代一般的窗口回调函数;

      2、InitWndProc

      3、MakeObjectInstance

      4、StdWndProc

      5、TObject的消息分派服务

    TButton类的Click

      TButtonControl覆盖WndProc方法,继承父类,到TControl.WndProc中调用Dispatch方法

      传递消息的ID为WM_COMMAND

      通过TCustomForm到TWinControl,WMCommand调用DoControlMsg,再调用FindControl

      这时找到了Button这个控件,再调用TControl.Perform方法

      Perform方法会再调用WndProc方法,经Dispatch发送消息

    TForm类

      比如鼠标点击,有直接对应的Windows消息。

    VCL设计模式

    Dispatcher模式

      使用场景:只要有正确的分类,每类有不同的处理方式,就可以使用。

      效果:可以有效避免大量分支,可以快速找到代码,便于维护。

    BroadCasting

      使用场景:将一致的消息分派给所有的子组件。

      使用实例:TWinControl.BroadCast

    问题

      VCL如何找到目标VCL组件的? TWinControl.WMCommand方法调用了DoControlMsg,其中调用了FindControl方法

    参考文献

      其他网上已经有很多类似的文字,在此引用下文献名称:

      《Delphi 消息机制学习笔记》

      《Delphi 的消息机制浅探》

      《VCL窗口函数注册机制研究手记》

  • 相关阅读:
    区块链价值
    区块链路线图
    Hyperledger Fabric Orderer节点启动
    使用 Docker 部署 Grafana + Prometheus 监控 MySQL 数据库
    CentOS 7.x 安装 Docker-Compose
    关于 Abp 替换了 DryIoc 框架之后的问题
    [Abp 源码分析]十七、ASP.NET Core 集成
    使用 DryIoc 替换 Abp 的 DI 框架
    《CLR Via C#》读书笔记:27.计算限制的异步操作
    《CLR Via C#》读书笔记:26.线程基础
  • 原文地址:https://www.cnblogs.com/liustdelphi/p/3843971.html
Copyright © 2011-2022 走看看