2010-07-07 3 views
2

Я работаю на очень интенсивном приложении с клавиатурой. Обе руки на клавиатуре. Никаких рук на мышь.Выбор первого элемента в popUpContextMenu

Пользователь может через клавиатуру всплывающее контекстное меню, выбрать элемент и, наконец, нажать Enter.

[NSMenu popUpContextMenu] отображает меню без выделения какого-либо элемента. Пользователь должен будет нажать стрелку вниз один раз, чтобы выделить первый элемент.

Мой друг заметил, что каждый раз, когда вы используете это меню, вам нужно нажимать стрелку вниз, и предложил, чтобы я удалил этот шаг, чтобы первый элемент всегда выделялся при всплывании меню.

Я подозреваю, что это требует угольного взлома?

Как программно выделить первый элемент?


Этот код используется для всплывающего меню.

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

обновление: Я попытался отправки моего приложения в Arrow_down события сразу после popUpContextMenu, однако событие не выполняется, когда меню отображается. (Событие выполняется после исчезновения меню).

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. ПРОБЛЕМЫ: как сделать один пользовательский вид, ведут себя как обычный MENUITEM .. прямо сейчас вы должны прессы 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]; 

РЕШИТЬ ЭТО !!! Забудьте все выше. Я только что нашел элегантное решение, которое не требует Carbon.

// 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, он будет выбран автоматически. Конечно, вам нужно будет пересчитать местоположение относительно выбранного элемента.