2011-12-20 7 views
5

私は、現在のマウスの位置の隣にNSMenuの "コンテキストメニュー"を表示するアプリケーションに取り組んでいます。この時点で、コンテキストメニューを表示するためにWebViewからコマンドをトリガする方法を知っていますが、画面上の正しい位置にメニューが表示されないようです。私の座標は、私が必要とするものから垂直に反転したようです。このようなシンプルな問題のように思えますが、ベストプラクティスのベストプラクティスに努めています。マウスがどの画面にあるのか把握し、y座標を手動で計算する必要がありますか?マウスカーソルでNSMenuを表示する方法は?

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

誰かが私にこれを成し遂げるための最も自然な方法のためのサンプルコードを提供していただけます:ここでは

が近づき、私は本当に簡単なコードです。

答えて

7

クォーツとココアを混ぜています。 API間には多くのオーバーラップがあり、そうすることができるのであれば、そうしてください。代わりに、次の操作を行います。

NSPoint point = [NSEvent mouseLocation]; 

クォーツとココアが異なる座標系を使用します。クォーツが使用する「ハードウェアアドレス」はスタイルが(0、0)左上に、ココアを使用しています「数学」スタイルは、(0、0と座標と座標)を左下に表示します。

+0

それを使用しています。私の顔の前で。ありがとう! – David

1

が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 
} 
関連する問題