单击控件时如何获取鼠标的坐标?

时间:2009-05-05 21:09:56

标签: delphi mouse timage

在TImage的OnClick事件中,我想提取鼠标的x,y坐标。我更喜欢它们与图像有关,但与形式或窗口相关也同样好。

4 个答案:

答案 0 :(得分:22)

Mouse.CursorPos包含TPoint,而TPoint又包含X和Y位置。此值位于全局坐标中,因此您可以使用ScreenToClient例程将屏幕坐标转换为窗口坐标,从而转换为表单。

根据Delphi帮助文件,Windows.GetCursorPos可能会失败,如果失败,Mouse.CursorPos会将其包装起来引发EOsException。

var
  pt : tPoint;
begin
  pt := Mouse.CursorPos; 
  // now have SCREEN position
  Label1.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
  pt := ScreenToClient(pt);
  // now have FORM position
  Label2.Caption := 'X = '+IntToStr(pt.x)+', Y = '+IntToStr(pt.y);
end;

答案 1 :(得分:6)

Mouse.CursorPos属性会告诉您鼠标的当前位置。如果计算机运行缓慢,或者程序响应消息的速度很慢,那么它可能与首次发生OnClick事件时鼠标的位置不同。要在单击鼠标按钮时获取鼠标的位置,请使用GetMessagePos。它报告屏幕坐标;使用TImage.ScreenToClient转换为客户端坐标。

另一种方法是自己处理OnMouseDownOnMouseUp事件;他们的参数包括坐标。请记住,两个事件都需要发生才能发生点击。您可能还想检测拖动操作,因为您可能不希望将拖动视为点击。

答案 2 :(得分:4)

正如其他人所说,您可以使用Mouse.CursorPos或GetCursorPos函数,但您也可以只处理OnMouseDown或OnMouseUp事件而不是OnClick。这样,您可以将X和Y值作为参数添加到事件处理程序中,而无需进行任何额外的函数调用。

答案 3 :(得分:3)

这个怎么样?

procedure TForm1.Button1Click(Sender: TObject);
var
MausPos: TPoint;
begin
  GetCursorPos(MausPos);
  label1.Caption := IntToStr(MausPos.x);
  label2.Caption := IntToStr(MausPos.y);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  SetCursorPos(600, 600);
end;

在某处找到了这个,并将其保存在我的代码片段DB中:)

This page可能会解决您的所有问题...但似乎有从客户端到屏幕坐标和返回等功能。

祝你好运!