J'ai fait une fenêtre avec un NsopenglView que je rends compte du contenu OpenGL. P>
Je veux ajouter des boutons et des champs de texte à la vue: je peux ajouter NSTextFields et NSButTons à l'aide de Builder d'interface (ou de code), mais ils n'apparaissent pas. P>
NsopenglView est documenté comme ne pouvant pas avoir de sous-vues, donc j'ai ensuite fait mon propre CustomView en dérivant directement à partir de Nsview et en mettant en œuvre le code pour créer et utiliser un nsopenglContext. Mais les sous-espions n'apparaissent toujours pas: - Le contexte OpenGL peint sur eux. P>
sous Windows Ce problème n'existe pas: - Windows utilisée pour héberger OpenGL doit avoir le Comment obtenir des sous-espages à afficher sur un NSVIEW qui dessine à l'aide d'OpenGL? P> ws_clipchildren code> et
ws_chipsiblings CODE> Styles définis en veillant à ce que tous les pairs ou les enfants (vues) ne sera pas masqué par la surface OpenGL. P>
7 Réponses :
Je n'ai pas sous-classe le NsopenggView - J'ai créé une sous-classe Nsview entièrement nouvelle que j'ai ajouté du code pour obtenir un nsopenglContext.
J'ai essayé cela dans l'interface Builder: créé un contenu générique Nsview et lui donner un NsopenglView et un Nsbutton. Cela n'a pas d'importance de les placer, la NsopenglView peint toujours sur le Nsbutton / Nstextfield.
Je ne suis pas beaucoup dans OpenGL, mais je crois comprendre que vous pouvez accomplir l'effet visuel em> de sous-visions avec quartz extrême à l'aide de vues soutenues sur couche; Cependant, ceux-ci peuvent être problématique . Étant donné que les sous-espages ne sont pas pris en charge directement, toute solution est susceptible d'être un hack. En effet, la solution dans ce lien packs réellement une seconde fenêtre pour apparaître sur votre écran OpenGL, la deuxième fenêtre affichant les vues de cacao que vous désirez. P> Le code suivant (de la liaison ci-dessus) est quelque chose que je n'ai pas testé (encore non pas d'opengl par nature - encore), mais apparaît comme une approche assez intelligente: p> < Pré> xxx pré> Encore une fois, je n'ai pas testé cela, mais on dirait que cela vous permettra d'obtenir l'effet visuel que vous désirez. p> p>
S'il vous plaît voir mon commentaire ci-dessous sur l'impact de la performance de l'utilisation d'un calque de cette façon.
Vous avez 2 choix: p>
Créez une fenêtre juste pour le champ de texte. Ajouter comme une fenêtre enfant de celui qui accueille la vue OpenGL. Des inconvénients majeurs vous devez la gérer correctement si la vue GL Open GL est déplacée. P> LI>
Configurez votre hiérarchie de vue comme si: p>
Je ne sais pas vraiment ce que l'on entend par une couche de couche soutenue. développeur.apple.com/mac/library/samplecode/... ne fait pas ' Il implique que beaucoup de nécessitent beaucoup de choses sur la vue d'hébergement. Peut-être que c'est implicite dans la mise en mémoire tampon sélectionnée. Tout ce que vous avez à faire est: [OpenGLView SetWantslayer: Oui] Code>
TOTALEMENT - Pick # 2 et aller pour Caopenglallayer Oubliez cette classe obsolète, Buggy et Awkward appelée
nsopenglview code>. Cela ne vaut pas la peine (ces jours-ci).
Le texte peut être rendu dans une texture - je viens d'utiliser ceci pour un projet, a fait beaucoup de code d'échantillon, et a finalement trouvé le code de démonstration de la glissade de pomme, qui était une extraction absolue de la façon dont: p>
http://developer.apple.com/Library /mac/#samplecode/cocoagl/listings/glstring_m.html p>
Je n'ai pas essayé d'ajouter des boutons, mais vous pouvez bien sûr dessiner votre propre et comparer les positions des événements de clic avec ceux de vos boutons ... P>
Appelez simplement -Setwantslayer: Oui code> dans les sous-espions de NsopenglView. P>
Si vous faites cela, assurez-vous de profiler votre code. L'ajout d'une couche de CA pour un NsopenglView peut entraîner un succès de performances massives. La mémoire supplémentaire et le temps de rendu sont proportionnels à la taille de votre NsopenglView. Pour mon projet (un jeu), le taux de trame était plus que de moitié.
C'était ma solution: P>
1) Créez un parent nsview (appelons-le 2) Ajouter un enfant NsopenglView à parentview strong>. p>
3) Ajouter un enfant Nsview supplémentaire à Parentview STRUT> (Assurez-vous que ceci est après l'OpenGLView dans la hiérarchie). Vous pouvez ajouter des champs de texte supplémentaires, etc. à cette vue. P>
4) Dans la zone ViewController pour le parent, assurez-vous d'appeler [ParentView SetWantslayer: true]; Je l'ai fait dans - (vide) ViewWillappear Strong> P>
1) Le NSOPENGLVIEW 2) La raison Certaines vues, contrôles et autres éléments sont victimes d'intimidation par NsopenglView est due au processus de chargement lorsque la demande se lance. I.E Si vous ajoutez un curseur ou une textfield Ceci est un bug Apple. Et ils en savent à ce sujet. p>
Vous pouvez le résoudre assez facilement, même sans ajouter de sous-espion à NsopenglView ... P>
dans l'interface Builder glisser I.e. Un personnageview dans la toile (pas la vue). Et réglez-le comme vous le souhaitez avec des curseurs, du texte et de ce qui n'est pas. Ensuite, créez une prise (appelez-le i.e Topview) dans votre contrôleur d'affichage. Ensuite, quelque part dans votre code ... peut-être (ApplicationDiddfinishLaunching) ajoutez cette ligne ... P>
[_ window.ContentView addsubview: _topview];
(Faites votre positionnement et votre mise en page)
Cela fera exactement la même chose que si vous l'aviez traînée dans le contenu vous-même à l'intérieur de l'IB. Seulement, il ne tirera la chose dans la position z correcte. P>
Vous lâchez les contraintes de l'IB de cette façon et devez-la manuellement p>
On pourrait aussi simplement sous-classement et caopenglallayer et utiliser cela comme couche de support à l'intérieur d'un NSView régulier. Là aussi, il est tiré correctement ... P>
Voici le moyen d'Apple de vouloir faire cela. Les calaisers sont une divine;) p>
Entrez la chaîne suivante ** nsopengllayer ** à la recherche et appuyez sur Entrée pour arriver à l'endroit où il se trouve ...
Nsopengllayer P>
J'espère que cela vous aide .... p>