11

openGLコンテンツをレンダリングするNSOpenGLViewでウィンドウを作成しました。

ビューにいくつかのボタンとテキストフィールドを追加したい:Interface Builder(またはコード)を使用してNSTextFieldsとNSButtonsを追加できますが、表示されません。

NSOpenGLViewはサブビューを持つことができないと文書化されているため、NSViewから直接派生し、NSOpenGLContextを作成して使用するコードを実装することにより、独自のCustomGLViewを作成しました。しかし、サブビューはまだ表示されていません:-OpenGLコンテキストがサブビューをペイントします。

Windowsでは、この問題は存在しません。-OpenGLをホストするために使用されるWindowsには、ピアまたはサブ子(ビュー)がOpenGLサーフェスによって隠されないように、WS_CLIPCHILDRENおよびスタイルを設定する必要があります。WS_CHIPSIBLINGS

OpenGLを使用して描画しているNSView上にサブビューを表示するにはどうすればよいですか?

4

7 に答える 7

6

2つの選択肢があります:

  1. テキストフィールド専用のウィンドウを作成します。OpenGLビューをホストしているウィンドウの子ウィンドウとして追加します。主な欠点は、OpenGLビューが移動された場合に正しく配置する必要があることです。

  2. 次のようにビュー階層を設定します。

    • レイヤーバックビュー
      • レイヤーにOpenGLレイヤーが含まれているレイヤーホスティングビュー
      • テキストフィールド
于 2010-02-09T12:54:12.180 に答える
6

-setWantsLayer:YESNSOpenGLViewのサブビューを呼び出すだけです。

于 2012-05-04T11:46:26.780 に答える
1

ドキュメントによると、NSOpenGLViewはサブビューを持つことができませんNSOpenGLViewをサブクラス化しても、何も変わりません。

できることは、NSOpenGLViewとNSTextFieldの両方を保持するNSViewを作成することです。次に、それらを正しい順序で重ねて、一方を他方の上に描画します。

于 2010-02-08T12:28:07.600 に答える
1

私はまだOpenGLにあまり興味がありませんが、レイヤーバックビューを使用してQuartzExtremeでサブビューの視覚効果を実現できることを理解しています。ただし、これらは問題になる可能性があります。サブビューは直接サポートされていないため、どのソリューションもハッキングされる可能性があります。

実際、そのリンクのソリューションは、OpenGLディスプレイ上に表示される2番目のウィンドウを実際にハッキングします。2番目のウィンドウには、必要なCocoaビューが表示されます。

次のコード(上記のリンクから)は私がテストしていないものです(これも本質的にOpenGLの男ではありませんが)が、かなり賢いアプローチのように見えます:

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

繰り返しになりますが、これはテストしていませんが、希望する視覚効果が得られるようです。

于 2010-02-08T12:29:39.997 に答える
1

テキストはテクスチャにレンダリングできます-私はこれをプロジェクトに使用し、サンプルコードをたくさん探し、最終的にAppleのGLStringデモコードを見つけました。これはハウツーの絶対的な山でした。

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

ボタンを追加しようとはしていませんが、もちろん、独自に描画して、クリックイベントの位置をボタンの位置と比較することはできます...

于 2011-03-07T01:28:09.517 に答える
1

これが私の解決策でした:

1)親NSViewを作成します(これをparentViewと呼びます)。

2)NSOpenGLViewの子をparentViewに追加します。

3)追加のNSView子をparentViewに追加します(これが階層内のOpenGLViewの後にあることを確認してください)。このビューにTextFieldsなどを追加できます。

4)親のViewControllerで、必ず[parentView setWantsLayer:TRUE]を呼び出してください。私はこれを-(void)viewWillAppear内で行いました

于 2016-05-22T13:57:28.340 に答える
1

1)NSOpenGLViewはサブビューを持つことができます。それはたくさん持つことができます。

2)一部のビュー、コントロール、およびその他の要素がNSOpenGLViewによっていじめられている理由は、アプリケーションの起動時の読み込みプロセスが原因です。つまり、NSOpenGLViewも存在するウィンドウのコンテンツビューの上にスライダーまたはテキストフィールドを追加すると、アプリケーションの起動時に、そのテキストフィールドがNSOpenGLViewの下に表示される可能性が高くなります。

これはAppleのバグです。そして彼らはそれについて知っています。

NSOpenGLViewにサブビューを追加しなくても、非常に簡単に解決できます...

Interface Builderで、つまりCustomViewを(ビューではなく)キャンバスにドラッグします。そして、スライダーやテキストなどを使って、好きなように設定します。次に、View Controllerにアウトレット(つまり、topViewと呼びます)を作成します。次に、コードのどこかに...おそらく(applicationDidFinishLaunching)この行を追加します...

[_window.contentView addSubview:_topView]; (ポジショニングとレイアウトを行います)これは、IB内で自分自身をcontentViewにドラッグした場合とまったく同じことを行います。それだけが正しいZ位置にくそったれを描きます。

この方法でIBの制約を緩め、手動で行う必要があります

サブクラスとCAOpenGLLayerだけを使用して、通常のNSView内のバッキングレイヤーとして使用することもできます。そこにも正しく描かれています...

これがAppleのそれをしたい方法です。CALayersは天の恵みです;)

検索に次の文字列**NSOpenGLLayer**を入力し、Enterキーを押して現在の場所に移動します... NSOpenGLLayer

お役に立てれば....

于 2017-01-30T23:19:15.843 に答える