网上文摘 小说 Flash游戏 最近更新 下载排行 资源分类 下载指南
经典编程资源 精彩不容错过
设为首页
加入收藏
联系我们
当前位置:Delphi园地技巧文章控件使用 → Delphi程序设计中的鼠标控制
Delphi程序设计中的鼠标控制
日期:2004年12月28日 作者: 人气: 查看:[大字体 中字体 小字体]

Windows环境下,鼠标和键盘是主要的输入设备。在Delphi中几乎每个对象都具有反映鼠标控制的事件,这些事件的主要功能包括改变鼠标指针的形状,移动、触发、拖动鼠标等。鼠标控制的三个相关属性是CursorDragCursorDragMode;鼠标控制的三个对象方法是BeginDragDraggingEndDrag;鼠标控制的七个事件包括OnDragDrop等。

一、改变鼠标指针的形状

  改变鼠标指针的形状在Windows环境下是不可缺少的功能。当应用程序在执行一个较长时间的指令或动作时,我们可以改变鼠标指针的形状来通知用户程序执行的状态,等到执行的动作完成之后,再把鼠标指针的形状变回来。此外,在拖动的过程中我们也可以改变鼠标指针的形状,使拖动的过程更加清楚。

  在编辑过程中,我们可以用属性CursorDragCursor改变鼠标指针的形状,前者是记录鼠标指针在对象上出现的情况;后者是设定对象被拖动时鼠标指针的形状。对于这两个属性,Delphi提供了如下值供用户选择:cdDefaultcrArrowcdCrosscrBeamcrSize等十几个属性值。

二、鼠标的移动

  鼠标移动时会触发事件OnMouseMove,语法如下:

  procedure ObjectMouseMove(Sender:TObject;Shift:TshiftState;XY:Integer)

  其中参数Sender代表目标对象,参数Shift代表鼠标移动时需同时按下的组合键,由{ssShiftssAltssCtrlssRightssLeftssMiddlessDouble}组成。此外,我们也可以利用参数XY取得鼠标移动的坐标位置,通常我们使用OnMouseMove事件时,最重要的就是这两个参数。

三、鼠标按键

  鼠标按键在窗口环境中也是最重要的输入方法之一,同时还可以配合ShiftAltCtrl三个键而发挥不同的作用。和鼠标按键有关的事件有OnMouseDownOnMouseUp。当用户按下鼠标的一个键后,会触发OnMouseDown事件,其语法如下:

  procedure ObjectMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;XY:Integer);

  参数Button指出按下的鼠标键是哪一个,可以是{mbLeftmbRightmbMiddle}三者之一。参数Shift可以反映按下的键盘键与鼠标的关系,其值是由{ssShiftssAltssCtrlssLeftssRightssMiddlessDouble}所组合而成的集合,这些参数值分别代表ShiftAltCtrl键、鼠标的左、中、右键,及同时按下左右键。例如,同时按下鼠标的右键和Alt键,参数Shift的值就是{ssAltssRight}

四、鼠标的拖动

  (一)启动拖动状态

  拖动状态的方式及启动是根据属性DragMode值的设定而决定的,可以分成两类情况:

  1.不必程序控制 如果DragMode的值是dmAutomatic,当鼠标左键一按,对象就自动进入拖动状态。

  2.需要程序控制 如果DragMode的值是dmManual,要使对象进入拖动状态,可以调用方法BeginDrag

  此外,Delphi提供一个对象方法Dragging,让程序判断对象是否进入拖动状态。如果返回值是TRUE,代表已进入拖动状态,否则就是没有。要使对象进入拖动状态,可以调用对象方法BeginDrag。当对象进入拖动状态时,事件OnStartDrag会被触发,有关语法如下:

  对象方法Dragging语法如下:

  function Dragging:Boolean;

  对象方法BeginDrag语法如下:

  Procedure BeginDrag(Immediate:Boolean);

  事件OnStartDrag语法如下:

  Procedure ObjectStartDrag(Sender:TObject;Var DragObject:TDragObject);

  (二)拖动中的事件

  关于对象在拖动状态的事件有两个:OnDragDropOnDragOver。假设把对象A拖动并放入对象B中,此时对象B的事件OnDragDrop会被触发。其语法如下:

  procedure ObjectDragDrop(SenderSource:TObject;XY:Integer);

  参数SenderSource分别代表目标对象B及被拖动的对象A,参数XY代表拖动结束时的位置坐标,此坐标是以目标对象的坐标为参考的,而实际上拖动中的对象并不是真的移动,所以以XY的值将对象移到新的位置。

  ()停止拖动

  如果要停止拖动,可以使用对象方法EndDrag来完成;其语法如下:

  procedure ObjectEndDrag(Drop:Boolean);

  参数Drop若是Ture,被拖动的对象将被放置于与目前所在的位置;否则,对象的拖动就被放弃,而回到原来的位置。例如下面的程序段就代表对象Lable1放弃拖动,并恢复原状:

  Lable1.EndDrag(False);

  而停止拖动会触发事件OnEndDrag,其语法如下:

  Procedure ObjectEndDrag(SenderTarget:TObject;XY:Integer);

  不管是放弃拖动或是对象已经拖动到目标对象,均会触发这个事件。参数SenderTarget分别指向被拖动对象及目标对象,但是如果拖动没有成功,则Target值为null

  对于上述的鼠标操作,我举一个例子。

  例如模拟“鼠过留痕”(单击第一下鼠标,鼠标不管移动到哪里都会留下痕迹,单击第二下,就不再留下痕迹)。

  unit Unit1;

  interface

  uses

  WindowsMessagesSysUtilsClassesGraphicsControlsFormsDialogs;

  type

  TForm1=class(TForm)

  procedure FormCreate(Sender:TObject);

  private

  {Private declarations}

  public

  {Public declarations}

  end;

  var

  Form1:TForm1;

  implementation

  {R .DFM}

  var

  Canvas:TCanvas;

  Flag:Boolean;

  procedure TForm1.FormCreate(Sender:TObject);

  begin

  Flag:=False;

  end;

  procedure TForm1FormMouseDown(Sender:TObject;Buttom:TMouseButton;Shift:TShiftState;XY:Integer);

  begin

  if Flag=False Then

   begin

   Canvas.MouseTO(XY);

   Flag:=Ture;

  end;

  else

   Flag:=false;

  end;

  procedure TForm1FormMouseDown(Sender:TObject;Buttom:TMouseButton;Shift:TShiftState;XY:Integer);

  begin

  if Flag=Ture Then

   begin

   Canvas.Pen.Color:=clBlack;

   Canvas.LineTO(XY);

  end;

end;

(出处:www)

相关文章:
·DBGrid不支持鼠标的上下移动的解决代码
·用鼠标拖动无标题窗口
·实现界面跟随鼠标移动的实例
·解决锁定键盘鼠标的方法
·用程序模拟键盘和鼠标键盘
·限制鼠标在窗体中的移动
·交换鼠标的左右键
 → 特别推荐
 → 热点TOP10
关于我们 | 广告服务 | 发布资源 | 联系站长 Copyright © 2002-2006 Delphi园地 All Rights Reserved