【问题标题】:NSWindow: place part of image outside windowNSWindow:将图像的一部分放在窗口外
【发布时间】:2013-10-30 14:19:04
【问题描述】:

我有一个带有 NSWindow 样式的 Cocoa 应用程序,样式为 NSBorderlessWindowMask(没有标题栏)。我想在窗口中放置图像,但图像的一部分应该放在窗口之外。

如何做到这一点?

【问题讨论】:

  • 我认为你需要做的是让你的窗口背景透明,但有一些子视图可见。
  • 窗框(+阴影)呢?

标签: objective-c cocoa nswindow


【解决方案1】:

这是我发现的两篇与你想做的事情相关的文章。

Cocoa With Love Example

parmanoir.com example

要点是将 NSWindow 子类化以使其成为无边框透明窗口,然后创建一个绘制自定义形状的子视图并使其成为窗口内容视图。

从样本的外观来看,阴影应该仍然适用。 来自可可与爱:

无论我们绘制什么形状,窗口后面的阴影都会自动绘制。完全清除的窗口的任何部分都不会收到鼠标点击(它们将穿过窗口)。

要绘制边框,请在您的视图类显示方法中执行以下操作:

NSBezierPath* border = [NSBezierPath bezierPathWithRect:self.frame];
[border setLineWidth: 1.0];
[[NSColor windowFrameColor] set];
[border stroke];

如果您没有自定义视图类,请在执行该路径之前执行[view lockFocus]; 并将self 替换为您的视图实例。画完一定要做[view unlockFocus];

来自文档的关于lockFocus 的重要消息:

隐藏或缩小一次性窗口会导致该窗口的后备存储被释放。如果你不使用标准的显示机制来绘制,你应该使用 lockFocusIfCanDraw 而不是 lockFocus 如果在窗口被缩小或隐藏时有机会绘制。

另一种肯定会保留阴影的方法是使用两个窗口并将一个窗口设置为另一个窗口。

由于各种原因,您将永远无法在窗口外绘图,其中最重要的是您的进程需要拥有或获得其所绘制对象的权限(还有许多其他原因)。

【讨论】:

  • 感谢您的回复。如果我将 NSWindow 子类化,如何在我的 NSView(内容视图)上实现上述 NSWindow 的边框和阴影?
  • 我用链接文章中直接提供的信息更新了我的答案......在视图上绘制边框很简单。见path drawing guide
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多