Añadir tracking del ratón en controles Cocoa

A veces necesitamos controlar cuando el ratón entra en alguno de los controles de nuestra aplicación. Para ello tenemos varias alternativas, quizás la mas sencilla pasa por utilizar el mensaje addTrackingRect que admite cualquier control Cocoa ( ya que este mensaje es de la clase NSView, y todos los controles son subclases de vista )

Los parámetros de dicho mensaje son, el rectángulo que delimitará el area de seguimiento, el propietario de dicho tracking, es decir, el que recibirá las llamadas a los mensajes mouseEntered y mouseExited, y los dos últimos parámetros consisten en un espacio para pasar un dato de usuario que luego se nos pasará en la llamada al mensaje que procesa el evento, y un valor booleano que indica si se lanza un evento cuando se establece la zona de seguimiento y el ratón ya estaba dentro de dicha zona.

Aparte del propio mensaje al control, debemos establecer que queremos recibir eventos de ratón, cosa que hacemos enviando el mensaje setAcceptsMouseMovedEvents a la ventana de nuestra aplicación. Y por supuesto debemos añadidir los dos métodos que gestionarán los eventos.

[window setAcceptsMouseMovedEvents:YES];
[myControl addTrackingRect:[myControl bounds]
                     owner:self
                  userData:nil
              assumeInside:NO];

/*...*/
- (void) mouseEntered:(NSEvent *) theEvent
{
	NSLog(@"mouse Entered");
}

- (void) mouseExited: (NSEvent *) theEvent
{
	NSLog(@"mouse Exited");
}

A partir de OSX 10.5 existe otro método para hacer esto mismo. Esto es usando el mensaje addTrackingArea a la misma vista.

El párametro que admite este mensaje es de tipo NSTrackingArea, que podemos construir usando la llamada initWithRect:options:owner:userInfo.

Estos parámetros son similares a lo anterior, sin embargo, la novedad y el beneficio están en las opciones. Típicamente las opciones son:

  • NSTrackingMouseEnteredAndExited, NSTrackingMouseMoved NSTrackingCursorUpdate, para indicar que tipo de eventos queremos que se nos notifiquen.
  • NSTrackingActiveWhenFirstResponder, NSTrackingActiveInKeyWindow, NSTrackingActiveInActiveApp y NSTrackingActiveAlways, que indica cuando se enviaran los mensajes.
  • NSTrackingAssumeInside, NSTrackingInVisibleRectNSTrackingEnabledDuringMouseDrag, que nos sirven para indicar varios aspectos configurables.

El código que cubre esta parte resultaría en:

[window setAcceptsMouseMovedEvents:YES];
[myControl addTrackingArea:
    [[NSTrackingArea alloc] initWithRect:[myControl bounds]
								 options:
                   NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways
								   owner:self
								userInfo:nil
	]
];

/*...*/
- (void) mouseEntered:(NSEvent *) theEvent
{
	NSLog(@"mouse Entered");
}

- (void) mouseExited: (NSEvent *) theEvent
{
	NSLog(@"mouse Exited");
}

- (void)mouseMoved:(NSEvent *)theEvent
{
	NSLog(@"mouse Exited");
}

Como vemos el último método analizado es mas flexible, pues nos permite especificar mejor lo que queremos capturar, sin embargo perderiamos compatibilidad con versiones anteriores a Leopard. En nuestras manos queda la decisión de que método elegir.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: