达永编程网

程序员技术分享与交流平台

「9.键盘鼠标和文件编程」2.鼠标编程

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


鼠标当前的位置



控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言