NSWindow:将部分图像放在窗外

dhr*_*hrm 3 cocoa objective-c nswindow

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

如何才能做到这一点?

在此输入图像描述

Bra*_*red 5

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

可可与爱的例子

parmanoir.com的例子

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

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

对于我们绘制的任何形状,窗口后面的阴影会自动绘制.窗口中任何完全清除的部分都不会收到鼠标点击(它们将通过窗口掉落).

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

NSBezierPath* border = [NSBezierPath bezierPathWithRect:self.frame];
[border setLineWidth: 1.0];
[[NSColor windowFrameColor] set];
[border stroke];
Run Code Online (Sandbox Code Playgroud)

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

来自文档的重要信息lockFocus:

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

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

你不可能出于各种原因在窗外画画,其中最重要的是你的过程需要拥有或获得它所吸引的许可(许多其他原因).