문제

나는 OpenGL 컨텐츠를 렌더링하는 nsopenglview가있는 창을 만들었습니다.

보기에 몇 가지 버튼과 텍스트 필드를 추가하고 싶습니다. 인터페이스 빌더 (또는 코드)를 사용하여 nstextfields 및 nsbuttons를 추가 할 수 있지만 나타나지 않습니다.

nsopenglview는 하위 뷰를 가질 수없는 것으로 문서화되어 있으므로 NSView에서 직접 파생하고 코드를 구현하여 NSOPENGLCONTEXT를 작성하고 사용하여 나만의 CustomGlView를 만들었습니다. 그러나 하위 뷰는 여전히 나타나지 않습니다 .- OpenGL 컨텍스트는 그 위에 그려집니다.

Windows에는이 문제가 존재하지 않습니다 .- OpenGL 호스트에 사용되는 Windows는 다음에 있어야합니다. WS_CLIPCHILDREN 그리고 WS_CHIPSIBLINGS OpenGL 표면에 의해 모든 동료 또는 하위 어린이 (보기)가 가려지지 않도록하는 스타일이 설정됩니다.

OpenGL을 사용하여 그리는 nsview에 서브 뷰를 표시하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

당신은 두 가지 선택이 있습니다 :

  1. 텍스트 필드를위한 창을 만듭니다. OpenGL보기를 호스팅하는 아이의 어린이 창으로 추가하십시오. 주요 단점은 열린 GL보기가 이동하면 위치를 올바르게 관리해야한다는 것입니다.

  2. 다음과 같은 View Hierarchy를 설정하십시오.

    • 층-후원 보다
      • 층-호스팅 레이어에 OpenGL 레이어가 포함 된 뷰
      • 텍스트 필드

다른 팁

단순히 전화하십시오 -setWantsLayer:YES nsopenglview의 하위 뷰에서.

nsopenglview 문서에 따라 하위 뷰를 가질 수 없습니다. NSOPENGLVIEW를 서브 클래스하더라도 아무것도 바뀌지 않습니다.

당신이 할 수있는 것은 nsopenglview와 nstextfield를 모두 보유 할 nsview를 만드는 것입니다. 그런 다음 하나의 무승부를 올바른 순서로 겹치게합니다.

나는 아직 OpenGL에 크게 들어 가지 않았지만 시각을 달성 할 수 있다는 것은 내 이해입니다. 효과 레이어 지원 뷰를 사용하여 석영 극단을 가진 하위 뷰; 그러나 그럴 수도 있습니다 문제가 있습니다. 하위 뷰는 직접 지원되지 않으므로 모든 솔루션은 해킹이 가능합니다.

실제로, 해당 링크의 솔루션은 실제로 OpenGL 디스플레이 위에 나타나기 위해 두 번째 창을 해킹합니다. 두 번째 창은 원하는 코코아보기를 표시합니다.

다음 코드 (위의 링크에서)는 내가 테스트하지 않은 것입니다 (다시는 OpenGL 가이가 아니었지만).

// This is the GL Window and view you already have
glWindow = [[GLWindow alloc] initWithContentRect:windowRect];
glView = [[[GLView alloc] initWithFrame:NSMakeRect(0, 0, windowRect.size.width, windowRect.size.height)] autorelease];
[glView translateOriginToPoint:NSMakePoint(glView.bounds.size.width/2, glView.bounds.size.height/2)];
[glWindow setContentView:glView];

// And here's your transparent UI window
uiWindow = [[TransparentWindow alloc] initWithContentRect:windowRect];
uiView = [[[NSView alloc] initWithFrame:NSMakeRect(0, 0, windowRect.size.width, windowRect.size.height)] autorelease];
[uiView translateOriginToPoint:NSMakePoint(uiView.bounds.size.width/2, uiView.bounds.size.height/2)];
uiView.wantsLayer = YES;

[uiWindow setContentView:uiView];
[glWindow addChildWindow:uiWindow ordered:NSWindowAbove];

다시 말하지만, 나는 이것을 테스트하지 않았지만, 당신이 원하는 시각적 효과를 얻을 수있을 것 같습니다.

텍스트는 텍스처로 렌더링 될 수 있습니다. 방금 프로젝트에 이것을 사용했고, 샘플 코드를 많이 찾고 있었고, 궁극적으로 Apple의 Glstring Demo 코드를 찾았습니다.

http://developer.apple.com/library/mac/#samplecode/cocoagl/listings/glstring_m.html

나는 버튼을 추가하려고 시도하지 않았지만 물론 자신의 클릭 이벤트 위치를 버튼의 위치와 비교할 수 있습니다 ...

이것은 내 해결책이었습니다.

1) 부모 nsview 만들기 (전화합시다 학부모).

2) nsopenglview child를 추가하십시오 학부모.

3) 추가 NSView Child를 추가하십시오 학부모 (이것이 계층 구조 내에서 OpenGlView 이후인지 확인하십시오). 이보기에 텍스트 필드 등을 추가 할 수 있습니다.

4) 부모의 ViewController에서 [ParentView SetWantsLayer : True]를 호출하십시오. 나는 이것을했다 -(void) ViewWillAppear

1) nsopenglview ~할 수 있다 하위 뷰가 있습니다. 그것은 짝수를 가질 수 있습니다.

2) 이유 약간 nsopenglview에 의해보기, 컨트롤 및 기타 요소가 괴롭힘을 당하고 있습니다. 응용 프로그램이 시작될 때 로딩 프로세스 때문입니다. 즉, 슬라이더 또는 텍스트 필드를 추가하는 경우 ~ 위에 그리고 NSOPENGLVIEW가있는 창의 컨텐츠보기로, 응용 프로그램 출시시 텍스트 필드는 NSOPENGLVIEW 아래에서 발생할 가능성이 높습니다.

이것은 사과 버그입니다. 그리고 그들은 그것에 대해 알고 있습니다.

nsopenglview에 서브 뷰를 추가하지 않고도 쉽게 해결할 수 있습니다 ...

인터페이스 빌더에서는 CustomView를 캔버스로 드래그합니다 (보기가 아님). 슬라이더, 텍스트 및 그렇지 않은 것으로 원하는 방식으로 설정하십시오. 그런 다음 View Controller에서 콘센트 (IE Topview 호출)를 만듭니다. 그런 다음 코드 어딘가에 ... 아마도 (ApplicationDidFinishLaunching)이 줄을 추가하십시오 ...

_window.contentView AddSubview : _topview]; (포지셔닝 및 레이아웃을 수행하십시오) 이것은 IB 내부의 컨텐츠 뷰로 드래그 한 것과 똑같은 일을합니다. 오직 올바른 z 위치에 대담한 것을 그립니다.

당신은 이런 식으로 IB의 제약을 잃고 수동으로해야합니다.

하나는 서브 클래스와 caopengllayer만이 일반 NSVIEW 내부의 백킹 레이어로 사용할 수 있습니다. 거기에서도 올바르게 그려졌습니다 ...

여기에 애플이 그렇게하고 싶어하는 방법은 다음과 같습니다. Calayers는 신의 신입니다.)

다음 문자열을 입력하십시오 ** nsopengllayer ** 검색 중에 Enter를 누르기 위해 Enter를 누르십시오 ...nsopengllayer

도움이 되었기를 바랍니다....

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top