在OS X的Dock上下文菜单中显示图标?

时间:2012-07-08 03:11:32

标签: objective-c macos cocoa

我的问题很简单:

要使用停靠栏上的应用图标的自定义菜单,- (NSMenu*) applicationDockMenu: (id) sender;的{​​{1}}必须返回停靠栏将显示的菜单。

NSApplicationDelegate上使用setImage,您可以正常地向菜单添加图标。它们出现在普通菜单上,但不会出现在应用程序停靠栏图标的上下文菜单中。

那么Apple如何管理QuickTime,XCode,预览以在其停靠上下文菜单中可访问的最近打开的文件列表中显示图标?

THX。

2 个答案:

答案 0 :(得分:3)

最近的文件列表实际上是标准Dock图标菜单的一部分。要在您的应用中使用它,您应该构建一个基于NSDocument的应用程序。使用NSDocument,您将免费获得最近的文件菜单/行为。

如果您的应用程序不能基于NSDocument,您可以指示Cocoa维护基于URL的最新文档列表:

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

请注意,目前-noteNewRecentDocumentURL:仅支持file://个网址(您可以使用+[NSURL fileURLWithPath:]创建路径。)将来,其行为可能会更改为允许其他网址方案

答案 1 :(得分:1)

这是我的理解,部分推测并与实施细节相关:

Dock在一个单独的进程中运行,并且您无法在应用程序到Dock的过程边界上轻松传递任意NSImage。只有两种图像可以正确传递:标准系统图标和资源包中的图标。但我不认为NSImage能够为这两种方法做出必要的诠释。

So you're going to have to use Carbon.具体而言,您需要SetMenuItemIconHandle使用kMenuSystemIconSelectorType(涵盖使用IconRef获得的碳GetIconRef)或kMenuIconResourceTypeCFString s引用应用程序包的Res​​ources文件夹中的.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位。