Domanda

Ho creato una finestra con un NSOpenGLView in cui sto eseguendo il rendering del contenuto openGL.

Voglio aggiungere alcuni pulsanti e campi di testo alla vista:Posso aggiungere NSTextFields e NSButtons utilizzando il generatore di interfacce (o codice) ma non vengono visualizzati.

È documentato che NSOpenGLView non è in grado di avere visualizzazioni secondarie, quindi ho creato il mio CustomGLView derivando direttamente da NSView e implementando il codice per creare e utilizzare un NSOpenGLContext al suo interno.Ma le visualizzazioni secondarie ancora non vengono visualizzate: - il contesto OpenGL le dipinge.

Su Windows questo problema non esiste: - Windows utilizzato per ospitare OpenGL DEVE avere il file WS_CLIPCHILDREN E WS_CHIPSIBLINGS stili impostati garantendo che eventuali peer o sub-figli (viste) non vengano oscurati dalla superficie OpenGL.

Come posso visualizzare le visualizzazioni secondarie su un NSView che disegna utilizzando OpenGL?

È stato utile?

Soluzione

Hai 2 scelte:

  1. Crea una finestra solo per il campo di testo.Aggiungi come finestra figlia di quella che ospita la vista OpenGL.Lo svantaggio principale è che devi gestire il posizionamento corretto se la vista Open GL viene spostata.

  2. Imposta la gerarchia delle visualizzazioni in questo modo:

    • Strato-sostenuto visualizzazione
      • Strato-ospitando vista il cui livello contiene un livello OpenGL
      • Campo di testo

Altri suggerimenti

Basta chiamare -setWantsLayer:YES sulle subviews del NSOpenGLView.

NSOpenGLView non può avere subviews in base alla documentazione. Anche se si sottoclasse la NSOpenGLView, che cambierà nulla.

Che cosa si può fare è quello di creare un NSView che conterrà sia il NSOpenGLView e NSTextField. È quindi li sovrappongono nel giusto ordine per fare un pareggio in cima all'altro.

Non sono pesantemente in OpenGL ancora, ma è la mia comprensione che si può realizzare il visivo effetto di subviews con Quartz Extreme con vista su livelli sostenuti; Tuttavia, coloro che possono essere problematico . Dal momento che subviews non sono supportati direttamente, qualsiasi soluzione rischia di essere un hack.

In effetti, la soluzione in quel collegamento in realtà staglia una seconda finestra per apparire sopra la visualizzazione OpenGL, la seconda finestra che visualizza i punti di vista di cacao che desiderate.

Il seguente codice (dal link qui sopra) è qualcosa che non ho provato (ancora una volta di non essere un ragazzo OpenGL per natura - ancora), ma appare come un approccio abbastanza intelligente:

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

Ancora una volta, non ho provato questo, ma sembra che ti porterà l'effetto visivo desiderato.

Il testo può essere reso in una texture - Ho appena usato questo per un progetto, ha fatto un sacco di ricerca di codice di esempio, e, infine, ha trovato il codice di Apple GLString demo, che è stato un vero e assoluto di how-to:

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

Non ho provato l'aggiunta di pulsanti, ma si può, ovviamente, crea la tua e confrontando le posizioni di eventi click con quelli dei tuoi pulsanti ...

Questa è stata la mia soluzione:

1) Creare un genitore NSView (chiamiamolo parentView ).

2) Aggiungere un figlio NSOpenGLView a parentView .

3) Aggiungere un ulteriore NSView Bambino a parentView (assicurarsi che questo è dopo l'OpenGLView all'interno della gerarchia). È possibile aggiungere ulteriori campi di testo, ecc questo punto di vista.

4) Nel ViewController per il genitore assicuratevi di chiamare [parentView setWantsLayer: TRUE]; Ho fatto questo all'interno di - (void) viewWillAppear

1) Il NSOpenGLView può hanno una visualizzazione secondaria. Si può avere un sacco anche.

2) La ragione alcuni visite, controlli e altri elementi vengono bullismo da NSOpenGLView è dovuto al processo di caricamento quando si avvia l'applicazione. Cioè se si aggiunge un cursore o campo di testo sopra e nella vista contenuto della finestra in cui il NSOpenGLView risiede anche, su richiesta, di lancio che textfield molto probabilmente finire sotto la NSOpenGLView.

Si tratta di un bug di Apple. E sanno su di esso.

Si può risolvere abbastanza facilmente anche senza l'aggiunta di una visualizzazione secondaria per NSOpenGLView ...

In Interface Builder trascinare cioè una CustomView nella tela (non vista). E impostarlo nel modo desiderato con i cursori, testo e non quello. Quindi creare una presa di corrente (Chiamala cioè Topview) nel controller della vista. Poi da qualche parte nel codice ... Forse (applicationDidFinishLaunching) aggiungere questa riga ...

[_ window.contentView addSubview: _topView]; (Fate il vostro posizionamento e layout) Questo farà la stessa cosa come se si fosse trascinato nel contentView da soli all'interno IB. Solo che attirerà l'aggeggio nella posizione Z corretta.

Si perderanno i vincoli di IB in questo modo e devono manualmente

Si potrebbe anche semplicemente sottoclasse e CAOpenGLLayer e utilizzarla come uno strato di supporto all'interno di un NSView regolare. Anche lì si è disegnato in modo corretto ...

Ecco modo di Apple di voler farlo. CALayers sono una manna dal cielo;)

Inserisci seguente stringa ** ** NSOpenGLLayer alla ricerca e premere Invio per arrivare a dove è ... NSOpenGLLayer

Spero che questo aiuti ....

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top