Какао / CoreGraphics / Quartz - окно Quicktime X без границ с закругленными краями - PullRequest
3 голосов
/ 07 декабря 2011

Я разрабатываю документное приложение для Mac OS X. Это своего рода медиаплеер, но вместо воспроизведения аудио- или видеофайлов предполагается открывать текстовые файлы, содержащие метаданные, определяющие анимации OpenGL. Я хотел бы имитировать стиль окна Яблоки QuickTime X. Это означает, что я должен сделать все оконные рисунки сам, потому что у Какао нет подходящего стиля окна.

Есть одна вещь, которая вызывает у меня головную боль: закругленные углы, которые обычно можно найти в окнах Mac OS X. Я попытался использовать маску окна без полей и поработать с магией CGS - есть некоторые частные заголовки Apple, которые позволяют формировать окна, но они, конечно, недокументированы. Мне удалось вырезать прямоугольные отверстия в краях моих окон, но я не мог понять, как Apple достигает закругленных углов.

Создание прозрачного окна и рисование рамки самостоятельно не работает, потому что область просмотра OpenGL всегда прямоугольная, и единственный способ изменить это - включить NSOpenGLCPSurfaceOpacity для альфа-прозрачности и использовать буфер трафарета или шейдеры, чтобы вырезать края, которые кажутся чертовски дорогими.

Если я помещаю OpenGLView в стандартное окно Какао с заголовком, нижние края закругляются. Похоже, это происходит на этапе NSThemeFrame иерархии представлений. Есть идеи как это сделать?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Используйте вид со слоем и сделайте ваш рисунок в CALayer в невидимом окне.Слои включают автоматическую обработку закругленных углов и границ.


Фон для CALayer содержится в Базовом руководстве по программированию анимации .Чтобы создать слой для NSView, вам нужно вызвать [view setWantsLayer:YES].Вы должны создать CAOpenGLLayer и назначить его представлению, используя setLayer:.

См. CALayerEssentials для примера кода, демонстрирующего, как использовать CAOpenGLLayer среди других типов слоев.

0 голосов
/ 09 декабря 2011

Поскольку предложение Робса не сработало, и никто больше не участвовал в обсуждении, я остановился на использовании буфера трафарета для обрезки углов окон.Я сделал это путем создания текстуры из фона окон и рендеринга в буфер трафарета, отбрасывая все прозрачные пиксели.Выглядит хорошо, но медленно при изменении размера окна: /

...