首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用keyDown

未调用keyDown
EN

Stack Overflow用户
提问于 2012-07-24 07:57:25
回答 2查看 7.4K关注 0票数 7

我有一个名为SurfaceView的自定义NSView。它是NSWindow的contentView,它处理鼠标点击和绘图等基本事件。但我做什么并不重要,它不处理keyDown函数。我已经覆盖了acceptsFirstResponder,但是什么也没有发生。

如果重要的话,我会使用自定义的NSEvent循环运行应用程序,如下所示:

代码语言:javascript
复制
NSDictionary* info = [[NSBundle mainBundle] infoDictionary];
NSString* mainNibName = [info objectForKey:@"NSMainNibFile"];

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代码:

代码语言:javascript
复制
@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

--

代码语言:javascript
复制
@implementation SurfaceView

@synthesize panel;

- (BOOL)acceptsFirstResponder
{
    return YES;
};

- (void)keyDown:(NSEvent *)theEvent
{
    // this function is never called
};

...

@end

下面是我创建视图的方法:

代码语言:javascript
复制
NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(left, top, wide, tall) styleMask:NSBorderlessWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask backing:NSBackingStoreBuffered defer:NO];

...

[window makeKeyAndOrderFront:nil];

SurfaceView* mainView = [SurfaceView alloc];
[mainView initWithFrame:NSMakeRect(0, 0, wide, tall)];
mainView.panel = panel;
[window setContentView:mainView];
[window setInitialFirstResponder:mainView];
[window setNextResponder:mainView];
[window makeFirstResponder:mainView];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-25 04:38:35

我找出了阻止keyDown事件被调用的原因。它是NSBorderlessWindowMask的掩码,它阻止了窗口成为关键和主窗口。因此,我创建了一个名为BorderlessWindowNSWindow子类

代码语言:javascript
复制
@interface BorderlessWindow : NSWindow
{
}

@end

@implementation BorderlessWindow

- (BOOL)canBecomeKeyWindow
{
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

@end
票数 25
EN

Stack Overflow用户

发布于 2014-10-21 22:00:23

除了回答:在您的IB复选框中签入NSWindow

应选中Title Bar。它类似于NSBorderlessWindowMask

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11622255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档