回车和鼠标是一回事
下面这个够清楚了
http://www.delphibbs.com/delphibbs/dispq.asp?LID=2308424
先看看鼠标点击消息截获:
procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True
if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);
end;
调用DoMouseDown(Message, mbLeft, [])过程,再看看这个过程:
procedure TControl.DoMouseDown(var Message: TWMMouse
Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
调用MouseDown事件,再往下:
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState
X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
再看看事件mousedown的声明:
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
至此,通过消息截获直到调用用户的事件就比较清楚了,
那为什么不在WMLButtonDown(var Message: TWMLButtonDown)过程中就调用用户事件
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y)
呢,那是主要考虑到继承的问题,你看mousedown过程是protect的dynamic事件,
我后面继承的控件要特殊处理这个消息,只要重写MouseDown事件就行了,
而不必截获这个事件,再做一些必要的重复的初始化工作。
哦,搞错了,你问的是Click事件,我这里分析的是mousedown事件,其实
都差不多,直接看看就清楚了。