我看文章--http://blog.csdn.net/nhczp/archive/2007/03/17/1531991.aspx,不知道如Button对象的事件,系统是如何找到由Button对象来处理ButtonClick事件的。
而http://blog.csdn.net/nhczp/archive/2007/03/17/1531991.aspx这一片文章不是说,消息是先分给主窗体的,又由主窗体(是button的Parent)传给button 对象
的。具体是如何由消息先发给主窗体,而后在给予button对象的,请
   高手解决一下吧!

解决方案 »

  1.   

    procedure DefaultHandler(var Message); override;//消息默认的句柄procedure TFormSkin.DefaultHandler(var Message);
    var
      nmm_MsgLButtonDown: TWMLButtonDown;
      nmm_MsgLButtonUp: TWMLButtonDown;
      nmm_MsgMouseMove: TWMLButtonDown;
      nn : TWMNCPaint ;
    begin  if Tmessage(Message).Msg = WM_LBUTTONDOWN then
      begin
        nmm_MsgLButtonDown :=  TWMLButtonDown(Message);
         Self.WMLButtonDown(nmm_MsgLButtonDown);
      end;
      if Tmessage(Message).Msg = WM_LBUTTONUP then
      begin
        nmm_MsgLButtonUp :=  TWMLButtonUp(Message);
         Self.WMLButtonUp(nmm_MsgLButtonUp);
      end;
      if Tmessage(Message).Msg = WM_MOUSEMOVE then
      begin
        nmm_MsgMouseMove :=  TWMMouseMove(Message);
         Self.WMMOUSEMOVE(nmm_MsgMouseMove);
      end; inherited;
    end;
      

  2.   

    我的理解,没有经过研究
    ----------------------系统判断哪个窗体产生了点击事件,就把消息发往哪个窗体窗体中的componentlist中记录了窗体的各个控件,然后判断点击的是哪个控件,然后把消息发送给那个控件,控件接到消息后,就执行点击事件的处理
      

  3.   

    系统是直接发给button的。bottom是有句柄的。
    了解SendMessage(HWND, UINT, WPARAM, LPARAM)这个API函数就知道。
      

  4.   

    你可以参考一下DELPHI的源码TApplication这个类,应该算是简练清楚.
    也可以读一下<INSIDE VCL>
     
    在DELPHI写的程序中,WINDOWS系统捕捉到MOUSE事件后,系统将给应用程序APPLICATION类发送消息,APPLICATION基本上做两件事,从系统接收消息和将收到的消息分发.一般的消息都将传递给主窗体,主窗体然后再进行进一步分发,主窗体的消息分发才是最具体的分发,无论控件是不是在主窗体上(比如一个按钮是在另一个非主窗体上)都是由主窗体分发的,而且是主窗体的消息处理过程直接分到目的控件.
    比如说,有一个非主窗体上有一个TPANEL,TPANEL上又有一个TBUTTON,这个TBUTTON的消息来后,先由APPLICATION接收到,并由APPLICATION的消息循环送到主窗体进行分发.主窗体直接就将消息按句柄发送到BUTTON的消息处理过程,而不是APPLICATION---->MAIN FORM----非主FORM----PANEL--BUTTON.
    算了,不说了,我说的有些乱,我的表达能力不好.
    呵,如果你有耐心的话,可以看VCL的源码,你就会很明白了
      

  5.   

    消息过滤而已
    覆盖WndProc方法进行消息过滤就OK了