熬之滴水穿石:Delphi曾经的利器(5)

                                                               9--强大的窗口消息
早年用Delphi做MIDAS的中间软件,或是采取Socket服务编程。对于消息的理解很是片面,以为只有搞Socket编码才是搞消息编程。当时对于winodws的消息机制基本上一无所知,当然这也拜强大的RAD工具所赐。02年做项目时遇到合作单位的一个VC程序员,我看他编写的界面程序比我难十倍,我从他的代码里看到了一些复杂的内容,那个时候我才恍然大悟,原来VCL封装了整个窗口消息,又触发窗口消息去处理消息。这个一个多么强大多么复杂的机制。那一刻,我重新审视起自己对于windows编程的认识。作为windows程序员,就是该学会如何去封装、结合和分派消息。这些内容如果学会了,其实关于windows编程这块也就所向披靡了,但这也是有些难度的。窗口消息和动态对象巧妙联系一起,是delphi的界面编程最大的特色。
在之前的windows编程中,我曾说过windows系统是把窗口消息分派给窗口回调函数的,所以应用程序都需要向窗口注册的回调函数来派发消息。实际上VCL里面分派消息都是以虚方法实现的,消息的分派都是传递给TwinControl的派生类,所以在WinControl的类中的WindProc实际上是个虚方法。而派生该类的那些窗口控件的wndproc方法都是采取的覆盖(override)方式.我们可以这么理解VCL有将windows系统触发的事件转成相应的消息对象,又会将这些消息对象分发给相应的组件。当然装填这些消息的就是消息队列了。其实vcl也是调用自身的api函数,这个函数在原window的方法了。所有的应用创建时会为自己的form进行register时会提供回调函数,正是这个回调函数让windows能够顺利调用处理方法了。
我们从Twincontrol类往上走,直到Tobject.在这个类中就定义了消息分派的方法,和之前说过的设计方法一样,dispatch方法也是一个虚方法,这个方法是这样定义的: Procedure Dispatch(var Message):virtual;
该消息类型的定义不单只是处理窗体消息还可以处理其它消息。当然在消息处理的机制中最为重要的是DispatchMessage的类,该类的定义借鉴了Message类的参数。TObject的消息分派之前已经有VCL的底层找到了相关的VCL组建,这个时候窗口回调函数的句柄其实就是代表窗口消息的窗口。实际上当我们在DELPHI里运用对象查看器查看事件处理函数时,实际上这是VCL的一种动态方法实现的,而这些方法都是记录在VCL的一个动态方法表中的,可以理解实际上就是一个动态的指针。消息的分配机制我们可以这样的过一遍了:
1) 从消息队列中取消息
2)根据消息ID解析消息,并根据消息找到相应的VCL组件。
3)然后再根据组件的事件去动态方法表中去查找相应的处理方法。
4)调用wmcommand方法。
当然现实中也有这种情况,很多窗体或控件的事件并不是在对象属性器里编辑生成。而是写在程序体内在初始时通过赋值实现的,但是这种情况下,在VCL的动态方法表中就没有相关的事件方法了。这种情况又将怎么办呢?
好呢,该好好总结一下了。
在VCL的消息派发中,实际上是存在2中消息派发机制的,一种是通过VCL控件的事件处理函数处理消息,这样一来在Dispatch中就会在动态方法表中搜寻动态方法,然后调用该方法。另一种则是对触发的消息不分配,使用默认的DefaultHandle方法来实现的。
VCL在消息派发中还是有许多很深入的地方,很多内容也希望有机会再探究竟
                                                                                                       (未完待续........)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值