¿Cómo obtengo las coordenadas del mouse cuando se hace clic en un control?
Pregunta
En el evento OnClick de un mensaje de TI, me gustaría extraer las coordenadas x, y del mouse. Los preferiría en relación con la imagen, pero en relación con la forma o la ventana es igual de buena.
Solución
Mouse.CursorPos contiene el TPoint, que a su vez contiene las posiciones X e Y. Este valor se encuentra en las coordenadas globales, por lo que puede traducir a su formulario utilizando la rutina ScreenToClient, que convertirá las coordenadas de la pantalla en coordenadas de la ventana.
Según el archivo de ayuda de Delphi, Windows.GetCursorPos puede fallar, Mouse.CursorPos envuelve esto para generar una EOsException si falla.
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;
Otros consejos
La propiedad Mouse.CursorPos
le indicará la posición current del mouse. Si la computadora se ejecuta con lentitud, o si su programa responde lentamente a los mensajes, es posible que no sea la misma que la posición que tenía el mouse cuando ocurrió el evento OnClick
por primera vez. Para obtener la posición del mouse en el momento en que se hizo clic en el botón , use GetMessagePos
. Reporta coordenadas de pantalla ; traduzca a las coordenadas del cliente con TImage.ScreenToClient
.
La alternativa es manejar los eventos OnMouseDown
y OnMouseUp
usted mismo; Sus parámetros incluyen las coordenadas. Recuerde que los eventos ambos deben ocurrir para que se produzca un clic . También es posible que desee detectar las operaciones de arrastrar , ya que probablemente no querrá considerar un arrastre para contar como un clic.
Como han dicho otros, puede usar Mouse.CursorPos o la función GetCursorPos, pero también puede controlar el evento OnMouseDown o OnMouseUp en lugar de OnClick. De esta manera, obtendrá los valores de X e Y como parámetros para su controlador de eventos, sin tener que realizar ninguna llamada a funciones adicionales.
¿Qué tal esto?
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;
Encontré esto en línea en algún lugar una vez y lo guardé en mi código DB DB :)
Esta página probablemente resolverá todas tus preguntas, sin embargo ... Parece que hay funciones para ir del cliente a las coordenadas de la pantalla y viceversa, etc.
¡Buena suerte!