2010-12-30 4 views
9

저는 작은 프로젝트를 Mac에 포팅해야하는 .NET 개발자입니다. 따라서 Objective C에 대해서는 아무 것도 알지 못합니다. 실제로 아래 코드는 스트로브를 쥐고 촬영하는 것입니다. 어두운.코코아 : 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

:

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

클릭 된 기능 : 응용 프로그램이로드 않았다. 그렇지 않으면,이 질문은 쓸모 없을 것입니다. – ughoavgfhw

+0

이 맞으면 다른 것들을합니다. 오타에 대해 죄송합니다 – Dan

답변

12

control-click을 감지하고 마우스 오른쪽 버튼을 누르지 않아도 만족 스러우면 첫 번째 코드 블록이 원하는 것을 수행합니다. 오른쪽 클릭 탐지가 실제로 필요한 경우 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: 

그런 다음 서브 클래 싱보기에 당신은 당신이 나머지를 알아낼 수 있다고 생각 다음

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

있음 및 openRightWindow : : 방법 같은 일을 나는 그것이 openLeftWindow 모두가 그냥 오타 있으리라 믿고있어

- (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"); 
    } 
} 
관련 문제