Как я могу показать NSMenu на курсоре мыши? - PullRequest
5 голосов
/ 20 декабря 2011

Я работаю над приложением, в котором я хочу показать «контекстное меню» NSMenu рядом с текущим местоположением мыши.На данный момент, я знаю, как вызвать команду из WebView, чтобы показать контекстное меню, я просто не могу заставить меню отображаться в правильном месте на экране.Кажется, мои координаты инвертированы вертикально от того, что мне нужно.Это кажется такой простой проблемой, но я потратил немало времени, пытаясь найти наилучшее решение.Нужно ли выяснять, на каком экране находится мышь, и вычислять координату y вручную?

Вот мой действительно простой код, который приближается:

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

Может кто-нибудь предоставить мне примеркод для наиболее естественного способа сделать это.

Ответы [ 2 ]

7 голосов
/ 20 декабря 2011

Вы смешиваете Кварц с Какао.Существует множество совпадений между API, и если вы можете использовать только один, сделайте это.Сделайте это вместо этого:

NSPoint point = [NSEvent mouseLocation];

Кварц и Какао используют разные системы координат: Кварц использует координаты стиля «аппаратный адрес» с (0, 0) в верхнем левом углу, Какао использует координаты стиля «математика» с (0, 0) внизу слева.

1 голос
/ 23 ноября 2012

Определите в init:

NSPoint lastClick;

, а затем:

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

и в своем действии используйте его

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