2012-07-08 46 views
6

我的問題很簡單:在OS X的dock上下文菜單中顯示圖標?

要使用自定義菜單Dock上的應用程序圖標時,NSApplicationDelegate- (NSMenu*) applicationDockMenu: (id) sender;必須返回碼頭將顯示菜單。

NSMenuItem上使用setImage,可以將圖標正常添加到菜單中。它們顯示在正常的菜單上,但不顯示在應用程序停靠欄圖標的上下文菜單中。

那麼蘋果公司是如何管理QuickTime,XCode,Preview以顯示最近打開的文件列表中的圖標,這些文件可以在它們的碼頭上下文菜單中訪問?

Thx。

回答

3

最近的文件列表實際上是標準Dock圖標菜單的一部分。要在您的應用中使用它,您應該構建基於NSDocument的應用程序。通過使用NSDocument,您將免費獲得最近的文件菜單/行爲。

如果您的應用程序無法根據NSDocument,可以指示可可維護基於URL的最近使用的文檔列表:

NSDocumentController *docController = [NSDocumentController sharedDocumentController]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile1]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile2]; 
[docController noteNewRecentDocumentURL:locationOfMyRecentFile3]; 

注意,目前,-noteNewRecentDocumentURL:只支持file://的URL(你可以從創建)將來,它的行爲可能會改變,以允許URL與其他方案。

1

這是我的理解,這部分是推測和相關實施細則:

的碼頭運行在一個獨立的過程,你不能平凡跨越進程邊界從應用程序到Dock通過任意NSImage 。只有兩種圖像可以正確傳遞:標準系統圖標和資源包中的圖標。但我不認爲NSImage是做這些工作的必要咒語。

So you're going to have to use Carbon.具體而言,您需要使用SetMenuItemIconHandle與任何kMenuSystemIconSelectorType(包括碳IconRef年代,隨着GetIconRef獲得)或kMenuIconResourceTypeCFString s表示是指一個.icns文件在您的應用程序包的資源文件夾)。

相關的標題是<HIToolbox/MacApplication.h>(用於GetApplicationDockTileMenu),<HIToolbox/Menus.h>(用於SetMenuItemIconHandle)和<HIServices/Icons.h>,(對於GetIconRef,如果你使用的系統圖標)。

未經檢驗的,但它應該是這個樣子:

#include <Carbon/Carbon.h> 

SetMenuItemIconHandle(
    GetApplicationDockTileMenu(), 
    [dockMenu indexOfItem:dockMenuItem], 
    kMenuIconResourceType, 
    (Handle) CFSTR("icon.icns") 
); 

它可能不是這個簡單的;其中一些可能只有32位。

+0

「不適用於64位應用程序」。 :( – Wevah 2012-07-08 08:40:34

+0

必須有其他的東西,QuickTime,Preview&XCode是64位應用程序 – 2012-07-08 10:55:48

+0

@MatthieuRiegler是不是'NSDocumentController'的東西?它可能使用私有的Apple API。 – 2012-07-08 16:20:38