Frage

Ich habe ein Fenster mit einem NSOpenGLView gemacht, die ich mache openGL Inhalt in.

Ich möchte einige Schaltflächen und Textfelder zur Ansicht hinzufügen: Ich kann hinzufügen NSTextFields und NSButtons Interface Builder (oder Code), aber sie erscheinen nicht

.

NSOpenGLView wird dokumentiert, wie nicht Unteransichten aufweisen kann, so dass ich dann meine eigene CustomGLView durch direkt von NSView Ableitung und Umsetzung des Kodex zu schaffen und eine NSOpenGLContext darin zu verwenden. Aber die Subviews sind noch nicht angezeigt: -. Der OpenGL-Kontext über sie malt

Unter Windows existiert dieses Problem nicht: - Windows verwendet OpenGL-Host muss die WS_CLIPCHILDREN und WS_CHIPSIBLINGS Stile gesetzt sicherzustellen, dass jeder Peer oder Unter Kindern (Ansichten) nicht durch die OpenGL Oberfläche verdeckt wird

.

Wie erhalte ich Subviews über anzuzeigen ein NSView thats, zeichnen OpenGL?

War es hilfreich?

Lösung

Sie haben zwei Möglichkeiten:

  1. Erstellen Sie ein Fenster nur für das Textfeld ein. Fügen Sie als Kind Fenster der man die OpenGL Ansicht Hosting. Großer Nachteil ist, dass Sie es zu verwalten haben die Positionierung richtig, wenn die Open-GL-Ansicht bewegt wird.

  2. Richten Sie Ihre Ansicht Hierarchie wie folgt:

    • Layer- gesichert Ansicht
      • Layer- Hosting Ansicht, deren Schicht enthält eine OpenGL-Schicht
      • Textfeld

Andere Tipps

Rufen Sie einfach an -setWantsLayer:YES auf dem Subviews des NSOpenGLView.

NSOpenGLView kann nicht haben Subviews entsprechend der Dokumentation. Selbst wenn Sie die NSOpenGLView Unterklasse, das wird sich nichts ändern.

Was Sie tun können, ist eine NSView zu schaffen, die sowohl die NSOpenGLView halten und die NSTextField. Sie überlappen sie dann in der richtigen Reihenfolge ein Unentschieden über dem anderen zu machen.

Ich bin nicht stark in OpenGL noch, aber es ist mein Verständnis, dass Sie die visuelle erreichen können Wirkung von Subviews mit Quartz Extreme mit Layer-backed Ansichten; jedoch werden diejenigen, kann problematisch . Da Subviews nicht direkt unterstützt werden, eine Lösung haftet ein Hack sein.

Tatsächlich hackt die Lösung in dieser Verbindung tatsächlich ein zweites Fenster über die OpenGL-Display angezeigt werden soll, das zweite Fenster der Cocoa Ansichten anzeigt, die Sie wünschen.

Der folgende Code (aus dem obigen Link) ist etwas, was ich nicht getestet habe (wieder kein OpenGL Mann von der Natur zu sein - noch) nicht, aber scheint wie ein ziemlich kluger Ansatz:

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

Noch einmal, ich habe das nicht getestet, aber es sieht aus wie es wird Ihnen den visuellen Effekt erhalten Sie wünschen.

Der Text kann in eine Textur gerendert werden - ich dies nur für ein Projekt verwendet wird, hat für Beispielcode viel suchen, und fand schließlich GLString Demo-Code von Apple, die eine absolute Grube war, wie zu:

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

Ich habe nicht versucht, Hinzufügen von Schaltflächen, aber Sie können natürlich, ziehen Sie Ihre eigenen und die Positionen der Click-Ereignisse zu vergleichen mit denen Ihrer Tasten ...

Dies war meine Lösung:

Erstellen

1) ein Elternteil NSView (nennen wir es parentView ).

2) Fügen Sie ein NSOpenGLView Kind auf parentView .

3) Fügen Sie ein zusätzliches NSView Kind auf parentView (stellen Sie sicher, dass dies nach der OpenGLView innerhalb der Hierarchie ist). Sie können zusätzliche Textfelder, etc. hinzufügen zu dieser Ansicht.

4) In dem Viewcontroller für die Eltern sicherstellen, dass Sie rufen [parentView setWantsLayer: TRUE]; Ich tat dies innerhalb von - (void) viewWillAppear

1) Die NSOpenGLView können haben eine Subview. Es kann sogar viel hat.

2) Der Grund einige Ansichten, Kontrollen und andere Elemente von NSOpenGLView gemobbt werden, ist aufgrund des Ladevorgangs, wenn die Anwendung startet. D.h Wenn Sie einen Schieberegler oder Textfeld hinzufügen oben und in die Inhaltsansicht des Fensters, wo der NSOpenGLView liegt auch auf Antrag in Gang bringen, dass Textfeld wird höchstwahrscheinlich unter dem NSOpenGLView aufzuwickeln.

Dies ist ein Apple-Bug. Und sie wissen es.

Sie können es lösen ganz leicht auch ohne eine Subview NSOpenGLView Hinzufügen ...

In Interface Builder ziehen heißt eine Custom in die Leinwand (nicht der Ansicht). Und legen Sie es so, wie Sie es mit Schiebern wollen, Text und was nicht. Dann erstellen Sie einen Auslass (nennen wir es das heißt von oben gesehen) im View-Controller. Dann irgendwo im Code ... Vielleicht (applicationDidFinishLaunching) fügen Sie diese Zeile ...

[_ window.contentView addSubview: _topView]; (Machen Sie Ihre Positionierung und Layout) Dies wird genau die gleiche Sache tun, als ob Sie es in die content sich innerhalb IB gezogen hatte. Nur wird es das verflixte Ding in der richtigen Z-Position ziehen.

Sie verlieren IB Einschränkungen auf diese Weise und müssen manuell

Man könnte auch nur eine Unterklasse und CAOpenGLLayer und verwendet, die als Trägerschicht innerhalb eines regelmäßigen NSView. Auch dort wird es gezeichnet richtig ...

Hier ist Art und Weise Apple zu wollen, das zu tun. CALayers sind ein Geschenk des Himmels;)

Geben Sie String folgende ** ** NSOpenGLLayer auf der Suche und drücken Sie die Eingabetaste, um zu bekommen, wo es ist ... NSOpenGLLayer

Hope, das hilft ....

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top