0

私は現在、Interface Builderを使用する代わりに、プログラムで単純なcocoa NSWindowを作成しようとしています(そうする理由があります)。これは簡単なテストです:

   int main(int argc, char** argv){     
    NSWindow *mainwin;
    CocoaGLView *mainview;
    NSRect scr_frame;
    unsigned int style_mask;

    NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];

    [NSApplication sharedApplication];

    scr_frame= NSMakeRect(100, 100, 400, 400);
    style_mask=NSClosableWindowMask|NSMiniaturizableWindowMask|
    NSResizableWindowMask|NSTitledWindowMask;

    scr_frame=[NSWindow contentRectForFrameRect:scr_frame
                                      styleMask:style_mask];

    mainwin=[[NSWindow alloc]
             initWithContentRect:scr_frame
             styleMask:style_mask
             backing:NSBackingStoreBuffered
             defer:NO];
    [mainwin makeKeyAndOrderFront:nil];
    [mainwin setTitle:@"Visible screen window"];

    mainview=[[CocoaGLView alloc] initWithFrame:scr_frame];
    [mainwin setContentView:mainview];
    [mainview display];

    [mainwin setReleasedWhenClosed:YES];

    [pool drain];
    [NSApp run];
    return 0;
}

CocoaGLViewはNSOpenGLViewから派生しており、次のようになります。

    @interface CocoaGLView : NSOpenGLView {
    //some stuff
}

- (id) initWithFrame: (NSRect) frameRect;

- (void)setFrameSize:(NSSize) aSize;
- (void)drawRect:(NSRect) aRect;

@end

それは一般的に機能します。窓が見えます。CocoaGLViews drawRect関数内に描画したopenGLのものも表示できますが、残念ながら、その関数は1回しか呼び出されません。何が欠けていますか?

4

1 に答える 1

5

なぜそれが複数回呼び出されると期待するのですか?OSがそのコンテンツが無効であると判断した場合、ビューを描画するように求められます。OpenGLビューを定期的に描画する場合は、setNeedsDisplay:メッセージをビューに送信するタイマーを設定する必要があります。

于 2010-06-08T16:12:33.417 に答える