Какао: щелкните правой кнопкой мыши NSStatusItem
Я - разработчик.Net, которому нужно перенести небольшой проект на Mac, поэтому я почти ничего не знаю об Objective C. На самом деле код, приведенный ниже, был всего лишь набором слов о соломе и стрельбе в темноте.
Попытка создать программу меню состояния, которая открывает то или иное окно, в зависимости от того, щелкнет ли он левой или правой кнопкой мыши / 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];
}
Мне кажется, что решением было бы либо выражение if в функции openWin(), чтобы определить, какая кнопка нажата (или была ли нажата клавиша Ctrl), затем запустить соответствующий код или сделать меню осведомленным как о левой, так и правой щелчки. Но ни одна из них не сработала, когда я попытался это сделать.
Заранее спасибо.
3 ответа
Если вы будете удовлетворены обнаружением управляющего щелчка, а не щелчка правой кнопкой мыши, то первый блок кода будет делать то, что вы хотите. Если вам действительно нужно обнаружение щелчка правой кнопкой мыши, вам придется использовать пользовательское представление вместо изображения в вашем 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
Я хотел бы создать представление и использовать метод элементов состояния.
-setView:
Затем в подклассе вы можете обнаружить Ctrl+LMB, используя следующие
- (void)mouseDown:(NSEvent *)theEvent
{
[super mouseDown:theEvent];
//Respond to the mouse click
if ([theEvent modifierFlags] & NSCommandKeyMask) //Command + LMB
{
//Do something
}
}
Я думаю, что вы можете выяснить, остальное.
Более упрощенный ответ (обратите внимание, работает только с control + click)
Свойства:
@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");
}
}