2011-05-31 10 views
8

Estoy desarrollando una aplicación de escritorio en la que debería poder tomar eventos de mouse en una ventana transparente. Pero, NSWindow transparente no toma eventos de mouse. Por lo tanto, configuré setIgnoreMouseEvents en NO, lo que permite que la ventana transparente tome los eventos del mouse.Manejo de eventos de mouse en la ventana transparente condicionalmente

Tengo el problema en la situación siguiente: Hay una forma rectangular creada dinámicamente en esta ventana. La ventana transparente no debe tomar eventos de mouse en esta región; debe ser delegado a la ventana (de alguna otra aplicación) que está presente detrás de esta forma. Para este propósito, si el evento mouseDown está dentro de la forma, estoy configurando setIgnoreMouseEvents en YES. Ahora, si el usuario realiza eventos de mouse en el área fuera de la forma, la ventana transparente debería tomar el evento. Dado que setIgnoreMouseEvents está establecido en SÍ, la ventana no toma eventos de mouse.

No hay forma de identificar que se ha producido el evento mouseDown para que pueda establecer setIgnoreMouseEvents en NO.

¿Podría alguien sugerirme el mejor método para manejar los eventos del mouse en la ventana transparente?

Deepa

+0

[¿Cómo crear una ventana transparente con botones no rectangulares?] (Http://stackoverflow.com/questions/1527907/how-to-create-a-transparent-window-with-non-rectangular-buttons) – Ben

+1

La magia La palabra que está buscando es "prueba de golpe". Así es como la ventana puede cooperar con el proceso de determinar si el mouse debe tratarse como si estuviera sobre la ventana o no. – Ben

+0

Sugiero que solo cree un área de seguimiento para ese rectángulo e intercepte desde la cadena de respuesta en la vista y luego delegue eso en la ventana donde desea capturar el evento deseado. – Arvin

Respuesta

3

acabo de venir a través de cuarzo Evento Taps, que básicamente le permiten capturar el evento de ratón y ejecutar su propia devolución de llamada.

no lo he probado a mí mismo, pero parece que usted debería ser capaz de verificar que el clic del ratón cayó y ejecutar condicionalmente en los valores

He aquí un example: posible duplicado de

//--------------------------------------------------------------------------- 
CGEventRef MouseTapCallback(CGEventTapProxy aProxy, CGEventType aType, CGEventRef aEvent, void* aRefcon) 
//--------------------------------------------------------------------------- 
{ 
    if(aType == kCGEventRightMouseDown) NSLog(@"down"); 
    else if(aType == kCGEventRightMouseUp) NSLog(@"up"); 
    else NSLog(@"other"); 

    CGPoint theLocation = CGEventGetLocation(aEvent); 
    NSLog(@"location x: %d y:%d", theLocation.x, theLocation.y); 

    return aEvent; 
} 

//--------------------------------------------------------------------------- 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
//--------------------------------------------------------------------------- 
{ 
    CGEventMask theEventMask = CGEventMaskBit(kCGEventRightMouseDown) | 
       CGEventMaskBit(kCGEventRightMouseUp); 

    CFMachPortRef theEventTap = CGEventTapCreate(kCGSessionEventTap, 
          kCGHeadInsertEventTap, 
          0, 
          theEventMask, 
          MouseTapCallback, 
          NULL); 

    if(!theEventTap) 
    { 
    NSLog(@"Failed to create event tap!"); 
    } 

    CFRunLoopSourceRef theRunLoopSource = 
    CFMachPortCreateRunLoopSource(kCFAllocatorDefault, theEventTap, 0); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), 
         theRunLoopSource, 
         kCFRunLoopCommonModes); 
    CGEventTapEnable(theEventTap, true); 
} 
Cuestiones relacionadas