Как получить координаты мыши при нажатии на элемент управления?

В событии OnClick TImage я хотел бы извлечь координаты x, y мыши. Я бы предпочел их по отношению к изображению, но по отношению к форме или окну ничуть не хуже.


person Arthur    schedule 05.05.2009    source источник
comment
Это будет еще важнее для двойных кликов.   -  person Wolf    schedule 16.07.2021


Ответы (4)


Mouse.CursorPos содержит 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;
person skamradt    schedule 05.05.2009

Свойство Mouse.CursorPos сообщит вам текущую позицию мыши. Если компьютер работает медленно или ваша программа медленно отвечает на сообщения, то это может быть не то же самое, что положение мыши при первом возникновении события OnClick. Чтобы получить положение мыши в момент нажатия кнопки мыши, используйте GetMessagePos. Он сообщает экранные координаты; перевести в координаты клиента с помощью TImage.ScreenToClient.

Альтернативой является обработка событий OnMouseDown и OnMouseUp самостоятельно; их параметры включают координаты. Помните, что оба события должны произойти, чтобы произошел щелчок. Вы также можете обнаружить операции перетаскивания, так как вы, вероятно, не захотите считать перетаскивание кликом.

person Rob Kennedy    schedule 06.05.2009
comment
Этот ответ делает очевидным, что ScreenToClient — это метод, а не просто процедура. Если он вызывается без явного указания имени объекта, это объект self (в основном TForm). Бывают обстоятельства, когда другой объект имеет больше смысла, как в этом случае. Кстати, вы говорите о перетаскивании — разве это не перемещение (OnMouseMove)? - person Wolf; 16.07.2021

Как уже говорили другие, вы можете использовать функцию Mouse.CursorPos или GetCursorPos, но вы также можете просто обрабатывать событие OnMouseDown или OnMouseUp вместо OnClick. Таким образом, вы получаете значения X и Y в качестве параметров обработчика событий без необходимости выполнять какие-либо дополнительные вызовы функций.

person Kevin    schedule 05.05.2009

Как насчет этого?

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;

Однажды нашел это где-то в Интернете и сохранил в своей базе данных кода :)

Эта страница, вероятно, решит все ваши вопросы... быть функциями для перехода от клиента к экранным координатам и обратно и т.д..

Удачи!

person Kris    schedule 05.05.2009