Mac OS X,让一个窗口越过菜单栏

Posted

技术标签:

【中文标题】Mac OS X,让一个窗口越过菜单栏【英文标题】:Mac OS X, make a window go over menu bar 【发布时间】:2011-07-21 07:14:25 【问题描述】:

是否可以在不进入全屏的情况下创建一个窗口以越过菜单栏?

提前致谢!

【问题讨论】:

【参考方案1】:

是的,很简单:

window.level = NSMainMenuWindowLevel + 1;

(参考:Drawing to the Full Screen,Mac OS X 的 OpenGL 编程指南。)

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

【讨论】:

仍然没有越过菜单栏。 请澄清。具有该窗口级别的窗口确实在菜单栏顶部排序,但 AppKit 不会让您将标题窗口放置在与菜单栏重叠的位置(除非在一些非常奇怪的多屏幕情况下)。如果您想使用文档样式的窗口执行此操作,那么据我所知,您很不走运。【参考方案2】:

我喜欢 Jens Ayton 的回答,但与其选择这样的任意数字,我认为您最好使用定义的常量之一。

就我个人而言,我使用NSPopUpMenuWindowLevel

self.window.level = NSPopUpMenuWindowLevel;

在我发布此答案时,您可能更喜欢的其他常量包括:

NSNormalWindowLevel NSFloatingWindowLevel NSSubmenuWindowLevel NSNormalWindowLevel NSMainMenuWindowLevel NSStatusWindowLevel NSModalPaneWindowLevel NSPopUpMenuWindowLevel NSScreenSaverWindowLevel

这是参考(Apple 多年来倾向于改变他们组织文档的方式并断开这些链接,但 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 年了,并且链接仍然有效。也许苹果改变了他们的方式,最终停止了重新排列和断开链接......【参考方案3】:

我不相信你可以进入菜单栏的顶部,但是你可以通过调用将菜单栏设置为当你的应用程序是最前面的应用程序时自动隐藏

[[NSApplication sharedApplication] setPresentationOptions: NSApplicationPresentationAutoHideMenuBar];

这应该让您在应用程序中使用通常用于菜单栏的空间。

【讨论】:

来自文档:“如果您指定NSApplicationPresentationAutoHideMenuBar,则必须伴随NSApplicationPresentationHideDockNSApplicationPresentationAutoHideDock。”否则会引发异常。

以上是关于Mac OS X,让一个窗口越过菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

Mac Os X 中类似 Windows 的 Qt4 菜单栏

sh 在Mac OS X Yosemite黑暗菜单栏上修复Google相册备份图标

如何在 Mac OS 中显示菜单栏图标 [重复]

NSWindow 在每个应用程序的前面和菜单栏的前面 Objective-c Mac

Glut 窗口 - MAC OSX 中的菜单栏

Mac OS 使用双屏时程序坞(菜单栏)调整展示位置