![](/img/trans.png)
[英]OS X: How can I forward contextual menu clicks from dock icon to another application?
[英]Show icons in the dock contextual menus in OS X?
我的问题很简单:
要使用停靠栏上的应用程序图标的自定义菜单, - (NSMenu*) applicationDockMenu: (id) sender;
NSApplicationDelegate
必须返回Dock将显示的菜单。
在NSMenuItem
上使用setImage
,您可以正常地向菜单添加图标。 它们出现在普通菜单上,但不会出现在应用程序停靠栏图标的上下文菜单中。
那么Apple如何管理QuickTime,XCode,预览以在其停靠上下文菜单中可访问的最近打开的文件列表中显示图标?
谢谢。
最近的文件列表实际上是标准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。
这是我的理解,部分推测并与实现细节有关:
Dock在一个单独的进程中运行,并且您无法在应用程序到Dock的过程边界上轻松传递任意NSImage
。 只有两种图像可以正确传递:标准系统图标和资源包中的图标。 但我不认为NSImage
会为这两种方法做出必要的咒语。
所以你将不得不使用碳。 具体来说,您需要将SetMenuItemIconHandle
与kMenuSystemIconSelectorType
(使用GetIconRef
获取的Carbon IconRef
)或kMenuIconResourceType
(引用应用程序包的Resources文件夹中的.icns
文件的CFString
)一起使用。
相关标题是<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位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.