最近对消息的传递很是疑惑,
做了个试验,截获wm_keydown消息
分别在下面4个地方跟踪消息,
1,application.OnMessage中
2,窗体的wndproc方法中(在inherited之前)
3.memo控件的onkeydown事件
4.memo的父控件tmyPanel控件的wndproc方法(在inherited之前)
tmyPanel只是简单的继承tpanel,重载它的wndproc方法而已在memo中进行录入字符,
首先,4个地方都跟踪到了消息,
但4者执行顺序是1-4-2-3,
可见自application分发消息后,消息经过了memo控件的wndproc,又依次经过了memo控件的父窗口。
这个向上传递的规则是windows自有的吗?还是vcl处理的?所有的windows消息都会向上传递吗?
另外,在父窗口传递过程中(上例的2,4中),本来是wm_keydown($100)的消息,变成了$B02E这又是根据什么规则来变的呢?

解决方案 »

  1.   

    建议LZ找本这方面的书看看。一两句是说不清楚的,给你帖了一点资料,不知道是否有用。谈到V C L的消息系统时,除了m e s s a g e指示符外,还有很多值得讨论的。在Wi n d o w s发出一个消息后,要经过两步才能达到你的消息处理过程(也可能步骤更少)。在这条路线上,你可以操作消息。首先要讨论的是A p p l i c a t i o n . P r o c e s s M e s s a g e ( ),这个方法包含V C L主消息循环。另一个是A p p l i -c a t i o n . O n M e s s a g e事件,这个事件是当P r o c e s s M e s s a g e ( )从消息队列中检索到一个消息时触发的。因为发送消息不需要排队,所以不会触发O n M e s s a g e事件。另一个要讨论的是D i s p a t c h M e s s a g e ( ),这个A P I函数用于把消息传递给S t d W n d P r o c ( )函数。它由Wi n 3 2直接调用以发送消息。S t d W n d P r o c ( )函数起到汇集的作用,它从Wi n d o w s接收消息,再把消息发送给某个对象。V C L对象用于接收消息的方法叫M a i n W n d P r o c ( )。通过M a i n W n d P r o c ( ),可以对消息进行任何特殊的处理。不过,一般情况下很少直接用M a i n W n d P r o c ( )来处理消息,除非不想让消息通过V C L的消息系统派发。
    离开M a i n W n d P r o c ( )后,消息被传递给对象的W n d P r o c ( )方法,然后进入V C L的派发机制。派发机制即D i s p a t c h ( )方法把消息派发给一个消息句柄。
    消息到达处理该消息的处理过程后,经过处理过程的处理和最后的i n h e r i t e d语句,消息来到对象的D e f a u l t H a n d l e r ( )。这个方法对消息进行最后的处理,然后把消息传递给Wi n d o w s的D e f Wi n d o w P r o c ( )函数或其他默认的窗口过程。
      

  2.   

    这东西不是一句话两句话可以说完的
    你去找点文章看看啊
    强烈建议你去看  <<Delphi 5开发人员指南>>的第五章
      

  3.   

    >>可见自application分发消息后,消息经过了memo控件的wndproc,又依次经过了memo控件的父窗口。这个向上传递的规则是windows自有的吗?还是vcl处理的?所有的windows消息都会向上传递吗?另外,在父窗口传递过程中(上例的2,4中),本来是wm_keydown($100)的消息,变成了$B02E这又是根据什么规则来变的呢?看李维的Inside VCL,里面对于你的疑问有很详细的解释!