Как получить координаты мыши при нажатии на элемент управления?
Вопрос
В событии 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:)
Эта страница , вероятно, решит все ваши вопросы, однако .. Кажется, есть функции для перехода от клиента к координатам экрана и обратно и т. Д.
Удачи!