2011-12-20 37 views
5

Tôi đang làm việc trên một ứng dụng mà tôi muốn hiển thị một trình đơn ngữ cảnh "NSMenu" bên cạnh vị trí chuột hiện tại. Tại thời điểm này, tôi biết làm thế nào để kích hoạt lệnh từ WebView để hiển thị menu ngữ cảnh, tôi dường như không thể hiển thị menu hiển thị ở vị trí chính xác trên màn hình. Có vẻ như tọa độ của tôi bị đảo ngược theo chiều dọc từ những gì tôi cần. Điều này có vẻ như một vấn đề đơn giản như vậy, nhưng tôi đã dành một chút thời gian cố gắng để tốt nhất một giải pháp "thực hành tốt nhất". Tôi có cần phải tìm ra màn hình con chuột và tính toán toạ độ y theo cách thủ công không?Làm thế nào tôi có thể hiển thị NSMenu tại con trỏ chuột?

Đây là mã thực sự đơn giản của tôi mà được gần:

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

Ai đó có thể xin vui lòng cung cấp cho tôi mẫu mã cho cách tự nhiên nhất để thực hiện điều này.

Trả lời

7

Bạn đang trộn Quartz với Ca cao. Có rất nhiều sự chồng chéo giữa các API, và nếu bạn có thể gắn bó với chỉ một, làm như vậy. Làm điều này thay vì:

NSPoint point = [NSEvent mouseLocation]; 

thạch anh và ca cao sử dụng hệ thống phối hợp khác nhau: thạch anh sử dụng "địa chỉ phần cứng" phong cách phối hợp với (0, 0) ở phía trên cùng bên trái, Cocoa sử dụng "toán học" phong cách phối hợp với (0, 0) ở dưới cùng bên trái.

+0

Tôi nghĩ tôi đã cố gắng đó. Ngay trước mặt tôi. Cảm ơn! – David

1

Xác định trong init:

NSPoint lastClick; 

và sau đó:

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

và trong hành động của bạn sử dụng nó

- (IBAction)someAction:(id)sender { 
    //Use lastCLick.x and lastClick.y 
} 
Các vấn đề liên quan