gpt4 book ai didi

cocoa - 选择 popUpContextMenu 中的第一项

转载 作者:行者123 更新时间:2023-12-03 16:48:23 25 4
gpt4 key购买 nike

我正在开发一个键盘密集型应用程序。双手放在键盘上。手不能放在鼠标上。

用户可以通过键盘弹出上下文菜单,选择一个项目,最后按 Enter 键。

[NSMenu popUpContextMenu] 显示菜单而不突出显示任何项目。用户必须按一次 arrow_down 才能突出显示第一项。

我的一个 friend 观察到,每次使用此菜单时都必须按 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];

最佳答案

我找到了原来问题的答案。但是它有问题,我认为需要 _NSGetCarbonMenu() 来修复这些问题。

  1. 问题:如何绘制菜单项目所以它看起来像一个本地菜单元素?
  2. 问题:如何制作自定义 View 的行为与普通 View 一样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];

关于cocoa - 选择 popUpContextMenu 中的第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com