Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Posición del mouse en la pantalla (https://www.clubdelphi.com/foros/showthread.php?t=7352)

cone220 12-02-2004 16:54:23

Posición del mouse en la pantalla
 
Cómo puedo obtener la posición del mouse en la pantalla en el momento en que hago un doble click???

Saludos

Federico

DarkByte 12-02-2004 16:59:54

A lo mejor te puede servir el truco 92 de Trucomanía: "Detectar la posición del ratón en tu form en una zona no cliente".

Ir a trucomanía
Ir al truco

Confío en mis compañeros foreros que me corrijan si me equivoco

cone220 12-02-2004 17:03:51

No aclaré bien mi problema. Lo que necesito es detectar en que posición "dentro de mi ventana de aplicación Delphi" se hizo un doble clik. El código que me indicaste es válido, pero no hay una manera mas sencilla de tomar la ubicación?

DarkByte 12-02-2004 17:08:02

Ya suponía que no era en tu aplicación. No he examinado el código a fondo, pero creí que te sería útil. Sobre si hay alguna manera más sencilla, yo no puedo ayudarte en eso. Yo no se mucho sobre programación, soy el más principiante dentro de los principiantes, no se si me explico :p

Descendents 12-02-2004 17:08:58

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
s:tpoint;
begin
s := Mouse.CursorPos;
Label1.caption := ('X:'+INTTOSTR(S.X)+' Y:'+INTTOSTR(S.Y));
end;

Haber si te sirve
Saludos

Descendents 12-02-2004 17:10:42

Una cosa que me deje de decirte, por supesto este código lo pones dentro del evento que quieras.Yo lo puse en el onmousemove del form, pero lo pones en el doble click de un boton o de donde quieras.

Más Saludos

roman 12-02-2004 17:26:37

Aunque en realidad no hace falta en MouseMMove ya que este evento incluye las coordenadas.

Para complementar lo dicho por Descendents apunto que Mouse.CursorPos da las coordenadas respecto de la pantalla y no del formulario. Si se desean las coordenadas relativas al formulario puede usarse ScreenToClient para convertirlas.

// Saludos

lucasarts_18 30-06-2005 04:54:46

Hola Roman:

Me podrías ayudar un poco a utilizar ésta función (ScreenToClient) ;) .

Gracias.
Aarón.

Lepe 30-06-2005 10:54:16

Como yo llego primero, pues yo mismo :p


ScreenToClient y su homologo ClientToScreen vienen con cualquier objeto derivado de la clase Tcontrol, por tanto lo podemos usar en formularios y otros especimenes ;).

Descripción: ScreenToClient Segun una coordenada pasada por parametro, la interpreta como que pertenece a la pantalla, y te devuelve la coordenada según el control que se llame, Ejemplo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var PuntoCliente, Punto:TPoint;
begin
 Punto.X := 100;
 Punto.Y := 40;
 PuntoCliente :=  Form1.ScreenToClient(Punto);
  Memo1.Lines.Add(' y '+IntToStr(PuntoCliente.Y)+ ' x '+ IntToStr(puntocliente.X));
 Button1.Top:= PuntoCliente.Y;
 Button1.left:= PuntoCliente.x;

end;
Punto está en coordenadas de la pantalla.
PuntoCliente es esa misma coordenada pero dentro del Formulario Form1.

Aclaraciones:

La pantalla empieza en 0,0 en la esquina superior izquierda.
Un Form, tiene la coordenada 0,0 igualmente en su esquina superior izquierda.

Si la ventana no tiene bordes, ni titulo, y está maximizada, las coordenadas Punto y PuntoCliente coinciden.

Dicho en plan "Lepero" :D: Coge un rotulador y pinta en tu Monitor un punto, digamos el 100,40 (100 pixels a la derecha, 40 pixels hacia abajo de la pantalla), Ahora PuntoCliente, te dice ese punto rotulado, qué coordenada es esa, respecto a Form1. OJO, puede dar coordenadas negativas, recuerda que el origen ahora, es la esquina superior izquierda de Form1 !!!

Ejecutas el programa:
Maximizas el programa y pulsas sobre el boton, El boton se mueve a las nuevas coordenas.

Si la ventana Form1 no está maximizada, el boton desaparece, ya que toma coordenadas negativas.

ClientToScreen:
Código Delphi [-]
procedure TForm1.Button7Click(Sender: TObject);
var PuntoCliente, Punto:TPoint;
begin
 PuntoCliente.X := 100;
 PuntoCliente.Y := 40;
 Punto :=  Form1.ClienttoScreen(PuntoCliente);
 Memo1.Lines.Add(' y '+IntToStr(Punto.Y)+ ' x '+IntToStr(punto.X));

