我看文章--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对象的,请
高手解决一下吧!
而http://blog.csdn.net/nhczp/archive/2007/03/17/1531991.aspx这一片文章不是说,消息是先分给主窗体的,又由主窗体(是button的Parent)传给button 对象
的。具体是如何由消息先发给主窗体,而后在给予button对象的,请
高手解决一下吧!
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;
----------------------系统判断哪个窗体产生了点击事件,就把消息发往哪个窗体窗体中的componentlist中记录了窗体的各个控件,然后判断点击的是哪个控件,然后把消息发送给那个控件,控件接到消息后,就执行点击事件的处理
了解SendMessage(HWND, UINT, WPARAM, LPARAM)这个API函数就知道。
也可以读一下<INSIDE VCL>
在DELPHI写的程序中,WINDOWS系统捕捉到MOUSE事件后,系统将给应用程序APPLICATION类发送消息,APPLICATION基本上做两件事,从系统接收消息和将收到的消息分发.一般的消息都将传递给主窗体,主窗体然后再进行进一步分发,主窗体的消息分发才是最具体的分发,无论控件是不是在主窗体上(比如一个按钮是在另一个非主窗体上)都是由主窗体分发的,而且是主窗体的消息处理过程直接分到目的控件.
比如说,有一个非主窗体上有一个TPANEL,TPANEL上又有一个TBUTTON,这个TBUTTON的消息来后,先由APPLICATION接收到,并由APPLICATION的消息循环送到主窗体进行分发.主窗体直接就将消息按句柄发送到BUTTON的消息处理过程,而不是APPLICATION---->MAIN FORM----非主FORM----PANEL--BUTTON.
算了,不说了,我说的有些乱,我的表达能力不好.
呵,如果你有耐心的话,可以看VCL的源码,你就会很明白了
覆盖WndProc方法进行消息过滤就OK了