我想了解DELPHI是怎样处理消息机制的。假如我发一个SENDMESSAGE(HANDLE,WM_PCHAR,WPARM,LPARM)或者说点击一下BUTTON

  • 主题发起人 主题发起人 hzjone
  • 开始时间 开始时间
H

hzjone

Unregistered / Unconfirmed
GUEST, unregistred user!
我想了解DELPHI是怎样处理消息机制的。假如我发一个SENDMESSAGE(HANDLE,WM_PCHAR,WPARM,LPARM)或者说点击一下BUTTON &nbsp;DELPHI与WINDOW究竟做了什么。 ( 积分: 83 )<br />我想了解DELPHI是怎样处理消息机制的。假如我发一个SENDMESSAGE(HANDLE,WM_PCHAR,WPARM,LPARM)或者说点击一下BUTTON &nbsp;DELPHI与WINDOW究竟做了什么。<br>这是我对SENDMESSAGE这样理解对吗? <br>sendmessage()把消息发送到窗口过程(WNDPROC),消息进入WNDPROC后,VCL进行处理,再用DISPATCH()发送消息, <br>在SYSTEM.PAS中处理TObject.Dispatch(var &nbsp;Message). <br><br>WINDOWS中的得到消息,消息队列,消息循环在: <br>Application.Run中. <br>谢谢。
 
我想了解DELPHI是怎样处理消息机制的。假如我发一个SENDMESSAGE(HANDLE,WM_PCHAR,WPARM,LPARM)或者说点击一下BUTTON &nbsp;DELPHI与WINDOW究竟做了什么。<br>这是我对SENDMESSAGE这样理解对吗? <br>sendmessage()把消息发送到窗口过程(WNDPROC),消息进入WNDPROC后,VCL进行处理,再用DISPATCH()发送消息, <br>在SYSTEM.PAS中处理TObject.Dispatch(var &nbsp;Message). <br><br>WINDOWS中的得到消息,消息队列,消息循环在: <br>Application.Run中. <br>谢谢。
 
你应该去看一下深入浅出VCL等其它有点深度的书
 
我已经看完了DELPHI开发人员指南。哈哈。可惜功底有限。
 
有本书叫《高手突破》是很不错的,我这里也有(电子版),不知道能不能给你,给你算不算是侵权,那里面有
 
来晚了,那个<delphi高手突破>讲得很好,去看看吧..不错...delphi园地有下
 
delphi高手突破我也看过了。不够详细啊。哈哈
 
只要能说出消息的全过程我就给分。例如。我按下BUTTON后。是不是要先传一个消息到操作系统。之后操作系统再把消息分发到应用程序。之后进入TCONTROL类中的WNDPROC中。然后再分发到各各句柄中。是不是啊。如果不是的话。请说明。
 
一些我的理解:<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---&gt;控件--(调用)--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对没有处理的消息进行默认处理。
 
谢谢。JONSON——SUNSHINE。
 

Similar threads

I
回复
0
查看
580
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
633
import
I
后退
顶部