4

以下のコードでは、NSViewController[NSResponder]を初期化しており、、、を使用してビューを表示しNSWindow、をWindowsのファーストレスポンダーとしてNSOpenGLView設定しようとしています。NSViewController

動作していません。keyUp:以下のandメソッドでもブレークポイントに到達できると期待していました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;
}
4

3 に答える 3

3

この問題に戻ると、実際には問題は別の場所にあります。

アプリのフレームレートを制御するために、このスリープ機能を使用していました。

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];
于 2011-10-24T09:58:26.533 に答える
2

私もこの問題を抱えていました。このスレッドが役立つかもしれません

keyDown が呼び出されていない

keyDown イベントの呼び出しを妨げている原因がわかりました。それは NSBorderlessWindowMask マスクで、ウィンドウがキーおよびメイン ウィンドウになるのを防ぎます。そこで、BorderlessWindow という NSWindow のサブクラスを作成しました。

 @interface BorderlessWindow : NSWindow { }

 @end

 @implementation BorderlessWindow

 - (BOOL)canBecomeKeyWindow {
     return YES; }

 - (BOOL)canBecomeMainWindow {
     return YES; }

 @end
于 2013-03-28T00:04:19.413 に答える
2

インスタンスがキー ビュー ループに参加するには、カスタム ビューがacceptFirstResponderからYESを返す必要があります。

于 2011-09-20T18:53:16.457 に答える