在 OS X 的停靠栏上下文菜单中显示图标?
Posted
技术标签:
【中文标题】在 OS X 的停靠栏上下文菜单中显示图标?【英文标题】:Show icons in the dock contextual menus in OS X? 【发布时间】:2012-07-08 03:11:32 【问题描述】:我的问题很简单:
要为 Dock 上的应用程序图标使用自定义菜单,NSApplicationDelegate
中的 - (NSMenu*) applicationDockMenu: (id) sender;
必须返回 Dock 将显示的菜单。
在NSMenuItem
上使用setImage
,您通常可以将图标添加到菜单中。它们显示在普通菜单上,但不在应用程序停靠图标的上下文菜单中。
那么,Apple 是如何管理 QuickTime、XCode、Preview 以在其停靠上下文菜单中可访问的最近打开文件列表中显示图标?
谢谢。
【问题讨论】:
【参考方案1】:最近文件列表实际上是标准 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。
【讨论】:
【参考方案2】:以下是我的理解,部分是推测性的,与实现细节有关:
Dock 在单独的进程中运行,您不能将任意NSImage
从应用程序的进程边界随意传递到 Dock。只有两种图像可以正确传递:标准系统图标和资源包中的图标。但我不认为NSImage
做了必要的咒语来使这两种方法起作用。
So you're going to have to use Carbon. 具体来说,您需要将SetMenuItemIconHandle
与kMenuSystemIconSelectorType
(涵盖Carbon IconRef
s,通过GetIconRef
获得)或kMenuIconResourceType
(CFString
s 引用.icns
)一起使用应用程序包的 Resources 文件夹中的文件)。
相关标题为<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 位。
【讨论】:
“不适用于 64 位应用程序。” :( 肯定还有别的,QuickTime、Preview & XCode 都是 64 位应用。 @MatthieuRiegler 这不是NSDocumentController
所做的吗?它可能使用私有的 Apple API。
我不知道。是吗 ?看了之后,它可能是一个私有的 Apple API。我找不到具有这些图标的非 Apple 应用程序。 MS Office 没有什么可...
我注意到 BBEdit 还显示一个包含最近文件的菜单,包括图标,还有其他选项,例如显示 Scratchpad以上是关于在 OS X 的停靠栏上下文菜单中显示图标?的主要内容,如果未能解决你的问题,请参考以下文章
OS X 停靠图标中的 NSProgressIndicator 显示为灰色,如何制作标准蓝色
带有菜单栏但没有 Dock 图标/切换菜单的 Cocoa 应用程序