2010-12-30 5 views
9

Я разработчик .Net, которому нужно поместить небольшой проект в Mac, поэтому я почти ничего не знаю о Objective C. На самом деле код ниже был просто связкой в ​​соломинках и стрельбой в темный.Cocoa: Щелкните правой кнопкой мыши NSStatusItem

Попытка создания программы меню состояния, которая открывает одно или другое окно в зависимости от того, является ли это щелчком левой кнопкой мыши или щелчком правой кнопки мыши/ctrl +. Вот что у меня есть, и он работает на левой кнопкой мыши только (очевидно):

-(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(), чтобы определить, какая кнопка нажата (или если ctrl удерживается нажатой), запустите соответствующий код или чтобы меню стало известно о левом и правом щелчках. Но ни один из них не работал, когда я пытался это сделать.

Спасибо заранее.

+0

Я предполагаю, что это просто опечатка, что и openLeftWindow: и openRightWindow: методы делают то же самое. В противном случае этот вопрос был бы бесполезен. – ughoavgfhw

+0

правильно, они делают разные вещи. Извините за опечатку – Dan

ответ

12

Если вас устраивает обнаружение щелчка управления, а не щелчка правой кнопкой мыши, то первый блок кода сделает то, что вы хотите. Если вам действительно нужно обнаружение правой кнопки мыши, вам придется использовать пользовательский вид вместо изображения в вашем NSStatusItem, а второй блок кода будет работать.

Простой метод:

- (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 
+0

Это второе решение так же, как я хочу. Но значок не отображается в строке состояния. Я могу нажать (слева, справа и ctrl), где должен быть значок, и он отлично работает, но сам значок отсутствует. – Dan

+0

Извините, я забыл применить метод drawRect:. Я добавлю его в свой пост. – ughoavgfhw

+1

После ручной настройки размера значка, это сработало отлично! Благодаря! – Dan

3

Я бы создал представление и использовал метод элементов состояния.

-setView: 

Тогда в подклассы зрения можно обнаружить Ctrl + LMB с помощью следующей

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

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

Я думаю, вы можете выяснить все остальное.

1

Более упрощенный ответ (Примечание, работает только с управлением + щелчок)

Свойства:

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

В Ваше приложение ли Нагрузка:

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

Clicked Функция:

- (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"); 
    } 
} 
Смежные вопросы