鼠标单击先后依次触发的事件是:MouseDown -> Click -> MouseUp
将控件的DragMode设为dmAutomatic时,鼠标按下即进入拖放操作状态;DragMode设为dmManual时,需
要自己调用BeginDrag()函数才开始执行拖放操作。
如果你仔细地看过Delphi源码中BeginDrag()函数的实现部分的话,你就会发现Delphi中的可视化控
件(可视化控件:可以有焦点输入的控件)的鼠标拖放机制是模拟出来的,请看BeginDrag的源代码:
procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer);
var
P: TPoint;
begin
if (Self is TCustomForm) and (FDragKind <> dkDock) then
raise EInvalidOperation.CreateRes(@SCannotDragForm);
CalcDockSizes;
if (DragControl = nil) or (DragControl = Pointer($FFFFFFFF)) then
begin
DragControl := nil;
if csLButtonDown in ControlState then
begin
GetCursorPos(P);
P := ScreenToClient(P);
Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); //this
//请看这里,上面这个函数强制将鼠标按键抬起来,这就是为什么鼠标拖放操作
//总是和鼠标单击、双击冲突的根本原因
//就是说一旦执行了BeginDrag这个函数,此时,虽然实际你的鼠标按键还是按下去的状态,
//但是系统已经认为鼠标按键抬起来了
end;
{ Use default value when Threshold < 0 }
if Threshold < 0 then
Threshold := Mouse.DragThreshold;
// prevent calling EndDrag within BeginDrag
if DragControl <> Pointer($FFFFFFFF) then
DragInitControl(Self, Immediate, Threshold);
end;
end;
所以,要想使鼠标单击,双击,拖放都并存的话,就不能用系统提供的拖放机制,而只能模拟一个拖
放操作!