Pergunta

Eu fiz uma janela com uma NSOpenGLView que estou renderização de conteúdo openGL em.

Eu quero adicionar alguns botões e campos de texto para a exibição: Eu posso adicionar NSTextFields e NSButtons usando construtor de interface (ou código), mas eles não aparecem

.

NSOpenGLView está documentado como não sendo capaz de ter vistas sub, então eu então fiz o meu próprio CustomGLView derivando diretamente da NSView e implementar o código para criar e usar um NSOpenGLContext nele. Mas os subviews ainda não estão aparecendo: -. Tintas contexto OpenGL sobre eles

No Windows este problema não existe: - Windows usado para hospedar OpenGL deve ter os estilos WS_CLIPCHILDREN e WS_CHIPSIBLINGS definir garantindo que qualquer par, ou sub crianças (visualizações) não vai ser obscurecida pela superfície OpenGL

.

Como faço para obter subviews para exibir mais de um NSView isso é desenho usando OpenGL?

Foi útil?

Solução

Você tem 2 opções:

  1. Criar uma janela apenas para o campo de texto. Adicione como uma janela filho do que hospeda o ponto de vista OpenGL. Grande desvantagem é que você tem que gerenciar posicionando-a corretamente se a visão Open GL é movido.

  2. Configurar sua hierarquia de vista assim:

    • Layer apoiado vista
      • Layer hospedagem vista cuja camada contém uma camada OpenGL
      • Campo de texto

Outras dicas

Basta ligar -setWantsLayer:YES sobre os subviews do NSOpenGLView.

NSOpenGLView não pode ter subviews acordo com a documentação. Mesmo se você subclasse o NSOpenGLView, que vai mudar nada.

O que você pode fazer é criar um NSView que irá realizar tanto o NSOpenGLView eo NSTextField. Você, então, se sobrepõem-los na ordem correta para fazer um desenhar em cima do outro.

Eu não sou pesadamente em OpenGL ainda, mas é o meu entendimento de que você pode realizar o efeito visual de subviews com Quartz Extreme usando visualizações lastreados em camada; No entanto, aqueles podem ser problemática . Desde subviews não são suportados directamente, qualquer solução é susceptível de ser um hack.

Na verdade, a solução em que apontam realmente hacks uma segunda janela para aparecer sobre sua exibição OpenGL, a segunda janela mostrando os pontos de vista de cacau que você deseja.

O código a seguir (a partir do link acima) é algo que eu não testei (mais uma vez não ser um cara OpenGL por natureza - ainda), mas aparece como uma abordagem bastante inteligente:

// 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];

Mais uma vez, eu não testei isso, mas parece que ele vai obter o efeito visual que você deseja.

O texto pode ser processado em uma textura - Eu apenas usei isso para um projeto, fiz um monte de olhar para o código de exemplo, e, finalmente, encontrado código de demonstração GLString da Apple, que era um tesouro absoluta de como fazer:

http://developer.apple.com/library /mac/#samplecode/CocoaGL/Listings/GLString_m.html

Eu não tentei adicionar botões, mas você pode, é claro, desenhar o seu próprio e comparando as posições de eventos de clique com os de seus botões ...

Esta foi a minha solução:

1) Criar um pai NSView (vamos chamá-lo parentView ).

2) Adicionar uma Criança NSOpenGLView para parentView .

3) Adicionar uma criança adicional NSView para parentView (certifique-se este é após o OpenGLView dentro da hierarquia). Você pode adicionar TextFields adicionais, etc, para este ponto de vista.

4) No ViewController para a marca pai certeza que você chamar [parentView setWantsLayer: TRUE]; Eu fiz isso dentro de - (void) viewWillAppear

1) O NSOpenGLView pode ter um subexibição. Ele pode ter muito mesmo.

2) A razão alguns fortes vistas, os controlos e os outros elementos estão a ser agredidos por NSOpenGLView é devido ao processo de carregamento quando o lança aplicativo. I Se você adicionar um controle deslizante ou campo de texto acima e para a exibição de conteúdo da janela onde os NSOpenGLView também reside, a pedido-lançamento que textfield provavelmente irá acabar por baixo da NSOpenGLView.

Este é um Bug Apple. E eles sabem sobre ele.

Você pode resolvê-lo com bastante facilidade, mesmo sem a adição de um subexibição para NSOpenGLView ...

Em Interface Builder arraste ou seja, um CustomView na tela (não a vista). E configurá-lo da maneira que você quiser, com sliders, texto e não o que. Em seguida, crie uma saída (Chamá-lo ou seja TOPVIEW) no seu controlador de exibição. Então em algum lugar em seu código ... Talvez (applicationDidFinishLaunching) adicionar esta linha ...

[_ window.contentView addSubview: _topView]; (Faça o seu posicionamento e disposição) Isso vai fazer exatamente a mesma coisa como se você tivesse arrastado-o na contentView-se dentro IB. Só ele vai chamar o danado na posição correta Z.

Você solta restrições do IB desta forma e tem que manualmente

Pode-se também apenas subclasse e CAOpenGLLayer e usar isso como um interior camada de suporte de um NSView regular. Há também é desenhado corretamente ...

Aqui é a maneira de querer fazer isso da Apple. CALayers são uma dádiva de Deus;)

Entre seguinte string ** NSOpenGLLayer ** em pesquisa e tecle enter para chegar onde está ... NSOpenGLLayer

Espero que isso ajude ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top