Вопрос

Я создал окно с NSOpenGLView, в которое я рендерю содержимое OpenGL.

Я хочу добавить несколько кнопок и текстовых полей в представление:Я могу добавить NSTextFields и NSButtons с помощью interface builder (или кода), но они не отображаются.

NSOpenGLView документирован как неспособный иметь вспомогательные представления, поэтому затем я создал свой собственный CustomGLView, извлекая непосредственно из NSView и реализуя код для создания и использования в нем NSOpenGLContext.Но подвиды по-прежнему не отображаются:- контекст OpenGL закрашивает их.

В Windows этой проблемы не существует:- Windows, используемая для размещения OpenGL, ДОЛЖНА иметь WS_CLIPCHILDREN и WS_CHIPSIBLINGS стили устанавливают, гарантируя, что любой одноранговый узел или дочерние элементы (представления) не будут скрыты поверхностью OpenGL.

Как мне заставить подвиды отображаться поверх NSView , который рисуется с использованием OpenGL?

Это было полезно?

Решение

У вас есть 2 варианта:

  1. Создайте окно только для текстового поля.Добавьте в качестве дочернего окна то, в котором размещен OpenGL view.Основным недостатком является то, что вы должны управлять его правильным позиционированием, если Открытый вид GL перемещен.

  2. Настройте свою иерархию представлений следующим образом:

    • Слой-поддержанный Вид
      • Слой-хостинг просмотр, слой которого содержит слой OpenGL
      • Текстовое поле

Другие советы

Просто позвоните -setWantsLayer:YES в подвидах NSOpenGLView.

NSOpenGLView не может иметь подвидов в соответствии с документацией.Даже если вы создадите подкласс NSOpenGLView, это ничего не изменит.

Что вы можете сделать, так это создать NSView, который будет содержать как NSOpenGLView, так и NSTextField.Затем вы накладываете их друг на друга в правильном порядке, чтобы один рисунок накладывался поверх другого.

Я пока не очень разбираюсь в OpenGL, но, насколько я понимаю, вы можете создать визуальный эффект из подвидов с Quartz Extreme с использованием представлений на основе слоев;однако это могут быть проблематичный.Поскольку подвиды не поддерживаются напрямую, любое решение может оказаться взломом.

Действительно, решение по этой ссылке фактически взламывает второе окно, которое появляется над вашим дисплеем OpenGL, второе окно, отображающее желаемые виды 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];

Опять же, я не тестировал это, но, похоже, это даст вам желаемый визуальный эффект.

Текст может быть преобразован в текстуру - я просто использовал это для проекта, долго искал примеры кода и в конечном итоге нашел демонстрационный код GLString от Apple, который был абсолютным пособием:

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

Я не пробовал добавлять кнопки, но вы, конечно, можете нарисовать свои собственные и сравнить позиции событий нажатия с позициями ваших кнопок...

Это было мое решение:

1) Создайте родительский NSView (давайте назовем его Родительский просмотр).

2) Добавьте дочерний элемент NSOpenGLView в Родительский просмотр.

3) Добавьте дополнительный дочерний элемент NSView в Родительский просмотр (убедитесь, что это после OpenGLView в иерархии).Вы можете добавить дополнительные текстовые поля и т.д.к этому взгляду.

4) В ViewController для родительского элемента убедитесь, что вы вызываете [parentView setWantsLayer:ВЕРНО];Я сделал это внутри -(недействительный) просмотр появится

1) NSOpenGLView (Просмотр NSOpenGL) может имейте подвиды.В нем может быть даже много чего.

2) Причина некоторые представления, элементы управления и другие элементы подвергаются издевательствам со стороны NSOpenGLView из-за процесса загрузки при запуске приложения.Т.е. если вы добавите ползунок или текстовое поле выше и в представлении содержимого окна, где также находится NSOpenGLView, при запуске приложения это текстовое поле, скорее всего, окажется под NSOpenGLView.

Это ошибка Apple.И они знают об этом.

Вы можете решить это довольно легко, даже не добавляя вложенный просмотр в NSOpenGLView...

В построителе интерфейса перетащите, т. е.пользовательский вид на холсте (не сам вид).И настройте его так, как вы хотите, с помощью ползунков, текста и всего остального.Затем создайте выход (назовите его, например, topView) в вашем контроллере просмотра.Затем где-нибудь в вашем коде...Возможно (applicationDidFinishLaunching) добавить эту строку...

[_window.contentView добавляет SUBVIEW:_topView];(Создайте свое позиционирование и макет) Это будет делать то же самое, как если бы вы сами перетащили его в contentView внутри IB.Только это нарисует проклятую вещь в правильном положении Z.

Таким образом, вы теряете ограничения IB и должны выполнять это вручную

Можно также просто создать подкласс и CAOpenGLLayer и использовать его в качестве вспомогательного слоя внутри обычного NSView.Там тоже нарисовано правильно...

Вот способ Apple сделать это.Калайеры - это Находка ;)

Введите следующую строку ** NSOpenGLLayer ** в поле поиска и нажмите enter, чтобы перейти к нужному месту...Слой NSOpenGLLayer

Надеюсь, это поможет....

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top