问题描述
我有一个名为 SurfaceView 的自定义 NSView.它是 NSWindow 的 contentView,它处理鼠标点击和绘图等基本事件.但不管我做什么,它不处理 keyDown 功能.我已经覆盖了acceptsFirstResponder,但没有任何反应.
I have a custom NSView called SurfaceView. It is the contentView of a NSWindow and it handles basic events like mouse click and drawing. But don't matters what I do, it does not handle the keyDown function. I've already override the acceptsFirstResponder but nothing happens.
如果重要,我会使用自定义 NSEvent 循环运行应用程序,如下所示:
If it matters, I run the application using a custom NSEvent loop, shown below:
NSDictionary* info = [[NSBundle mainBundle] infoDictionary]; NSString* mainNibName = [info objectForKey:@"N**ainNibFile"]; NSApplication* app = [NSApplication sharedApplication]; NSNib* mainNib = [[NSNib alloc] initWithNibNamed:mainNibName bundle:[NSBundle mainBundle]]; [mainNib instantiateNibWithOwner:app topLevelObjects:nil]; [app finishLaunching]; while(true) { NSEvent* event = [app nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate date] inMode:NSDefaultRunLoopMode dequeue:YES]; [app sendEvent:event]; // Some code is execute here every frame to do some tasks... usleep(5000); }
这是 SurfaceView 代码:
Here's the SurfaceView code:
@interface SurfaceView : NSView { Panel* panel; } @property (nonatomic) Panel* panel; - (void)drawRect:(NSRect)dirtyRect; - (BOOL)isFlipped; - (void)mouseDown:(NSEvent *)theEvent; - (void)mouseDragged:(NSEvent *)theEvent; - (void)mouseUp:(NSEvent *)theEvent; - (void)keyDown:(NSEvent *)theEvent; - (BOOL)acceptsFirstResponder; - (BOOL)becomeFirstResponder; @end
--
@implementation SurfaceView @synthesize panel; - (BOOL)acceptsFirstResponder { return YES; }; - (void)keyDown:(NSEvent *)theEvent { // this function is never called }; ... @end
这是我创建视图的方式:
Here's how I create the view:
NSWindow* window = [[NSWindow alloc] initWithContentRect:N**akeRect(left, top, wide, tall) styleMask:NSBorderlessWindowMask | NSClosableWindowMask | N**iniaturizableWindowMask backing:NSBackingStoreBuffered defer:NO]; ... [window makeKeyAndOrderFront:nil]; SurfaceView* mainView = [SurfaceView alloc]; [mainView initWithFrame:N**akeRect(0, 0, wide, tall)]; mainView.panel = panel; [window setContentView:mainView]; [window setInitialFirstResponder:mainView]; [window setNextResponder:mainView]; [window makeFirstResponder:mainView];
推荐答案
我发现是什么阻止了 keyDown 事件被调用.它是 NSBorderlessWindowMask 掩码,它防止窗口成为键和主窗口.所以我创建了一个名为 NSWindow 的子类 BorderlessWindow:
I found out what was preventing the keyDown event from being called. It was the NSBorderlessWindowMask mask, it prevents the window from become the key and main window. So I have created a subclass of NSWindow called BorderlessWindow:
@interface BorderlessWindow : NSWindow { } @end @implementation BorderlessWindow - (BOOL)canBecomeKeyWindow { return YES; } - (BOOL)canBecomeMainWindow { return YES; } @end