• 【温故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窗口函数注册机制研究手记》

  • 相关阅读:
    MVC: Connection String
    Web API: Security: Authentication and Authority
    Web API: Security: Basic Authentication
    Web API: Client: HttpClient Message Handlers
    Web API: Client: Call a Web API from a .net client
    C#: Delegate and Event
    IIS Media Service: Channel 小结
    WCF: Retry when service is in fault state.
    Windows Azure: Service Bus Relay
    i2c 过程详解(转)
  • 原文地址:https://www.cnblogs.com/liustdelphi/p/3843971.html
Copyright © 2020-2023  润新知