5

現在のマウス位置の横に 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];
}

これを行うための最も自然な方法のサンプルコードを教えてください。

4

2 に答える 2

7

クォーツとココアを混ぜています。API 間には多くの重複があります。1 つだけに固執できる場合は、そうしてください。代わりにこれを行います:

NSPoint point = [NSEvent mouseLocation];

Quartz と Cocoa は異なる座標系を使用します。Quartz は左上が (0, 0) の「ハードウェア アドレス」スタイルの座標を使用し、Cocoa は左下が (0, 0) の「数学」スタイルの座標を使用します。

于 2011-12-20T06:02:34.383 に答える
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
}
于 2012-11-23T18:21:21.283 に答える