2012-09-17 6 views
1

NSOpenGLView를 사용하여 문서 기반 Xcode 프로젝트를 만들 때 이상한 문제가 있습니다. 응용 프로그램은 마우스 클릭에 응답하여 단일 문서로 잘 작동합니다. 파일/새로 만들기를 선택하여 두 번째 문서를 열면 새 프런트 윈도우가 맨 위에 표시되지만 마우스 클릭은 이전 (백그라운드) 객체로 전송됩니다. 새 창을 이동할 수 있으며 클릭은 이전 개체로 계속 전송됩니다. 그러나 새 창 크기를 조정하거나 이전 창에서 앞뒤로 클릭하면 모든 것이 잘 작동합니다. 그래서 문제는 새로운 (앞쪽) 창이 활성 컨텍스트가되지 않는다는 것입니다. 해결책을 제안 할 수 있습니까? http://www.mccauslandcenter.sc.edu/CRNL/sw/GLdoc.zip에 Xcode 4.4 코드 (44kb)를 넣었습니다.OpenGL을 사용하는 Xcode : 새 창은 자동으로 활성 컨텍스트가되지 않습니다.

  1. 새로운 문서 기반 응용 프로그램
  2. MyOpenGLView.m를 추가하고 MyOpenGLView.h 파일 OpenGL.framework를 대상/BuildPhases를 들어
  3. 프로젝트 추가 만들기 "링크 바이너리 라이브러리"
  4. 의 경우에 대상/BuildPhases는). 인터페이스 빌더 에서 MyOpenGLView.m을 "컴파일 소스"
  5. 를 추가 문서의 창을 선택하고 속성 관리자에서 "원샷" B의 전원을 끄십시오.) 오브젝트 라이브러리,691에서 OpenGL을보기를 추가C.)는 Identity 관리자와는 새로 생성 된 NSOpenGLView의 클래스 MyOpenGLView.h

    #import <Cocoa/Cocoa.h> 
    #import <GLUT/GLUT.h> 
    
    @interface MyOpenGLView : NSOpenGLView 
    { 
        NSTimer* timer; //animation timer 
        NSPoint mouseloc; 
        NSPoint screenSize; 
        int hourglassSize; 
        BOOL updateGL; 
    } 
    
    @end 
    

    을 ----

  6. 실행을 프로젝트

을 MyOpenGLView 시작하도록 설정 ---- START OSX의 현대 버전 (애플이 배포 이전 데모의 일부에 존재)이 문제가 발생 타인에 대한 MyOpenGLView.m

// document based OpenGL application inspired by http://www.alecjacobson.com/weblog/?p=2110 
#import "MyOpenGLView.h" 

@implementation MyOpenGLView 

-(void)prepareOpenGL 
{ 
    //NSLog(@"preparing"); 
} 

- (void)reshape 
{ 
    //NSLog(@"reshaping"); 
    NSRect rectView = [self bounds]; 
    screenSize.x = rectView.size.width; 
    screenSize.y = rectView.size.height; 
} 

void enter2D (int width, int height) //Enter2D = reshapeGL 
{ 
    glDisable(GL_DEPTH_TEST); 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, width, 0, height,-1,1); //map view to match pixel size, e.g. gluOrtho2D(0, width, 0, height); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable (GL_BLEND); //allow transparent objects 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
} 

void drawTriangle (int sz, int left, int bottom) 
{ 
    glLoadIdentity(); 
    glTranslatef(left,bottom,0.0f); 
    glBegin(GL_TRIANGLES); 
    glVertex3f(sz/2, sz, 0.0f);// Top 
    glVertex3f(0.0,0.0, 0.0); // Bottom Left 
    glVertex3f(sz,0.0f, 0.0f); // Bottom Right 
    glEnd(); // Finished Drawing The Triangle 
} 

void drawHourGlass (int sz, NSPoint center) 
{ 
    glLoadIdentity(); 
    glTranslatef(center.x,center.y,0.0f); 
    glBegin(GL_TRIANGLES); //lower triangle 
    glVertex3f(0.0, 0.0, 0.0f); // Top 
    glVertex3f(-sz,-sz, 0.0);// Bottom Left 
    glVertex3f(sz,-sz, 0.0f);// Bottom Right 
    glEnd(); 
    glBegin(GL_TRIANGLES); //upper triangle 
    glVertex3f(0.0, 0.0, 0.0f); // bottom 
    glVertex3f(-sz,sz, 0.0);// Top Left 
    glVertex3f(sz,sz, 0.0f);// Top Right 
    glEnd(); 
} 

-(void)drawRect:(NSRect)rect 
{ 
    updateGL = FALSE; 
    //NSLog(@" %f %f",rect.size.width,rect.size.height); 
    enter2D(screenSize.x,screenSize.y); 
    glClearColor(0.8,0.9,1,1); //background - blue sky 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor4f(0.6,0.3,0.1,1.0); //mountains - brown opaque 
    drawTriangle(100,10,0); 
    drawTriangle(70,80,0); 
    glColor4f(0.1,0.1,0.1,0.7); //crosshair - gray, slightly translucent 
    drawHourGlass (hourglassSize, mouseloc); 
    glFlush();  // Flush all OpenGL calls 
} 

- (void)mouseDown:(NSEvent *)event 
{ 
    mouseloc = [self convertPoint:[event locationInWindow] fromView:nil]; 
    updateGL = TRUE; 
} 

int constrain (int size) 
{ 
    if (size < 5) 
     return 5; 
    else if (size > 50) 
     return 50; 
    else 
     return size; 
} 

- (void) magnifyWithEvent:(NSEvent *)event; 
{ 
    if ([event magnification] > 0) 
     hourglassSize = hourglassSize + 5; 
    else 
     hourglassSize = hourglassSize - 5; 
    hourglassSize = constrain(hourglassSize); 
    updateGL = TRUE; 
} 

- (void)scrollWheel:(NSEvent *)event 
{ 
    if (event.deltaY < 0) 
     hourglassSize = hourglassSize + 5; 
    if (event.deltaY > 0) 
     hourglassSize = hourglassSize - 5; 
    hourglassSize = constrain(hourglassSize); 
    updateGL = TRUE; 
} 

- (void)animationTimer:(NSTimer *)timer 
{ 
    if (updateGL == TRUE) 
     [self drawRect:[self bounds]]; 
} 

-(BOOL)acceptsFirstResponder { return YES; } 
-(BOOL)becomeFirstResponder { return YES; } 
-(BOOL)resignFirstResponder { return YES; } 

- (void) awakeFromNib 
{ 
    // [[self window] setAcceptsMouseMovedEvents:YES]; 
    mouseloc.x = 30; 
    mouseloc.y = 40; 
    hourglassSize = 30; 
    timer = [NSTimer timerWithTimeInterval:(1.0f/60.0f) target:self selector:@selector(animationTimer:) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
    // ensure timer fires during resize 
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode]; 
    updateGL = TRUE; 
} 

@end 

답변