Как я могу показать NSMenu в курсоре мыши?

Я работаю над приложением, в котором я хочу показать «контекстное меню» 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];
}

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


person David    schedule 20.12.2011    source источник


Ответы (2)


Вы смешиваете кварц с какао. Между API-интерфейсами много общего, и если вы можете придерживаться только одного, сделайте это. Вместо этого сделайте это:

NSPoint point = [NSEvent mouseLocation];

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

person Dietrich Epp    schedule 20.12.2011

Определите в 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
}
person Łukasz    schedule 23.11.2012