2010-12-30 16 views
9

Sono uno sviluppatore .Net che ha bisogno di trasferire un piccolo progetto in Mac, quindi non so quasi nulla dell'obiettivo C. In realtà il codice seguente era solo un mucchio di aggrapparsi alle cannucce e sparare in il buio.Cacao: Fare clic con il tasto destro su NSStatusItem

Cercando di creare un programma di menu Stato che apre una o un'altra finestra a seconda se si tratta di un clic sinistro o di un clic destro/ctrl + clic. Ecco quello che ho, e funziona per click sinistro solo (ovviamente):

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

Mi sembra che la soluzione sarebbe o un'istruzione if nella funzione openwin() per determinare quale pulsante viene cliccato (o se si tiene premuto ctrl) quindi eseguire il codice appropriato o per rendere il menu consapevole dei clic di sinistra e di destra. Ma nessuno di questi ha funzionato quando ho tentato di farlo.

Grazie In anticipo.

+0

Sto assumendo che è solo un errore di battitura che sia l'openLeftWindow: e openRightWindow: metodi fanno la stessa cosa. Altrimenti, questa domanda sarebbe inutile. – ughoavgfhw

+0

corretti, fanno cose diverse. Mi dispiace per l'errore di battitura – Dan

risposta

12

Se si è soddisfatti di rilevare control-clic e non di fare clic con il pulsante destro del mouse, il primo blocco di codice farà ciò che si desidera. Se è davvero necessario il rilevamento del clic con il pulsante destro del mouse, sarà necessario utilizzare una vista personalizzata anziché un'immagine nel NSStatusItem e il secondo blocco di codice funzionerà.

metodo semplice:

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

Vista personalizzata metodo:

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

Questa seconda soluzione è proprio come voglio. Ma l'icona non appare nella barra di stato. Posso cliccare (sinistra, destra e ctrl) dove dovrebbe essere l'icona e funziona alla grande, ma manca l'icona stessa. – Dan

+0

Scusa, ho dimenticato di mettere drawRect: method in. Lo aggiungerò al mio post. – ughoavgfhw

+1

Dopo aver impostato manualmente la dimensione dell'icona, questo ha funzionato alla grande! Grazie! – Dan

3

Vorrei creare una vista e utilizzare il metodo degli elementi di stato.

-setView: 

Poi nella vista sottoclasse è possibile rilevare ctrl + LMB utilizzando il seguente

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

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

penso che si può capire il resto.

1

Una risposta più semplificata (Nota, funziona solo con CTRL + clic)

Proprietà:

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

In La vostra applicazione è stato caricato:

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

Cliccato Funzione:

- (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"); 
    } 
} 
Problemi correlati