2011-12-20 3 views
5

Je travaille sur une application où je veux montrer un "menu contextuel" du menu NSMenu à côté de l'emplacement actuel de la souris. À ce stade, je sais comment déclencher la commande à partir du WebView pour afficher le menu contextuel, je n'arrive tout simplement pas à faire apparaître le menu au bon emplacement sur l'écran. Il semble que mes coordonnées sont inversées verticalement de ce dont j'ai besoin. Cela semble être un problème si simple, mais j'ai passé pas mal de temps à essayer de trouver la meilleure solution. Ai-je besoin de savoir sur quel écran se trouve la souris et calculer la coordonnée y manuellement?Comment puis-je afficher NSMenu au curseur de la souris?

Voici mon code très simple qui se rapproche:

- (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]; 
} 

Quelqu'un peut-il s'il vous plaît me donner un exemple de code pour la façon la plus naturelle pour y parvenir.

Répondre

7

Vous mélangez du quartz avec du cacao. Il y a beaucoup de chevauchement entre les API, et si vous ne pouvez en retenir qu'une, faites-le. Pour ce faire, à la place:

NSPoint point = [NSEvent mouseLocation]; 

Quartz et Cocoa utilisent différents systèmes de coordonnées: Quartz utilise le style "adresse matérielle" coordonnées avec (0, 0) en haut à gauche, Cocoa utilise le style "mathématiques" coordonnées avec (0, 0) en bas à gauche.

+0

Je pensais que j'essayé. Juste en face de mon visage. Merci! – David

1

DEFINE dans INIT:

NSPoint lastClick; 

puis:

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

et dans votre action l'utiliser

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