2.鼠标编程
2.1鼠标的常用事件
- OnClick
单击鼠标左键时触发该事件。
- OnMouseDown
当单击鼠标任一键时触发该事件。
- OnMouseMove
当单击鼠标在对象上移动时触发该事件。
- OnMouseUp
当鼠标的任一键按下后松开时触发该事件。
示例:检测窗口上的鼠标动作,不同的鼠标动作在窗口的 Memo 组件中输出动作的名称。界面如下:
代码如下:
procedure TForm1.FormClick(Sender: TObject);
begin
Memo1.Lines.Add('Click');
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Memo1.Lines.Add('Down');
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Memo1.Lines.Add('Move');
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Memo1.Lines.Add('Up');
end;
2.2鼠标拖放事件
- OnDrogDrop
鼠标拖拽开始时触发该事件
- OnDrogOver
鼠标推拽对象经过组件时触发该事件
- OnEndDrag
鼠标拖拽结束后触发该事件
鼠标拖拽事件开发步骤:
1.开始拖拽
一般组件对于拖拽事件的属性:
- DragMode
拖拽操作方式,取值为:
- dmManual - 手动,必须在被拖拽组件的OnMouseDown事件中调用 BeginDrag() 过程才可以开始拖拽操作
- dmAutomation - 自动,当鼠标左键在组件上按下后自动可以开始拖拽操作
2.接受拖拽
当鼠标拖拽一个组件经过另一个组件时,另一个组件会触发 OnDrogOver 事件,参数:
- Accept
该参数表示当前组件(也就是上面的另一个组件)是否接受拖拽,设置为:
- True,表示接受拖拽,则该组件会产生 OnDragDrop 事件
- False,不接受拖拽
3.处理拖拽
在另一个组件触发的OnDragDrop 事件中,处理拖拽操作。参数:
- Source
表示拖拽操作的源,也就是按下鼠标开始拖拽的组件。
4.拖拽结束
拖拽操作完成后,会在第一个组件中触发 OnEndDrag 事件,参数:
- Target
表示拖拽操作的目标组件,如果为 nil,表示没有组件接受拖拽操作,不为 nil,表示 Target 组件接受了拖拽操作。
示例:将窗体中的 Label 组件拖拽到 Memo 上,界面如下图:
示例代码:
procedure TForm1.LabelMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
// 鼠标在 Label 上按下时 , 所有 Label 的 OnMouseDown 事件
if (Button = mbLeft) and (Sender is TLabel) then
(Sender as TLabel).BeginDrag(false);
end;
procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
// 拖拽到 Memo 组件上时
if Source is TLabel then
Accept := true;
end;
procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
// 处理拖拽
if Source is TLabel then
(Sender as TMemo).Lines.Add((Source as TLabel).Caption);
end;
procedure TForm1.LabelEndDrag(Sender, Target: TObject; X, Y: Integer);
begin
// 在 Label 上拖拽结束时, 与 在 Memo 上拖拽处理 选择其中一个来实现即可
// 所有 Label 的 OnEndDrag 事件
// if Target is TMemo then
// (Target as TMemo).Lines.Add((Sender as TLabel).Caption);
end;
2.3鼠标滚轮事件
- OnMouseWheel
鼠标滚轮滚动时触发该事件
- OnMouseWheelDown
鼠标滚轮向下滚动时触发该事件
- OnMouseWheelUp
鼠标滚轮向上滚动时触发该事件
示例:在 Memo 组件中显示鼠标在窗体上滚轮的事件,界面如下图:
示例代码:
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
Memo1.Lines.Add('Wheel');
end;
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Memo1.Lines.Add('WheelDown');
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Memo1.Lines.Add('WheelUp');
end;
2.4鼠标事件相关的参数
参数 | 取值 | 说明 |
Sender | 触发事件的对象 | |
Button | mbLeft | 鼠标左键 |
mbRight | 鼠标右键 | |
mbMiddle | 鼠标中键 | |
Shift | ssShift | 按下Shift键 |
ssAlt | 按下Alt键 | |
ssCtrl | 按下Ctrl键 | |
ssLeft | 单击鼠标左键 | |
ssRight | 单击鼠标右键 | |
ssMiddle | 单击鼠标中键 | |
ssDouble | 双击鼠标 | |
X|Y | 鼠标当前的位置 | |
WheelDelta | 滚轮转动的角度 | |
MousePos | 鼠标当前的位置 |