Cocoa / CoreGraphics / Quartz - 无边框Quicktime X,带有圆边的窗口

时间:2011-12-07 13:27:39

标签: cocoa quartz-graphics nswindow nsopenglview

我正在为Mac OS X开发基于文档的应用程序。它是一种媒体播放器,但它不是播放音频或视频文件,而是打开包含指定OpenGL动画的元数据的文本文件。我想模仿Apples QuickTime X窗口风格。这意味着,我必须自己做所有的窗口图,因为Cocoa没有合适的窗口样式。

有一件事令我头痛:通常在Mac OS X窗口上找到圆角。我尝试使用无边框窗口掩码并使用一些CGS魔法 - 有一些私有的Apple标题允许窗口整形,但它们当然没有文档。我能够在窗户边缘切割出矩形孔,但我无法弄清楚Apple如何实现圆角。

创建透明窗口并自己绘制框架不起作用,因为OpenGL视口始终是矩形的,并且更改它的唯一方法是打开NSOpenGLCPSurfaceOpacity以获得Alpha透明度并使用模板缓冲区或着色器来剪切边缘,这似乎是很多开销的地狱。

如果我将OpenGLView放入带有标题栏的标准Cocoa窗口,则底边是圆角的。这似乎发生在视图层次结构的NSThemeFrame阶段。有任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:1)

使用图层支持的视图,并在不可见窗口的CALayer中绘图。图层包括自动处理圆角和边框。


CALayer的背景位于Core Animation Programming Guide。要为NSView创建图层,您需要调用[view setWantsLayer:YES]。您可以使用CAOpenGLLayer创建setLayer:并将其分配给视图。

请参阅CALayerEssentials,了解如何在其他图层类型中使用CAOpenGLLayer的示例代码。

答案 1 :(得分:0)

由于Robs的建议不起作用,没有其他人参与讨论,我决定使用模板缓冲区来裁剪窗户角落。我这样做是通过从窗口背景创建纹理并将其渲染到模板缓冲区中,丢弃所有透明像素。看起来很好,但在调整窗口大小时速度很慢:/