10

私は小さなプロジェクトを Mac に移植する必要がある .Net 開発者なので、Objective C についてほとんど何も知りません。

左クリックまたは右クリック/ctrl + クリックに応じて、1 つまたは別のウィンドウを開くステータス メニュー プログラムを構築しようとしています。これが私が持っているもので、左クリックでのみ機能します(明らかに):

-(void) awakeFromNib{

    NSBundle *bundle = [NSbundle mainBundle];

    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength] retain];
    [statusImage = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"icon" ofType:@"png"]];
    [statusItem setImage:statusImage];
    [statusItem setToolTip:@"Program Name"];
    [statusItem setHighlightMode:YES];
    [statusItem setAction:@selector(openWin:)];
    [statusItem setTarget: self];
}

-(void)openWin:(id)sender{
    [self openLeftWindow:sender];
}

-(IBAction)openLeftWindow:(id)sender{
    //Code to populate Left Click Window
    [leftWindow makeKeyAndorderFront:nil];
}

-(IBAction)openRightWindow:(id)sender{
    //Code to populate Right Click Window
    [rightWindow makeKeyAndorderFront:nil];
}

解決策は、openWin() 関数の if ステートメントを使用して、どのボタンがクリックされたか (または ctrl が押されているか) を判断してから、適切なコードを実行するか、メニューに左右の両方を認識させるように思われます。クリックします。しかし、私がそうしようとしたとき、これらのどちらも機能しませんでした。

前もって感謝します。

4

3 に答える 3

12

右クリックではなくコントロール クリックの検出に満足している場合は、コードの最初のブロックで目的の処理が実行されます。右クリックの検出が本当に必要な場合は、NSStatusItem で画像の代わりにカスタム ビューを使用する必要があり、コードの 2 番目のブロックが機能します。

簡単な方法:

- (void)openWin:(id)sender {
    NSEvent *event = [NSApp currentEvent];
    if([event modifierFlags] & NSControlKeyMask) {
        [self openRightWindow:nil];
    } else {
        [self openLeftWindow:nil];
    }
}

カスタム表示方法:

- (void)awakeFromNib {
    ...
    statusImage = ...
    MyView *view = [MyView new];
    view.image = statusImage;
    [statusItem setView:view];
    [statusItem setToolTip:@"Program Name"];
    view target = self;
    view action = @selector(openLeftWindow:);
    view rightAction = @selector(openRightWindow:);
    [view release];
    //[statusImage release]; //If you are not using it anymore, you should release it.
}

MyView.h

#import <Cocoa/Cocoa.h>
@interface MyView : NSControl {
    NSImage *image;
    id target;
    SEL action, rightAction;
}
@property (retain) NSImage *image;
@property (assign) id target;
@property (assign) SEL action, rightAction;
@end

MyView.m

#import "MyView.h"
@implementation MyView
@synthesize image, target, action, rightAction;
- (void)mouseUp:(NSEvent *)event {
    if([event modifierFlags] & NSControlKeyMask) {
        [NSApp sendAction:self.rightAction to:self.target from:self];
    } else {
        [NSApp sendAction:self.action to:self.target from:self];
    }
}
- (void)rightMouseUp:(NSEvent *)event {
    [NSApp sendAction:self.rightAction to:self.target from:self];
}
- (void)dealloc {
    self.image = nil;
    [super dealloc];
}
- (void)drawRect:(NSRect)rect {
    [self.image drawInRect:self.bounds fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
}
@end
于 2010-12-30T20:33:20.183 に答える
3

ビューを作成し、ステータス アイテム メソッドを使用します。

-setView:

次に、サブクラス化されたビューで、次を使用して ctrl+LMB を検出できます

- (void)mouseDown:(NSEvent *)theEvent
{
    [super mouseDown:theEvent];

    //Respond to the mouse click
    if ([theEvent modifierFlags] & NSCommandKeyMask) //Command + LMB
    {       
      //Do something
    }
}

残りは把握できると思います。

于 2010-12-30T20:05:48.180 に答える
1

より単純化された応答 (注、コントロール + クリックでのみ機能します)

プロパティ:

@property (strong, nonatomic) NSStatusItem *statusItem;
@property (weak) IBOutlet NSMenu *statusMenu;

あなたのアプリケーションでロードされました:

[self.statusItem setAction:@selector(itemClicked:)];

クリックされた機能:

- (void)itemClicked:(id)sender
{
    NSEvent *event = [NSApp currentEvent];

    if([event modifierFlags] & NSControlKeyMask) {
        NSLog(@"Right Click Pressed");
        [self.statusItem popUpStatusItemMenu:self.statusMenu];

    } else {
        // Do Nothing
        NSLog(@"Left Click Pressed");
    }
}
于 2015-08-16T02:01:46.103 に答える