2012-07-08 172 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