2013-04-27 185 views
0

我正在开发的应用程序需要能够否决菜单栏点击。有多种方式可以通知点击菜单的时间(主要是NSMenu通知和NSMenu代表团),但就我所知,他们都不会让您拒绝该操作。有没有办法告诉MainMenu的宽度?

我一直在想的解决方案是使用无边界透明窗口,并将其覆盖在菜单栏上。通过将窗口级别设置为足够高的值(在这种情况下为NSStatusWindowLevel),可以将其有效定位并在菜单栏上方绘制,以捕捉鼠标事件,否则会导致鼠标事件发生。那样,我有我正在寻找的东西。

该解决方案的问题是,它也掩盖状态栏(右对齐,全局菜单项)的事件,我不需要或不想要这些事件。要解决这个问题,我需要能够告诉状态栏的范围或菜单栏的范围,但是我找不到任何明显的方法。 NSApp.mainMenu.size返回主菜单的大小,就好像它被放置在弹出式菜单中一样,这显然不是我需要的。

是否有更好的方法来屏蔽事件到菜单栏,或者有什么方法可以找到它的宽度,但不包括状态栏?

这可能听起来很脏,而且是。我正在为一个旧平台的应用程序级模拟器做这件事,当应用程序负责显示菜单,当用户点击菜单栏时,它可以做任何事情,当它发生时,它可以做任何事情。

回答

1

菜单栏的宽度很简单:它是菜单栏屏幕的宽度。这包括所有的应用程序的菜单:

Screenshot of the menu bar, all the way across the screen, with the menus included.

Layers的,所以我不认为你可以在你的应用程序做的更好。所以,你将不得不减去状态栏。

使用Quartz Window Services很容易。

首先,the main menu window level建立一个无国界的,非不透明的,明确的背景下,空的窗口,然后order it back,也就是说,背后真正的主菜单。

然后,获取您的窗口的窗口号,并将其传递给the CGWindowListCreate function,指定您希望所有窗口高于您的其他窗口。

为了增强稳健性(只是为了确保光标或其他东西没有包括在内),请在相反方向上做同样的事情:在同一个窗口级别上创建第二个窗口,order it front(在菜单前和状态栏),然后在窗口后面创建一个的窗口列表。

两个数组中的窗口都是菜单栏和所有状态项。宽度为主菜单屏幕([NSScreen screens][0])的宽度是菜单栏; union将所有状态项目的矩形放在一起,然后剪切菜单栏的矩形以结束状态项目矩形的原点。

请注意,所有这些都假定菜单栏和状态项以某种方式组织,这些方式可能会在任何操作系统更新中发生变化。

+0

我担心我可能不得不做那样可怕的事情。虽然,我还发现菜单栏位于状态栏下方,并且可以在两者之间订购透明窗口。这在我的TODO清单中并不是很高(我曾问过如果有一个简单的解决方案,我可以在几分钟内完成),但我可能会研究这两个选项。 – zneak 2013-04-28 02:45:04

+0

@zneak:我不知道在菜单栏上方排列一个窗口,但在状态栏下方是有用的,因为相当多的窗口会在它下面,不仅仅是菜单栏,而且(AFAIK)无法保证阵列中的项目。你可以浏览数组,并自己挑选低于主菜单窗口级别的每个窗口,但将窗口放在菜单栏下方,并只要求窗口上方的窗口执行相同的操作。 – 2013-04-28 06:38:27

相关问题