3

私は非常にキーボードを多用するアプリケーションに取り組んでいます。キーボードの両手。マウスに手を入れないでください。

ユーザーは、キーボードを介してコンテキストメニューをポップアップし、項目を選択して、最後にEnterキーを押すことができます。

[NSMenu popUpContextMenu]アイテムを強調表示せずにメニューを表示します。ユーザーは、最初の項目を強調表示するために、arrow_downを1回押す必要があります。

私の友人は、このメニューを使用するたびに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];
4

2 に答える 2

0

元の質問に対する答えを見つけました。_NSGetCarbonMenu()しかし、問題があり、修正する必要があると思います。

  1. 問題:ネイティブメニューアイテムのように見えるようにメニューアイテムをどのように描画しますか?
  2. 問題:カスタムビューを通常のメニュー項目としてどのように動作させるか..現在、次の項目を選択するには、arrow_downを2回押す必要があります。

これらの問題を修正する方法は?

@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];
于 2010-07-07T21:36:36.363 に答える
0

ちなみに、10.6以降をターゲットにしている場合は、クラスメソッドpopUpContextMenuを使用せず、インスタンスのを使用してpopUpMenuPositioningItem:atLocation:inView:ください。指定positioningItemすると自動的に選択されます。もちろん、選択したアイテムを基準にして位置を再計算する必要があります。

于 2015-11-06T23:01:51.957 に答える