17 de diciembre de 2004

Como se mueve el ratón


Originalmente publicado en FoxTALK Febrero de 1998
Traducción de Ariel Gimenez


Como se mueve el ratón
Jim Booth
Si tu aplicación necesita contemplar las acciones del ratón, puedes tanto llamar a un exterminador o usar los eventos que Visual FoxPro nos dá para capturar las acciones del mouse y sus botones. Desde que mis usuarios se enojaron al ver ese tipo del traje metalico destruyendo sus ratones, prefiero usar los eventos enVisual FoxPro.
Allí hay un número de eventos que pueden informarnos de las actividades del ratón. MouseMove, MouseDown, MouseUp, Click, RightClick, DoubleClick, MiddleClick, y el MouseWheel son los eventos que nos interesan.
Echemosle una mirada al MouseMove primero.  El archivo de ayuda nos dice que este evento se dispara cuando se mueve el ratón sobre un control.   Esto es correcto, y debido a que constantemente se dispara mientras el ratón se esta moviendo sobre el control puede ser un problema para la performance, si no es utilizado correctamente.  Recuerda cuando escribes codigo en el MouseMove que este correra muy frecuentemente y por consiguiente este debe ser corto y conciso.
El MouseMove recibe cuatro(4) parámetros.   Estos son nButton, nShift, nXCoord, y nYCoord respectivamente.  Estos parámetros nos cuentan sobre la posición del puntero del ratón, el estado de los botones del ratón, y el estado de las teclas shift, ctrl y alt .  Sus valores son:
El parámetro nButton posee un valor entre 0 y 7 y se refiere al estado de los botones del ratón.   El valor 0 significa que no hay botones presionados mientras que los valores de 1, 2, y 4 cada uno se refiere a que los botones izquierdo, derecho, y medio se encuentran presionados respectivamente. Los otros valores  (3,5,6,7) nos informa de las combinaciones de botones que estan presionados.   El parámetro nButton posee un valor que es la suma de los valores de los botones presionados, así que si el boton izquierdo y derecho están presionados entonces nButton será igual a 3, o la suma de 1 (botón izquierdo) y 2 (botón derecho).
El parámetro nShift nos dá una información similar sobre las teclas Shift, CTRL, y Alt .   Los valores para este parámetro son manejados similarmente a el parámetro nButton en el cual Shift es 1, CTRL es 2, y Alt es 4.   Ninguna es 0 y si mas de una tecla de estas esta presionada entonces nShift será la suma de los valores de las mismas.
El parámetro nXCoord y nYCoord nos informan de la posición horizontal y vertical del ratón respectivamente.   Los valores de este parámetro son tomados con respecto al formulario y no del control, así que cuando el mouse ingresa a la parte de arriba del control el nYCoord NO es 0 o 1 sinó el número de pixel desde el formulario mismo.
El formulario de ejemplo Mice.scx muestra el uso del evento MouseMove de un botón para actualizar algunos otros controles.   los otros controles nos van mostrando el estado de las cosas mientras el ratón se mueve sobre el command button.   Un extracto del código del MouseMovecode del botón esta listado abajo, este extracto es el código que determina si el puntero del ratón esta entrando, saliendo, o moviendose dentro del command button.  Hace esto chequeando el nXCoord del puntero del ratón para ver si este cae dentro de los 3-pixels del borde  arriba, abajo, izquierda, o derecha del limite del botón. Si el puntero se encuentra en este perímetro entonces chequea si el ratón se encontraba previamente sobre el botón o no(en el ejemplo estamos usando el valor corriente del option button group, pero en código real esto debería ser manejado con una propiedad del botón mismo) y entonces setear el valor entrante o saliente del OptionButton group en el formulario para reflejar esto.   Hay también código en el MouseMove del formulario que setea el valor del  OptionButton group en 0 indicando que el ratón no se encuentra sobre el boton.
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WITH THISFORM
       IF ((nXCoord >= THIS.Left AND nXCoord <= THIS.Left+3) OR ;
          (nXCoord <= THIS.Left + THIS.Width AND ;
           nXCoord >= THIS.Left + THIS.Width-3)) OR ;
          ((nYCoord >= THIS.Top AND nYCoord <= THIS.Top+3) OR ;
          (nYCoord <= THIS.Top + THIS.Height AND ;
           nYCoord >= THIS.Top + THIS.Height-3))
                 DO CASE
                     CASE .optEntering.Value = 0
                            * estamos entrando
                            .optEntering.Value = 1
                     CASE .optEntering.Value = 2
                            * estamos saliendo
                            .optEntering.Value = 3
              ENDCASE
       ELSE
* estamos sobre el control
              .optEntering.Value = 2
       ENDIF
* mas código aqui
ENDWITH
El formulario de ejemplo está disponible para los suscriptores de FoxTALK en el area de downloads en http://www.pinnaclepublishing.com/ft.  El formulario de ejemplo muestra como leer el estado de los botones del ratón, las teclas shift/ctrl/alt, y las coordenadas x e y del ratón, y también el manejo de la entrada y salida del control.  si usted no es suscriptor puede suscribirse desde el mismo sitio web de FoxTALK.
 

Jim Booth

No hay comentarios. :

Publicar un comentario