【温故Delphi】之VCL消息机制小结

时间:2022-10-29 08:11:37

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

【温故Delphi】之VCL消息机制小结的更多相关文章

  1. Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?

    我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...

  2. 深入理解Delphi的消息机制(别人写的,简明扼要,用来复习)

    永远记住,无论你是用 SDK 还是借用 VCL 来创建窗口,都要遵循 Windows 的游戏规则,即先注册窗口类,然后再创建窗口实例,在消息循环中写实现代码.你还要知道 Windows 已经为了我们预 ...

  3. DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)

    DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...

  4. 深入Delphi -- Windows 消息机制

    http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...

  5. 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)

    摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...

  6. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

  7. Delphi的组件读写机制

    Delphi的组件读写机制(一) 一.流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特 ...

  8. Delphi中的消息 (转载)

    消息是Windows发出的一个通知,它告诉应用程序某个事件发生了.在Delphi中,大多数情况下Windows的消息被封装在VCL的事件中,我们只需处理相应的VCL事件就可以了,但如果我们需要编写自己 ...

  9. 转:Windows消息机制要点

    Windows消息机制要点 1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...

随机推荐

  1. Insert or Merge && Insertion or Heap Sort

    原题连接:https://pta.patest.cn/pta/test/1342/exam/4/question/27102 题目如下: According to Wikipedia: Inserti ...

  2. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisService中存在大量的重复代码,看起来不是很清楚,但第一次那样写,是为了解mybatis的执行步骤,先 ...

  3. Parallel并行编程

    Parallel并行编程 Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工 ...

  4. gitlab的docker安装,非标准端口,如何处理?

    这个问题的定义是: 如果我们不是用的80端口对外提供服务, 但gitlab的docker容器里的nginx却是80端口, 那么,在我们clone代码时,带的Http地址也会是80端口,这显然会出现问题 ...

  5. glfw3native.h and glfw3.h

    https://www.glfw.org/docs/latest/files.html

  6. 代码管理(二)sourcetree 安装与使用

    一 .SourceTree简介 SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是Mercurial和Subve ...

  7. Java的图形用户界面的基本工具

    AWT(Abstract Window Toolkit),中文译为抽象窗口工具包,该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具. AWT中 ...

  8. [转] Moran's I

    李旭, Matlab: Moran's I原文地址 Introduction In statistics, Moran's I is a measure of spatial autocorrelat ...

  9. Android Studio NDK 新手教程(5)--Java对象的传递与改动

    概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.改动Java对象.以及性能对照. 通过JNIEnv完毕数据转换 Java对象是存在于JVM虚拟机中的,而C+ ...

  10. sql2000实现row_number

    一.以PersonID,classid,dt_ClassData为条件进行分组,每个小组加序号,row_number在sql2005中不可用 方法一.sql2000及以上版本--以PersonID,c ...