Как получить координаты мыши при нажатии на элемент управления? - PullRequest
10 голосов
/ 06 мая 2009

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

Ответы [ 4 ]

22 голосов
/ 06 мая 2009

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;
6 голосов
/ 06 мая 2009

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

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

4 голосов
/ 06 мая 2009

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

3 голосов
/ 06 мая 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;

Нашел где-то один раз в Интернете и сохранил в моей базе данных codenippet:)

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

Удачи!

...