Mac OS X,如何使窗口覆盖菜单栏

7

是否可以在不全屏的情况下使窗口覆盖菜单栏?

提前致谢!

3个回答

17

可以,非常简单:

window.level = NSMainMenuWindowLevel + 1;

(参考文献:全屏绘制Mac OS X OpenGL编程指南)

sebastianmarkow正确指出这对于普通文档窗口来说是可怕的行为,但有几种窗口类型是正常的:光标、工具提示和类似Xscope的特殊实用程序。


2
仍然无法覆盖菜单栏。 - mxg
1
请澄清一下。具有该窗口层级的窗口确实会排在菜单栏之上,但是AppKit不允许您将具有标题的窗口定位在菜单栏上方(除非在某些非常奇怪的多屏幕情况下)。如果您想要在文档样式窗口中实现这个效果,那么据我所知,你运气不好。 - Jens Ayton

4

我喜欢Jens Ayton的回答,但我认为使用已定义的常量比选择任意数字更好。

个人而言,我使用了NSPopUpMenuWindowLevel,如下:

self.window.level = NSPopUpMenuWindowLevel;

以下是我发布此答案时您可能更喜欢的其他常量:

  • NSNormalWindowLevel 普通窗口级别
  • NSFloatingWindowLevel 浮动窗口级别
  • NSSubmenuWindowLevel 子菜单窗口级别
  • NSMainMenuWindowLevel 主菜单窗口级别
  • NSStatusWindowLevel 状态窗口级别
  • NSModalPaneWindowLevel 模态窗口级别
  • NSPopUpMenuWindowLevel 弹出式菜单窗口级别
  • NSScreenSaverWindowLevel 屏幕保护窗口级别

这里是参考链接(苹果公司有改变文档组织方式以及在多年内破坏这些链接的倾向,但API并不会经常改变,这就是我为什么包含了上面那个列表的原因。我怀疑这个链接在3年左右就不会再工作了,但这些常量在未来20年中可能不会经常发生变化。)

https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSWindow_Class/Reference/Reference.html#//apple_ref/doc/constant_group/Window_Levels


令人惊讶的是,我发布这个答案已经将近4年了,链接仍然有效。也许苹果改变了他们的方式,最终停止重新排列事物和破坏链接... - ArtOfWarfare

2

我不认为你可以放置在菜单栏的顶部,但是你可以通过调用以下方法将菜单栏设置为在你的应用程序成为最前面的应用程序时自动隐藏:

[[NSApplication sharedApplication] setPresentationOptions: NSApplicationPresentationAutoHideMenuBar];

这将使您可以在应用程序中正常使用通常用于菜单栏的空间。


1
文档中写道:"如果您指定了 NSApplicationPresentationAutoHideMenuBar,则必须同时使用 NSApplicationPresentationHideDock 或者 NSApplicationPresentationAutoHideDock。"否则将引发异常。 - JWWalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接