2013-04-30 4 views
0

이 코드를 사용하면 메뉴에서 오른쪽 또는 왼쪽을 클릭 할 때 두 가지 다른 동작을 사용할 수 있습니다.NSEvent 오른쪽 메뉴 클릭

왼쪽 클릭오른쪽 클릭 + cmd.

가장 간단한 방법으로 cmd + 클릭을 누르지 않고 오른쪽 마우스를 클릭하면 어떻게됩니까? 당신의 도움에 대한

-(void)awakeFromNib { 

NSImage *image = [NSImage imageNamed:@"menubar"]; 
NSImage *alternateImage = [NSImage imageNamed:@"menubar-white"]; 

statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength]; 
[statusItem setHighlightMode:YES]; 
[statusItem setImage:image]; 
[statusItem setAlternateImage:alternateImage]; 
[statusItem setAction:@selector(show)]; 
} 


- (void)show { 

NSLog(@"call show"); 

NSEvent *event = [NSApp currentEvent]; 
//Respond to the mouse click 
if ([event modifierFlags] & NSCommandKeyMask) //Command 
{ 
    NSLog(@"RIGHT"); 
    [statusItem setMenu:statusMenu]; 
} 
else { 
    NSLog(@"LEFT"); 
    //open window 
} 
} 

menu click right

감사합니다!

답변

3

수정 자 플래그 대신 [NSEvent pressedMouseButtons]을 검사하십시오. 클릭 한 버튼을 결정하는 시스템을 보자. 지금하려는 방식대로하면 멀티 버튼 마우스를 실제로 사용하는 사용자에게 이상한 행동을하게됩니다.

이 같은 것을 사용할 수 있어야합니다 :

const NSUInteger pressedButtonMask = [NSEvent pressedMouseButtons]; 
const BOOL leftMouseDown = (pressedButtonMask & (1 << 0)) != 0; 
const BOOL rightMouseDown = (pressedButtonMask & (1 << 1)) != 0; 
+0

이와 비슷한? - (void) show { NSUInteger pressedButtonMask = [NSEvent pressedMouseButtons]; BOOL leftMouseDown = ((pressedButtonMask & (1 << 0)))! = 0; // BOOL rightMouseDown = ((pressedButtonMask & (1 << 1)))! = 0; if (leftMouseDown) { NSLog (@ "left"); } } – Joannes

+0

그래, 그게 효과가있을 것 같아. 솔직히이 코드를 테스트하지는 않았지만 NSEvent.h의 설명서를 기반으로 작업을 수행 할 것입니다. 내가 정말로 언급 했어야 할 또 다른 점은'NSResponder'를 상속받은 클래스로 작업하는 경우 마우스 왼쪽 버튼을 잡는'mouseDown' 메소드와 오른쪽 마우스 버튼을 잡는'rightMouseDown' 메소드를 구현할 수 있다는 것입니다 . –

+0

Objective-C 객체에 대한 메시지를 동적으로 처리 할 수 ​​없으므로 상수로 만들 수 없습니다 (유형은 사용자가 가질 수 있지만 메소드의 결과는 가져올 수 없음). – CodaFi

4

나는 아론에 동의하지 않는다. 일반적으로 마우스 또는 키보드의 즉각적인 상태를 검사하지 않아야합니다. 실제로 응답해야하는 작업 이후로 변경되었을 수 있습니다. 예를 들어 사용자가 마우스 왼쪽 단추를 누른 다음 마우스 단추를 놓으면 코드가 돌아갈 때까지 +pressedMouseButtons0을 반환 할 수 있습니다.

대신 현재 처리를 트리거 한 이벤트를 검사해야합니다. 왼쪽 클릭의 경우 typeNSLeftMouseDown 인 이벤트가 발생합니다. 마우스 오른쪽 버튼을 클릭하면 NSRightMouseDown이 표시됩니다. 어떤 종류의 마우스 클릭 이벤트가 있고 어떤 이유로 그 유형을 검사하지 않으려는 경우 이미 buttonNumber 속성을 검사 할 수 있습니다.

사실, 귀하의 -show 방법은 무엇입니까? 나는 메소드 -mouseDown:을 어딘가에 구현했다고 기대합니다. 그렇다면 왼쪽 클릭에 해당합니다. 사용자가 마우스 오른쪽 버튼을 클릭하면 다른 방법 (-rightMouseDown:)이 호출됩니다. 따라서 서로 다른 응답을 원한다면 일반적으로 두 가지 방법을 다르게 코딩해야합니다.

+0

마우스 오른쪽 버튼을 누른 상태에서 메뉴를보고 싶습니다. 가능한 경우 예제를 보여 주시겠습니까? 이제 내 코드는 처음에만 작동하지만, [statusItem setMenu : statusMenu]; 올바르게 작동합니다!감사합니다 – Joannes

+0

나는 당신이 상태 항목의'보기'를 설정하고 당신이 바라는 방식으로 자신의 견해를 그려야한다고 생각합니다. 표준 상태 항목처럼 보이게하려면'-drawRect :'에서 이미지를 그리는 것만 큼 간단 할 수도 있고, 그렇지 않을 수도 있습니다. 나도 몰라, 나는 한번도 해본 적이 없어. 어쨌든 일단 사용자 정의보기를 사용하면 메뉴가 표시되는 시점을 제어 할 수 있습니다. 'menu' 속성을 설정하지 마십시오. 오히려'-popUpStatusItemMenu :'를 (예를 들어,'-rightMouseDown :'과 같이) 원하는 조건 하에서 호출하십시오. –

+0

예, 상태 항목의 사용자 정의보기를 설정해야합니다. 이것은 좋은 예입니다 : [http://mayfleet.com/2012/12/11/custom-status-bar-item/](http://mayfleet.com/2012/12/11/custom-status-bar) -item /) 고마워! – Joannes

관련 문제