NSOpenGLView, NSWindow & NSResponder - makeFirstResponder not work



在下面的代码中,我正在初始化一个NSViewController[一个NSResponder],一个NSWindow,一个NSOpenGLView,呈现视图并试图将NSViewController设置为窗口第一响应者。

它不工作。我希望能够在keyUp:keyDown:方法中击中一个断点,但没有发生任何事情。

我错过了什么吗?

-(void)initwithFrame:(CGRect)frame 
{
    window = [[MyNSWindow alloc] initWithContentRect:frame styleMask:NSClosableWindowMask | NSTitledWindowMask backing:NSBackingStoreBuffered                           defer: YES ];   

    OpenGLView* glView = [[[OpenGLView alloc] initWithFrame:window.frame] autorelease];
    window.contentView = glView;
    [window makeFirstResponder:self];   
    [window makeKeyWindow];     
    [window display];   
}   
-(void)keyDown:(NSEvent*)theEvent
{
    unichar unicodeKey = [ [ theEvent characters ] characterAtIndex:0 ];
    unicodeKey = 0;
}
-(void)keyUp:(NSEvent *)theEvent
{
    unichar unicodeKey = [ [ theEvent characters ] characterAtIndex:0 ];
    unicodeKey = 0;
}

回到这个问题上来,实际上问题在别处。

我一直在使用这个睡眠功能来控制应用程序的帧速率:

void System::Sleep(double seconds)
{
    NSDate* limit       = [NSDate dateWithTimeIntervalSinceNow:seconds];
    NSRunLoop* runLoop  = [NSRunLoop currentRunLoop];
    [runLoop runUntilDate:limit];
}

这样做似乎会完全冻结系统并阻塞关键事件。

可以用这个来调度更新函数:

[NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(updateApp:) userInfo:nil repeats:YES];

对于参与键视图循环的实例,自定义视图必须从acceptsFirstResponder返回YES

我也有这个问题。这个线程可能有帮助

keyDown未被调用

我发现了阻止keyDown事件被调用的原因。它是NSBorderlessWindowMask掩码,它阻止了窗口成为键和主窗口。我创建了一个子类NSWindow调用BorderlessWindow:

 @interface BorderlessWindow : NSWindow { }
 @end
 @implementation BorderlessWindow
 - (BOOL)canBecomeKeyWindow {
     return YES; }
 - (BOOL)canBecomeMainWindow {
     return YES; }
 @end

相关内容

  • 没有找到相关文章

最新更新