一些我的理解:<br>Delphi的对象框架以类的形式封装每一个窗口本身的控件,处理控件的消息由每一个<br>封装类来实现,而不是将处理都交给控件所在窗口。<br>Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。<br>当一个事件发生时,windows先将输入的消息放入系统消息队列中,然后再将输入的<br>消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每<br>一个消息并发送给相应的窗口函数中。<br>假设已经将消息发送给了程序窗口,则框架会据此消息调用到窗体的MainWndProc函数<br>来处理此消息,MainWndProc又是不直接处理消息,而是交给WndProc函数进行处理,从窗<br>口类开始,如果本类的WndProc没有处理此消息,则一级一级往上溯,直至TControl的WndProc,如果TControl.WndProc仍没有处理此消息,则TControl又会调用TObject的消<br>息分派虚拟方法Dispatch来处理此消息。TObject.Dispatch方法会在窗口的动态方法表<br>中搜寻处理消息的动态方法指针,如果本窗体方法表中没有相应方法指针,则再往上溯到<br>父类的动态方法表中搜寻处理方法,一直到找到处理方法为止。<br>组件的封装实现了消息处理方法的一级一级调用,可以用一个简单的图说明:<br>触发消息Message--->控件--(调用)--MainWndProc--(调用)--WndProc(如处理不了,则<br>调用父类WndProc处理,如TWinControl.WndProc--调用--TControl.WndProc)--(直到TControl.Wndproc都处理不了,则)--(调用)--TObject.Dispatch-----根据Message的<br>控件句柄值到控件的动态方法表中找消息处理方法----如未找到,则再上溯到父类方法<br>表中寻找处理方法(指针)---如找到,则调用此处理方法。<br>典型的消息处理的动态方法是Button的Click方法,Delphi组件框架在TButton类内部对<br>此过程和编程时编写的OnClick事件下的程序代码进行了联系,这样,编程时可以方便<br>的编写OnClick事件,实现时通过以上流程找到并调用Click方法联系<br>的Form1.Button1Click(Sender: TObject);方法。<br>实际上这是一个按照继承关系一层一层调用处理方法的过程。此外,消息机制提供了最后<br>一个默认的消息处理方法Defaulthandler对没有处理的消息进行默认处理。