这段时间一直在研究消息方法之类的问题,今天正好有机遇和大家共享一下.
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在消息派发中还是有很多很深刻的地方,很多内容也希望有机遇再探究竟
(未完待续........)
文章结束给大家分享下程序员的一些笑话语录:
自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。