Cocoa 选择popUpContextMenu中的第一项
我在一个键盘密集型应用程序上工作。双手放在键盘上。不要把手放在鼠标上 用户可以通过键盘弹出关联菜单,选择一个项目,最后按enter键Cocoa 选择popUpContextMenu中的第一项,cocoa,contextmenu,macos-carbon,nsmenu,nsmenuitem,Cocoa,Contextmenu,Macos Carbon,Nsmenu,Nsmenuitem,我在一个键盘密集型应用程序上工作。双手放在键盘上。不要把手放在鼠标上 用户可以通过键盘弹出关联菜单,选择一个项目,最后按enter键 [NSMenu popUpContextMenu]显示菜单而不突出显示任何项目。用户必须按下向下箭头一次才能突出显示第一项 我的一位朋友观察到,每次使用此菜单时,您都必须按下arrow_向下键 建议我删除此步骤,以便在弹出菜单时始终突出显示第一项 我怀疑这需要碳黑客 如何以编程方式突出显示第一项? 我用这个代码弹出一个菜单 NSEvent* event = [N
[NSMenu popUpContextMenu]
显示菜单而不突出显示任何项目。用户必须按下向下箭头一次才能突出显示第一项
我的一位朋友观察到,每次使用此菜单时,您都必须按下arrow_向下键
建议我删除此步骤,以便在弹出菜单时始终突出显示第一项
我怀疑这需要碳黑客
如何以编程方式突出显示第一项?
我用这个代码弹出一个菜单
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事件给我的应用程序,但是当菜单可见时,该事件不会执行。(该事件在菜单消失后执行)
我找到了我原来问题的答案。但是它有问题,我认为有必要解决这些问题
@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];
请注意,如果您的目标是10.6及更高版本,请不要使用class方法
popUpContextMenu
,而是使用实例的popupmenuppositioningitem:atLocation:inView:
。
如果您指定positioningItem
,它将被自动选择。当然,您需要重新计算相对于所选项目的位置
// 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];