自定义 NSMenu(如 Apple 的 Dock 右键菜单)?

Posted

技术标签:

【中文标题】自定义 NSMenu(如 Apple 的 Dock 右键菜单)?【英文标题】:Customize NSMenu (like Apple's Dock right click Menu)? 【发布时间】:2013-03-01 00:56:39 【问题描述】:

有没有什么方法可以自定义 NSMenu 的外观,例如,它的透明度、背景颜色或使用公共 API 的前景色(如 Apple 的 Dock 右键菜单)??

经过大量搜索,我发现了一些代码,他们使用私有 API 使菜单变暗!!!

【问题讨论】:

【参考方案1】:

我认为,如果您只使用您编写的自定义视图来查看您想要的外观并表现得像一个菜单,那么您会有更好的运气。 Apple 提供了一个示例项目CustomMenus,它说明了该技术。它是WWDC 2010 session videos、Session 145, "Key Event Handling in Cocoa Applications" 之一的伴侣。

【讨论】:

是的。但是如果我使用自定义视图,那么我必须手动处理 menuItems 的所有验证(即视图启用/禁用)+ 子菜单处理 + 跟踪区域和所有这些东西。如果没有其他选择,那么我只能采用这种方法!!!【参考方案2】:

不确定您是否决定采用自己绘制视图的解决方案,但有一个私有 API 可用于执行此操作:

    MenuRef m = [[menu _menuImpl] _principalMenuRef];
    if (m) 
        char on = 1;
        SetMenuItemProperty(m, 0, 'dock', 'dark', 1, &on);
    

有一个Github project 实现了这一点,它基本上作为NSMenu 上的一个插入类别工作,并允许使用单个属性变暗。

这绝对是一个坏主意™,因为它使用的私有 API 可能会或可能不会随着未来的操作系统更新而中断,但它似乎是停靠菜单的工作方式。强>

【讨论】:

以上是关于自定义 NSMenu(如 Apple 的 Dock 右键菜单)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bash 脚本自定义 macOS 的 Dock

在 OS X 的停靠栏上下文菜单中显示图标?

如何为自定义 B2B 应用添加 Apple ID?

我可以以编程方式打开 NSMenu 吗?

NSMenu 以编程方式选择项目

对状态栏项的 NSMenu 进行逆向工程