【温故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窗口函数注册机制研究手记》
【温故Delphi】之VCL消息机制小结的更多相关文章
- Unity 游戏框架搭建 2019 (五十、五十一) 消息机制小结&MonoBehaviourSimplify 是框架?
我们花了 5 篇文章学习了消息机制的方方面面.并且完成了一个简易消息机制,之后集成到了我们的 MonoBehaviourSimplify 里. 现在 MonoBehaviourSimplify 有一点 ...
- 深入理解Delphi的消息机制(别人写的,简明扼要,用来复习)
永远记住,无论你是用 SDK 还是借用 VCL 来创建窗口,都要遵循 Windows 的游戏规则,即先注册窗口类,然后再创建窗口实例,在消息循环中写实现代码.你还要知道 Windows 已经为了我们预 ...
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- 深入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 ...
- 利用消息机制实现VC与Delphi之间的通讯(发送自定义消息)
摘要: 本文介绍了使用Windows消息机制实现由不同语言编制的程序之间的相互通讯.联系,并以当前较为流行的两种语言Microsoft Visual C++ 6.0和Borland delphi 5. ...
- Windows消息机制要点
1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...
- Delphi的组件读写机制
Delphi的组件读写机制(一) 一.流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特 ...
- Delphi中的消息 (转载)
消息是Windows发出的一个通知,它告诉应用程序某个事件发生了.在Delphi中,大多数情况下Windows的消息被封装在VCL的事件中,我们只需处理相应的VCL事件就可以了,但如果我们需要编写自己 ...
- 转:Windows消息机制要点
Windows消息机制要点 1. 窗口过程 每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...
随机推荐
- python反射原理
1.反射原理 通过字符串的形式导入模块: __import__(),可以以字符串的形式导入模块. 通过字符串的形式导入函数: 反射: 根据字符串去某个对象里面取东西,可以是字符串,函数,数字. 根据字 ...
- Modern Operating Systems(Ⅰ)——2014.12.15
进程 进程模型 进程就是一个正在执行的程序的实例 值得注意的是,若一个程序运行了两遍,则算作两个进程 创建进程 在通用系统中,有四种主要事件导致进程的创建 ①系统的初始化 ②执行了 正在 ...
- C#,java,C++ 等变量命名规则
命名规则: 必须以“字母” .“_”或“@”开头,不要以数字开头. 后面可以跟任意“数字”,“字母”,“下划线”. ---注意:自己起的名字尽量避免与系统中的关键字重复.不推荐重新定义相同的变量名. ...
- android 对View的延时更换内容
一.当ImageView按下时可以跟换一张按下效果的图片进行显示,使用postDelayed即可以让view在规定时间后执行run()中的内容 img.setImageResource(R.drawa ...
- C#继承里的【就近原则】
参考博客:http://www.cnblogs.com/waynechan/p/3570702.html#2883966 参考书籍:<你必须知道的.NET>,作者王涛http://www. ...
- eclipse中的 Compiler compliance level含义
The compiler compliance setting tells the compiler to pretend it's a different version of Java. The ...
- 浅谈Java 8的函数式编程
函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码.这意味着函数应该是第一等级(First-class)的值,并且能够被赋值给变量,传递给函数等等.(转载自http://xz.p ...
- 在已有 Ubuntu 的基础上硬盘安装 Win7 实现双系统
. . . . . LZ 的笔记本电脑一直安装的是 Ubuntu 系统,最近由于工作需要,要安装一个 Win7 系统.大家都知道,Linux 和 Windows 装双系统的时候要先装 Win 再装 L ...
- easy ui 框架
Easy UI 准备工作(搭建) 1.在WebRoot 的目录下创建js 文件夹,在文件夹中倒入一下两个包 Jquery.easyui.min.js jquery.min.js 2.在WebRoot ...
- [刘阳Java]_MyBatis_映射文件的resultMap标签入门_第4讲
<resultMap>:用于解决实体类中属性和表字段名不相同的问题 id:表示当前<resultMap>标签的唯一标识 result:定义表字段和实体类属性的对应关系 prop ...