В событии OnClick TImage я хотел бы извлечь координаты x, y мыши. Я бы предпочел их по отношению к изображению, но по отношению к форме или окну ничуть не хуже.
Как получить координаты мыши при нажатии на элемент управления?
Ответы (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;
Свойство Mouse.CursorPos сообщит вам текущую позицию мыши. Если компьютер работает медленно или ваша программа медленно отвечает на сообщения, то это может быть не то же самое, что положение мыши при первом возникновении события OnClick. Чтобы получить положение мыши в момент нажатия кнопки мыши, используйте GetMessagePos. Он сообщает экранные координаты; перевести в координаты клиента с помощью TImage.ScreenToClient.
Альтернативой является обработка событий OnMouseDown и OnMouseUp самостоятельно; их параметры включают координаты. Помните, что оба события должны произойти, чтобы произошел щелчок. Вы также можете обнаружить операции перетаскивания, так как вы, вероятно, не захотите считать перетаскивание кликом.
ScreenToClient — это метод, а не просто процедура. Если он вызывается без явного указания имени объекта, это объект self (в основном TForm). Бывают обстоятельства, когда другой объект имеет больше смысла, как в этом случае. Кстати, вы говорите о перетаскивании — разве это не перемещение (OnMouseMove)?
- person Wolf; 16.07.2021
Как уже говорили другие, вы можете использовать функцию 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;
Однажды нашел это где-то в Интернете и сохранил в своей базе данных кода :)
Эта страница, вероятно, решит все ваши вопросы... быть функциями для перехода от клиента к экранным координатам и обратно и т.д..
Удачи!