2011-12-20 28 views
5

Estoy trabajando en una aplicación en la que quiero mostrar un "menú contextual" de NSMenu junto a la ubicación actual del mouse. En este punto, sé cómo activar el comando desde la WebView para mostrar el menú contextual; parece que el menú no se muestra en la ubicación correcta en la pantalla. Parece que mis coordenadas están invertidas verticalmente a partir de lo que necesito. Esto parece ser un problema tan simple, pero he pasado un buen rato tratando de encontrar la mejor solución de "mejores prácticas". ¿Debo averiguar en qué pantalla se encuentra el mouse y calcular la coordenada y manualmente?¿Cómo puedo mostrar NSMenu en el cursor del mouse?

Aquí es mi muy simple código que se acerca:

- (IBAction)showMenu:(id)sender 
{ 
    CGEventRef ourEvent = CGEventCreate(NULL); 
    CGPoint point = CGEventGetLocation(ourEvent); 
    NSPoint wp = {0,0}; 
    wp = [self.window convertScreenToBase:point]; 
    NSLog(@"Location? x= %f, y = %f", (float)point.x, (float)point.y); 
    NSLog(@"Location? x= %f, y = %f", (float)wp.x, (float)wp.y); 

    NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouseUp location:CGPointMake(wp.x, wp.y) modifierFlags:0 timestamp:NSTimeIntervalSince1970 windowNumber:[_window windowNumber] context:nil eventNumber:0 clickCount:0 pressure:0.1]; 

    //NSEvent *event = [NSEvent eventWithCGEvent:ourEvent]; 


    NSMenu *theMenu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"]; 

    [theMenu insertItemWithTitle:@"Item 1" action:@selector(beep:) keyEquivalent:@"" atIndex:0]; 
    [theMenu insertItemWithTitle:@"Item 2" action:@selector(beep:) keyEquivalent:@"" atIndex:1]; 

    [NSMenu popUpContextMenu:theMenu withEvent:event forView:nil]; 
} 

por favor alguien puede proporcionar código de ejemplo para la forma más natural de hacer esto.

Respuesta

7

Estás mezclando Quartz with Cocoa. Hay mucha superposición entre las API, y si puede quedarse con solo una, hágalo. Hacer esto en su lugar:

NSPoint point = [NSEvent mouseLocation]; 

Cuarzo y Cacao utilizar diferentes sistemas de coordenadas: Cuarzo utiliza "dirección de hardware" estilo coordina con (0, 0) en la parte superior izquierda, Cocoa utiliza "matemáticas" estilo coordina con (0, 0) en la parte inferior izquierda.

+0

pensé que lo he intentado. Justo en frente de mi cara. ¡Gracias! – David

1

definir de init:

NSPoint lastClick; 

y luego:

- (void) rightMouseDown:(NSEvent *)theEvent { 
    lastClick = [self convertPoint: theEvent.locationInWindow fromView: nil]; 
    [super rightMouseDown:theEvent]; 
} 

y en su acción lo utilizan

- (IBAction)someAction:(id)sender { 
    //Use lastCLick.x and lastClick.y 
} 
Cuestiones relacionadas