2010-07-07 2 views
2

키보드 중심의 응용 프로그램에서 작업합니다. 키보드에서 양손으로. 마우스에 손을 대지 마십시오.popUpContextMenu에서 첫 번째 항목 선택

사용자는 키보드를 통해 상황에 맞는 메뉴를 팝업으로 표시하고 항목을 선택한 다음 Enter 키를 눌러 입력 할 수 있습니다.

[NSMenu popUpContextMenu]은 항목을 강조 표시하지 않고 메뉴를 표시합니다. 사용자는 첫 번째 항목을 강조 표시하기 위해 arrow_down을 한 번 눌러야합니다.

친구가 내게이 메뉴를 사용할 때마다 arrow_down을 눌러야한다는 것을 알았고 은이 단계를 제거한다고 제안 했으므로 메뉴가 팝업 될 때 첫 번째 항목이 항상 강조 표시됩니다.

탄소 해킹이 필요하다고 생각하십니까?

프로그래밍 방식으로 첫 번째 항목을 강조 표시하려면 어떻게해야합니까?


이 코드를 사용하여 메뉴를 팝업합니다.

NSEvent* event = [NSEvent otherEventWithType:NSApplicationDefined 
    location:location 
    modifierFlags:0 
    timestamp:0 
    windowNumber:[[self window] windowNumber] 
    context:[[self window] graphicsContext] 
    subtype:100 
    data1:0 
    data2:0 
]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:self]; 

업데이트 : 메뉴가 표시 될 때 나는 그러나 이벤트가 실행되지 않고, 바로 popUpContextMenu 후 내 응용 프로그램 arrow_down 이벤트를 보내는 노력했다. (이벤트는 메뉴가 사라진 후에 실행됩니다.)

unichar code = NSDownArrowFunctionKey; 
NSString* chars = [NSString stringWithFormat: @"%C", code]; 
NSEvent* event = [NSEvent keyEventWithType:NSKeyDown location:location modifierFlags:0 timestamp:0 windowNumber:[[self window] windowNumber] context:[[self window] graphicsContext] characters:chars charactersIgnoringModifiers:chars isARepeat:NO keyCode:code]; 
[NSApp sendEvent:event]; 

답변

0

나는 원래의 질문에 대한 답을 찾았습니다. 그러나 그것은 문제가 있으며 나는 그들을 수정하기 위해 _NSGetCarbonMenu()이 필요하다고 생각합니다.

  1. 문제 : 네이티브 메뉴 항목처럼 보이는, 그래서 어떻게 하나는 메뉴 항목을 그릴 수 있습니까?
  2. 문제 : 하나 지금 당신은 을 선택한 다음 항목을 얻기 위해 두 번 arrow_down 언론이 .. 일반 메뉴 항목으로 사용자 정의보기 동작합니다을 않는 방법에 대해 설명합니다.

이 문제를 해결하는 방법은 무엇입니까?

@interface MyMenuItem : NSView { 
    BOOL m_active; 
} 
@end 

@implementation MyMenuItem 
- (BOOL)acceptsFirstResponder { return YES; } 
- (BOOL)becomeFirstResponder { m_active = YES; return YES; } 
- (BOOL)resignFirstResponder { m_active = NO; return YES; } 

- (void)viewDidMoveToWindow { [[self window] makeFirstResponder:self]; } 

- (void)drawRect:(NSRect)rect { 
    if(m_active) { 
     [[NSColor blueColor] set]; 
    } else { 
     [[NSColor blackColor] set]; 
    } 
    NSRectFill(rect); 
} 
@end 


// this makes sure the first item gets selected when the menu popups 
MyMenuItem* view = [[[MyMenuItem alloc] initWithFrame:NSMakeRect(0, 0, 100, 20)] autorelease]; 
[view setAutoresizingMask:NSViewWidthSizable]; 
NSMenuItem* item = [menu itemAtIndex:0]; 
[item setView:view]; 
[NSMenu popUpContextMenu:menu withEvent:event forView:self]; 

는 그것을 해결! 위의 모든 것을 잊어 버려. 나는 탄소를 전혀 필요로하지 않는 우아한 해결책을 찾았습니다. 기록을 위해

// simulate a key press of the arrow-down key 
CGKeyCode key_code = 125; // kVK_DownArrow = 125 
CGEventRef event1, event2; 
event1 = CGEventCreateKeyboardEvent(NULL, key_code, YES); 
event2 = CGEventCreateKeyboardEvent(NULL, key_code, NO); 
CGEventPost(kCGSessionEventTap, event1); 
CGEventPost(kCGSessionEventTap, event2); 
CFRelease(event1); 
CFRelease(event2); 

[NSMenu popUpContextMenu:menu withEvent:event forView:self]; 
0

, 당신이 10.6 이상을 대상으로하는 경우는, 클래스 방법 popUpContextMenu를 사용하지 않는, 사용하는 인스턴스의 popUpMenuPositioningItem:atLocation:inView:. positioningItem을 지정하면 자동으로 선택됩니다. 물론 선택한 항목과 관련된 위치를 다시 계산해야합니다.