NSWindow:将部分图像放在窗外

时间:2013-10-30 14:19:05

标签: objective-c cocoa nswindow

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

如何做到这一点?

enter image description here

1 个答案:

答案 0 :(得分:5)

以下是我发现的两篇与你想做的事情有关的文章。

Cocoa With Love Example

parmanoir.com example

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

从样本的外观来看,阴影应该仍然适用。 来自Cocoa With Love:

  

窗口后面的阴影会根据我们绘制的任何形状自动绘制。完全清除的窗口的任何部分都不会接收鼠标(它们将通过窗口掉落)。

绘制边框在视图类显示方法中执行类似的操作:

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

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

有关lockFocus的文档的重要信息:

  

隐藏或小型化单次窗口会导致该窗口的后备存储被释放。如果您不使用标准显示机制进行绘制,则应该使用lockFocusIfCanDraw而不是lockFocus,如果在窗口小型化或隐藏时有可能进行绘制。

另一种做到这一点的方法肯定是保留阴影就是使用两个窗口,让一个孩子到另一个。

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