Cocoa: Right Click NSStatusItem

前端 未结 3 1833
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-03 02:10

I am a .Net developer who need to port a small project into Mac, so I know next to nothing about Objective C. In fact the code below was just a bunch of grasping at straws a

3条回答
  •  臣服心动
    2020-12-03 02:51

    If you will be satisfied with detecting control-click and not right click, then the first block of code will do what you want. If you really need the right click detection, you will have to use a custom view instead of an image in your NSStatusItem, and the second block of code will work.

    Simple Method:

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

    Custom view method:

    - (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 
    @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
    

提交回复
热议问题