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

StackOverflow https://stackoverflow.com/questions/826914

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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;

Другие советы

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

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

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

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

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:)

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

Удачи!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top