2012-07-08 14 views
6

Mi pregunta es muy sencilla:¿Mostrar íconos en los menús contextuales del dock en OS X?

Para utilizar un menú personalizado para el icono de aplicaciones en el muelle, - (NSMenu*) applicationDockMenu: (id) sender; del NSApplicationDelegate tiene que devolver el menú que mostrará el muelle.

Usando setImage en un NSMenuItem, normalmente puede agregar iconos al menú. Aparecen en el menú normal, pero no en el menú contextual del icono del dock de la aplicación.

Entonces, ¿cómo administró Apple QuickTime, XCode, Preview para mostrar iconos en la lista de archivos abiertos recientemente a los que se puede acceder desde el menú contextual de su base?

Thx.

Respuesta

3

La lista de archivos recientes en realidad es parte del menú estándar de Dock. Para usarlo en su aplicación, debe compilar una aplicación basada en NSDocument. Al usar NSDocument, obtendrá el menú/comportamiento de los archivos recientes de forma gratuita.

Si su aplicación no se puede basar en NSDocument, puede indicarle cacao para mantener una lista de documentos recientes basados ​​en URL:

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

Tenga en cuenta que actualmente, -noteNewRecentDocumentURL: sólo admite file:// URL (que se puede crear a partir de una ruta con +[NSURL fileURLWithPath:].) En el futuro, es probable que su comportamiento cambie para permitir URL con otros esquemas.

1

Aquí es mi entendimiento, que es en parte una conjetura y en relación con los detalles de implementación:

El muelle se ejecuta en un proceso separado, y no se puede pasar una arbitraria NSImage trivialmente a través del límite proceso de su aplicación al Dock . Solo se pueden transmitir dos tipos de imágenes: iconos de sistema estándar e íconos en el paquete de recursos. Pero no creo que NSImage haga los encantamientos necesarios para que ninguno de estos funcione.

So you're going to have to use Carbon. En concreto, es necesario utilizar SetMenuItemIconHandle, ya sea con kMenuSystemIconSelectorType (cubre carbono IconRef s, obtenidos con GetIconRef) o kMenuIconResourceType (s CFString que hacen referencia a un archivo en la carpeta de Recursos .icns de su paquete de aplicaciones).

Las cabeceras son relevantes <HIToolbox/MacApplication.h> (por GetApplicationDockTileMenu), <HIToolbox/Menus.h> (por SetMenuItemIconHandle) y <HIServices/Icons.h>, (por GetIconRef, si está usando los iconos del sistema).

no probado, pero debería ser algo como esto:

#include <Carbon/Carbon.h> 

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

puede que no sea este sencillo; algo de esto puede ser solo de 32 bits.

+0

"No disponible para aplicaciones de 64 bits". :( – Wevah

+0

Debe haber algo más, QuickTime, Vista previa y XCode son aplicaciones de 64 bits. –

+0

@MatthieuRiegler ¿No es algo que 'NSDocumentController' hace? Podría usar una API privada de Apple. –

Cuestiones relacionadas