2010-12-30 15 views
9

मैं एक नेट डेवलपर हूं, जिसे मैक में एक छोटी परियोजना को पोर्ट करने की आवश्यकता है, इसलिए मुझे उद्देश्य सी के बारे में कुछ भी नहीं पता है। वास्तव में नीचे दिया गया कोड स्ट्रॉ और शूटिंग में पकड़ने का एक गुच्छा था अंधकार।कोको: राइट क्लिक 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 संभालने हूँ। अन्यथा, यह सवाल बेकार होगा। – 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: 

फिर subclassed ध्यान में रखते हुए आप निम्नलिखित

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

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

मुझे लगता है कि आप आराम पता लगा सकते हैं का उपयोग कर ctrl + LMB पता लगा सकते हैं।

1

एक और अधिक सरल प्रतिक्रिया (ध्यान दें, केवल नियंत्रण के साथ काम करता है + क्लिक करें)

गुण:

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

इन

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

क्लिक किया फंक्शन:: आपका आवेदन लोड किया और openRightWindow: तरीकों एक ही बात करते हैं

- (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"); 
    } 
} 
संबंधित मुद्दे