end;
En este caso, depende de donde tengas la ventana, para que ese punto se traduzca a coordenadas de la pantalla.

Un saludo y espero se entienda.

lucasarts_18 01-07-2005 03:21:15

Hola Lepe:

Gracias, lo explicaste bastante claro.

He implementado algo así:

Código Delphi [-]
 
procedure TFrmArchivos.btnAgregarClick(Sender: TObject);
var
Boton_Cory,Boton_Corx : Integer;
P ,Cord_Pantalla : TPoint;
begin
   //MnuBtnAgregar.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
   Boton_Cory := btnAgregar.Top + 17;
   Boton_Corx := btnAgregar.Left;
   Cord_Pantalla.X := Boton_Corx;
   Cord_Pantalla.Y := Boton_Cory;
   P := Self.ClientToScreen(Cord_Pantalla);
   MnuBtnAgregar.Popup(P.X ,P.Y);
end;
Pero de ésta manera me queda bajo el botón, la idea que quiero es que me quede justo sobre el botón :D .

Saludos y gracias nuevamente.

Aarón.

Lepe 01-07-2005 12:34:34

¿Por qué le sumas 17 ? :confused:

Supongo que estabas haciendo pruebas y al final se ha quedado ahí ;)

Un saludo

lucasarts_18 01-07-2005 18:12:10

Hola:

Claro, estaba haciendo algunas pruebas y sumandole 17 logré que se posicioné justo debajo del botón, pero mi idea es todo lo contrario, me gustaría que se posicione justo sobre el botón y no por debajo de éste...

Saludos. ;)

Lepe 01-07-2005 20:49:21

Sobre el botón.... es decir, arriba del botón !! jeje, yo contaba que quedara la esquina izquierda del menú, justo con la esquina izquierda del botón, por eso no te entendía.

El menú no tiene opción de Height, por tanto, tendrás que contar cuantos elementos tienes en el menú, despues multiplicarlo por una constante, y así saber cuanto le tienes que restar a Boton_Cory.

Es tarea compleja, ya que el usuario puede tener activa las "fuentes grandes" de windows, y por tanto esa constante tiene 2 posibles valores.

En este mensaje tienes más o menos el alto de un menú.

Para saber si tiene las fuentes grandes, busca por el foro, creo que se ha tratado.... más bien me extrañaría que no se hubiese tratado ;).

Un saludo.

roman 01-07-2005 21:25:40

Cita:

Empezado por Lepe
Es tarea compleja

Ya lo creo, pero hay una forma más fácil:


Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
const
  Flags = TPM_LEFTALIGN or TPM_BOTTOMALIGN or TPM_LEFTBUTTON;

var
  Pt: TPoint;

begin
  Pt := Point(Button2.Left, Button2.Top);
  Pt := ClientToScreen(Pt);

  TrackPopupMenu(PopupMenu1.Handle, Flags, Pt.X, Pt.Y, 0, PopupList.Window, nil);
end;

// Saludos

lucasarts_18 01-07-2005 22:37:11

Hola Foristas:


Logré lo que quería:

Código Delphi [-]
 
 
procedure TFrmArchivos.btnAgregarClick(Sender: TObject);
var
Boton_Cory,Boton_Corx : Integer;
P ,Cord_Pantalla : TPoint;
begin
   //MnuBtnAgregar.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
   Boton_Cory := btnAgregar.Top; // + 17
   Boton_Corx := btnAgregar.Left;
   Cord_Pantalla.X := Boton_Corx;
   Cord_Pantalla.Y := Boton_Cory;
   P := Self.ClientToScreen(Cord_Pantalla);
   MnuBtnAgregar.Popup(P.X ,P.Y + - 48); // y = Vertical
end;

a la coordenada Y le reste - 48 y quedo justito como quería, gracias por las nuevas idea expuestas.
Saludos.
Aaron.

Lepe 02-07-2005 11:03:55

Roman, nunca dejarás de sorprenderme ;)

Como siempre, haciendo facil lo dificil.

Un saludo

roman 03-07-2005 01:16:29

Cita:

Empezado por Lepe
Como siempre, haciendo facil lo dificil.

Más bien Delphi haciendo difícil lo fácil. Como sabrás, Delphi sí maneja el alineamiento horizontal mas se han olvidado de añadir el manejo del alineamiento vertical.

// Saludos


La franja horaria es GMT +2. Ahora son las 21:34:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi