vcl如何将消息发送到指定的控件,恳请各位指点(200分)

  • 主题发起人 主题发起人 chenlia
  • 开始时间 开始时间
C

chenlia

Unregistered / Unconfirmed
GUEST, unregistred user!
比如从TGraphicControl派生下来的tspeedButton能够接受单击事件,但是他没有句柄,vcl
如何判断当前用户点击的是这个speedbutton,而不是另外一个,应该不会是一个一个rect
判断吧. 那么程序是如何派分消息的呢.恳请各位大富翁指点一二,谢谢
 
一些没有句柄的控件他们的消息事件是由他们的父窗体负责的。如tspeedButton的点击,
首先由父窗体的WndProc收到,如果消息号处于WM_MOUSEFIRST和WM_MOUSELAST之间则
进一步判断点击区域是否在子控件上,如是则调用子控件的消息函数。
下面是TWinControl中WndProc的代码:
...............
WM_MOUSEFIRST..WM_MOUSELAST:
if IsControlMouseMsg(TWMMouse(Message)) then //关键
begin
if Message.Result = 0 then
DefWindowProc(Handle, Message.Msg, Message.wParam, Message.lParam);
Exit;
end;
.......................
function TWinControl.IsControlMouseMsg(var Message: TWMMouse): Boolean;
var
Control: TControl;
P: TPoint;
begin
if GetCapture = Handle then
begin
Control := nil;
if (CaptureControl <> nil) and (CaptureControl.Parent = Self) then
Control := CaptureControl;
end else
Control := ControlAtPos(SmallPointToPoint(Message.Pos), False);
Result := False;
if Control <> nil then
begin
P.X := Message.XPos - Control.Left;
P.Y := Message.YPos - Control.Top;
Message.Result := Control.Perform(Message.Msg, Message.Keys, Longint(PointToSmallPoint(P)));//关键
Result := True;
end;
end;
 
原来如此,我看了vcl的源代码TControl.ControlAtPos,发现它用的是一个一个rect判断
获得鼠标事件的控件(无句柄),不知道我这样理解对不对,还有哪里可以找到谈论vcl
的机制的书或者网络资源,谢谢

BTW: 特别感谢mywyn
 
可以到 www.51delphi.com 看看。
 
接受答案了.
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部