现在有一个
type
  TMyImg = class(TImage)
  private
    procedure WMLBUTTONDOWN(var Message: TMessage); message WM_LBUTTONDOWN;
end;TImage非继承自TwinControl,所以没有Handle,按理说对它的消息VCL会交给其parent处理
但是这个私有的procedure可以被执行,这是什么原理?

解决方案 »

  1.   

    这是vcl的消息机制,《深入核心VCL架构剖析》这本书有详细说明
      

  2.   

    可以在这个procedure内下个断点,断下来的时候看看call stack 窗口
      

  3.   

    虽然TImage不是集成子twincontrol,但是他是有handle的,他的handle就是他的利用GetDC函数取得其parent的显示设备上下环境句柄具体你直接看源码就了解了。
      

  4.   

    但是这个句柄跟消息处理没有关系。timage控件没有窗口函数,所以处理不了消息。消息由其parent处理在其parent的winproc中,会利用GetControlsatpos来取得当前鼠标光标处的控件,如果取到了,则利用perform函数来将改消息发给这个控件(也就是调用控件的winproc函数),控件的winproc函数会处理这条消息,这里是用dispatchmessage函数来处理的,dispatchmessage利用汇编代码写的,其原理就是去虚拟方法表中找到标记了 message WM_LBUTTONDOWN的方法,并执行他。所以lz此处的代码会执行。