【问题标题】:Cocoa / CoreGraphics / Quartz - borderless Quicktime X like window with rounded edgesCocoa / CoreGraphics / Quartz - 无边框 Quicktime X 类似圆边的窗口
【发布时间】:2011-12-07 13:27:38
【问题描述】:

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

有一件事让我很头疼:圆角通常出现在 Mac OS X 窗口上。我尝试使用无边框窗口掩码并使用一些 CGS 魔法 - 有一些允许窗口整形的私有 Apple 标头,但它们当然没有记录。我能够在窗户边缘切出矩形孔,但我不知道 Apple 是如何实现圆角的。

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

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

【问题讨论】:

  • 您为什么认为走NSOpenGLCPSurfaceOpacity 路线会导致性能问题?对我来说似乎完全合理。永远不要假设。测试和配置文件。
  • @Rob 因为我在发布我的问题之前做了一些研究。事实证明,还有其他人似乎无法正确处理圆角。人们已经尝试过NSOpenGLSurfaceOpacity,他们报告性能大幅下降。但我想我别无选择。
  • @cargath 仅仅因为其他人发帖说他们无法让某些东西工作并不能使它成为福音真理,你怎么知道他们正在做的其他事情没有错,你怎么知道没有成千上万的其他人没有遇到问题,只是没有发布他们的成功?就像 Rob 说的,测试和分析自己!
  • @JarrodRoberson 我做到了。在为模板缓冲区创建纹理以裁剪角落时,调整大小变得非常缓慢。这并不奇怪。当然我不能在调整大小时重绘 OpenGL,但这也不是一个理想的选择。

标签: cocoa quartz-graphics nswindow nsopenglview


【解决方案1】:

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


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

请参阅 CALayerEssentials 以获取演示如何在其他层类型中使用 CAOpenGLLayer 的示例代码。

【讨论】:

  • 您能说得更具体一点吗?我以前没有使用过 CALayers,所以这对我来说是新的——我会继承 CAOpenGLLayer 还是为我的 NSOpenGLView 子类请求一个支持层?我似乎找不到任何满足我需求的示例或教程。
  • 我能找到的关于 CAOpenGLLayer 的所有信息都是人们对它们有问题 ;) 速度问题、图片伪影等
  • 好吧,我创建了一个新的 Xcode 项目用于测试目的。我将 NSWindow 子类化以使其不可见,并将 CAOpenGLLayer 子类化以进行一些 OpenGL 绘图。然后我使用 IB 使用我的 NSWindow 子类设置一个新窗口,并将 NSView 附加到它。我在我的 AppController 代码中为这个 NSView 请求了我的 CAOpenGLLayer 子类。它有效,我可以让它绘制到我的窗口中。只是它没有圆角。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多