我有一个带有 NSWindow 的Cocoa应用程序,其样式为 NSBorderlessWindowMask (没有标题栏)。我想在窗口中放置一个图像,但图像的一部分应该放在窗口外面。
如何做到这一点?
答案 0 :(得分:5)
以下是我发现的两篇与你想做的事情有关的文章。
要点是将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,如果在窗口小型化或隐藏时有可能进行绘制。
另一种做到这一点的方法肯定是保留阴影就是使用两个窗口,让一个孩子到另一个。
由于各种原因,您将永远无法在窗口之外进行绘制,其中最重要的是您的流程需要拥有或获得其绘制的权限(许多其他原因)。