2010-12-30 35 views
9

Tôi là một nhà phát triển .Net, những người cần chuyển một dự án nhỏ sang Mac, vì vậy tôi không biết gì về Objective C. Thực tế đoạn mã dưới đây chỉ là một nắm bắt vào ống hút và chụp bóng tối.Ca cao: Nhấn chuột phải vào NSStatusItem

Cố gắng tạo chương trình Trình đơn trạng thái mở một cửa sổ hoặc cửa sổ khác tùy thuộc vào đó là nhấp chuột trái hay nhấp chuột phải/ctrl + nhấp chuột. Đây là những gì tôi có, và nó hoạt động cho nhấp chuột trái chỉ (rõ ràng):

-(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]; 
} 

Dường như với tôi rằng giải pháp sẽ là hoặc là một câu lệnh if trong openWin() chức năng để xác định nút mà được nhấp (hoặc nếu ctrl được giữ lại) sau đó chạy mã thích hợp hoặc để làm cho trình đơn nhận thức được cả nhấp chuột trái và phải. Nhưng không ai trong số này đã làm việc khi tôi cố gắng làm như vậy.

Cảm ơn trước.

+0

Tôi giả định nó chỉ là một lỗi đánh máy mà cả openLeftWindow: và openRightWindow: phương pháp làm điều tương tự. Nếu không, câu hỏi này sẽ là vô ích. – ughoavgfhw

+0

đúng, họ làm những việc khác nhau. Xin lỗi về lỗi đánh máy – Dan

Trả lời

12

Nếu bạn hài lòng với việc phát hiện nhấp chuột điều khiển và không nhấp chuột phải, thì khối mã đầu tiên sẽ thực hiện những gì bạn muốn. Nếu bạn thực sự cần phát hiện nhấp chuột phải, bạn sẽ phải sử dụng chế độ xem tùy chỉnh thay vì hình ảnh trong NSStatusItem của bạn và khối mã thứ hai sẽ hoạt động.

Phương pháp đơn giản:

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

xem Tuỳ chỉnh phương pháp:

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

Giải pháp thứ hai này cũng giống như tôi muốn. Nhưng biểu tượng không xuất hiện trên thanh trạng thái. Tôi có thể bấm (trái, phải và ctrl), nơi biểu tượng sẽ được và nó hoạt động tuyệt vời, nhưng biểu tượng chính nó là mất tích. – Dan

+0

Xin lỗi, tôi đã quên đặt phương thức drawRect: Tôi sẽ thêm nó vào bài đăng của mình. – ughoavgfhw

+1

Sau khi đặt kích thước của biểu tượng theo cách thủ công, thao tác này rất tuyệt! Cảm ơn! – Dan

3

Tôi sẽ tạo chế độ xem và sử dụng phương thức mục trạng thái.

-setView: 

Sau đó, trong giao diện subclassed bạn có thể phát hiện ctrl + LMB sử dụng sau

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

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

Tôi nghĩ bạn có thể hình dung ra phần còn lại.

1

Một phản ứng đơn giản hơn (Lưu ý, chỉ làm việc với kiểm soát + click)

Thuộc tính:

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

Trong Ứng dụng của bạn Đã tải:

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

Clicked Chức năng:

- (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"); 
    } 
} 
Các vấn đề liên quan