NSTextField по NSOpenGLView

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

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

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

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

Как я заставляю подпредставления отображаться по NSView, это привлекает использование OpenGL?

11
задан Chris Becke 8 February 2010 в 20:38
поделиться

3 ответа

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

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

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

    • Слой- поддерживаемое представление
      • Слой- размещающее представление, слой которого содержит слой OpenGL
      • Текстовое поле
6
ответ дан 3 December 2019 в 07:37
поделиться

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

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

1
ответ дан 3 December 2019 в 07:37
поделиться

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

Действительно, решение в этой ссылке фактически взламывает второе окно, чтобы оно появилось поверх вашего дисплея OpenGL, второе окно, отображающее желаемые представления Какао.

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

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

1
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: