6

我的问题很简单:

- (NSMenu*) applicationDockMenu: (id) sender;要为 Dock 上的应用程序图标使用自定义菜单,NSApplicationDelegate必须返回 Dock 将显示的菜单。

使用setImageon a NSMenuItem,您通常可以将图标添加到菜单中。它们显示在普通菜单上,但不在应用程序停靠图标的上下文菜单中。

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

谢谢。

4

2 回答 2

3

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

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

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

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

于 2012-07-10T17:14:00.280 回答
1

这是我的理解,部分是推测性的,与实现细节有关:

Dock 在单独的进程中运行,您不能将任意NSImage琐碎的东西从您的应用程序跨进程边界传递到 Dock。只有两种图像可以正确传递:标准系统图标和资源包中的图标。但我认为NSImage这两种方法都没有必要的咒语。

所以你将不得不使用碳。具体来说,您需要使用SetMenuItemIconHandlewith kMenuSystemIconSelectorType(涵盖 Carbon IconRefs,通过 获得GetIconRef)或kMenuIconResourceType( CFStrings 引用.icns应用程序包的 Resources 文件夹中的文件)。

相关标题是<HIToolbox/MacApplication.h>(for GetApplicationDockTileMenu)、<HIToolbox/Menus.h>(for SetMenuItemIconHandle) 和<HIServices/Icons.h>, (for GetIconRef,如果您使用系统图标)。

未经测试,但它应该看起来像这样:

#include <Carbon/Carbon.h>

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

可能没有这么简单;其中一些可能只是 32 位的。

于 2012-07-08T04:12:38.957 回答