2013-04-27 182 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

相關問題