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.

¿Fue útil?

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!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top