2010-07-07 5 views
2

Je travaille sur une application très intensive pour le clavier. Les deux mains sur le clavier. Pas de mains sur la souris.Sélection du premier élément dans un popUpContextMenu

Un utilisateur peut, via le clavier, faire apparaître un menu contextuel, sélectionner un élément et appuyer sur Entrée.

[NSMenu popUpContextMenu] affiche le menu sans surligner aucun élément. L'utilisateur devra appuyer une fois sur arrow_down pour mettre en évidence le premier élément.

Un de mes amis a observé que vous devez appuyer sur la touche fléchée chaque fois que vous utilisez ce menu et a suggéré que je supprime cette étape, de sorte que le premier élément est toujours mis en surbrillance lorsque le menu est en popup. Je suppose qu'il nécessite un piratage de carbone?

Comment mettre en surbrillance par programme le premier élément?


J'utilise ce code pour faire apparaître un menu.

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

update: J'ai essayé d'envoyer mon application un événement Arrow_down juste après la popUpContextMenu, mais l'événement n'est pas exécutée lorsque le menu est visible. (L'événement est exécuté après que le menu est parti).

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

Répondre

0

J'ai trouvé une réponse à ma question originale. Cependant, il a des problèmes et je pense que _NSGetCarbonMenu() est nécessaire pour les réparer.

  1. problème: comment peut-on tirer l'élément de menu il ressemble à un menu natif article?
  2. problème: comment peut-on faire la vue personnalisée se comporter comme un ordinaire menuitem .. En ce moment vous devez presse Arrow_down deux fois pour obtenir le prochain élément sélectionné.

Comment réparer ces problèmes?

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

IT !!! SOLVED Oubliez toutes les choses ci-dessus. Je viens de trouver une solution élégante qui n'exige pas du tout de carbone.

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

Pour mémoire, si vous ciblez 10.6 et plus tard, ne pas utiliser la méthode de classe popUpContextMenu, utilisez popUpMenuPositioningItem:atLocation:inView: de l'instance. Si vous spécifiez positioningItem, il sera automatiquement sélectionné. Bien sûr, vous devrez recalculer l'emplacement par rapport à l'élément sélectionné.

Questions connexes