11
votes

Nstextfield sur NsopenglView

J'ai fait une fenêtre avec un NsopenglView que je rends compte du contenu OpenGL.

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.

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.

sous Windows Ce problème n'existe pas: - Windows utilisée pour héberger OpenGL doit avoir le ws_clipchildren et ws_chipsiblings Styles définis en veillant à ce que tous les pairs ou les enfants (vues) ne sera pas masqué par la surface OpenGL.

Comment obtenir des sous-espages à afficher sur un NSVIEW qui dessine à l'aide d'OpenGL?


0 commentaires

7 Réponses :



1
votes

Je ne suis pas beaucoup dans OpenGL, mais je crois comprendre que vous pouvez accomplir l'effet visuel 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.

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: < Pré> xxx

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.


1 commentaires

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.



6
votes

Vous avez 2 choix:

  1. 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.

  2. Configurez votre hiérarchie de vue comme si:

    • calque- sauvegardé vue
      • COUCHE- Hébergement Quelle couche contient une couche opengl
      • Champ de texte

2 commentaires

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]


TOTALEMENT - Pick # 2 et aller pour Caopenglallayer nsopenglview . Cela ne vaut pas la peine (ces jours-ci).



1
votes

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:

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

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 ...


0 commentaires

6
votes

Appelez simplement -Setwantslayer: Oui dans les sous-espions de NsopenglView.


1 commentaires

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é.



1
votes

C'était ma solution:

1) Créez un parent nsview (appelons-le parentview ).

2) Ajouter un enfant NsopenglView à parentview .

3) Ajouter un enfant Nsview supplémentaire à Parentview (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.

4) Dans la zone ViewController pour le parent, assurez-vous d'appeler [ParentView SetWantslayer: true]; Je l'ai fait dans - (vide) ViewWillappear


0 commentaires

1
votes

1) Le NSOPENGLVIEW peut avoir une sous-vision. Il peut avoir beaucoup même.

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 ci-dessus et dans la vue de contenu de la fenêtre dans laquelle NsopenglView réside également, lors de l'application-lancement que Textfield sera probablement liquidée sous la NsopenglView.

Ceci est un bug Apple. Et ils en savent à ce sujet.

Vous pouvez le résoudre assez facilement, même sans ajouter de sous-espion à NsopenglView ...

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 ...

[_ 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.

Vous lâchez les contraintes de l'IB de cette façon et devez-la manuellement

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 ...

Voici le moyen d'Apple de vouloir faire cela. Les calaisers sont une divine;)

Entrez la chaîne suivante ** nsopengllayer ** à la recherche et appuyez sur Entrée pour arriver à l'endroit où il se trouve ... Nsopengllayer

J'espère que cela vous aide ....


0 commentaires