2012-07-08 17 views
6

Moje pytanie jest dość prosta:Pokaż ikony w menu kontekstowym dock w OS X?

Aby użyć menu niestandardowe ikony aplikacji w doku, - (NSMenu*) applicationDockMenu: (id) sender; z NSApplicationDelegate musi powrócić do menu, które wyświetli dok.

Za pomocą na NSMenuItem można normalnie dodawać ikony do menu. Pojawiają się w normalnym menu, ale nie w menu kontekstowym ikony przystawki aplikacji.

W jaki sposób Apple zarządzał QuickTime, XCode, Preview, aby pokazać ikony na liście ostatnio otwartych plików dostępnych w menu kontekstowym?

Thx.

Odpowiedz

3

Lista ostatnich plików jest aktualnie częścią standardowego menu ikony Dock. Aby użyć go w swojej aplikacji, powinieneś zbudować aplikację opartą na NSDocument. Korzystając z NSDocument, otrzymasz najnowsze menu/zachowanie plików za darmo.

Jeśli aplikacja nie może być oparta na NSDocument można polecić Cocoa aby utrzymać listę najnowszych dokumentów w oparciu o adresy URL:

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

Należy pamiętać, że obecnie -noteNewRecentDocumentURL: obsługuje tylko file:// URL (które można tworzyć od A path with +[NSURL fileURLWithPath:].) W przyszłości jego zachowanie prawdopodobnie zmieni się, aby zezwolić na adresy URL z innymi schematami.

1

Oto moje zrozumienie, co jest częściowo hipotetyczne i dotyczyły szczegółów realizacji:

Dock działa w oddzielnym procesie, a nie można przekazać dowolną NSImage trywialnie poprzek granicy procesowego z aplikacji do doku . Istnieją tylko dwa rodzaje obrazów, które można poprawnie przekazać: standardowe ikony systemowe i ikony w pakiecie zasobów. Ale nie wydaje mi się, żeby NSImage dokonał niezbędnych zaklęć, aby któryś z nich zadziałał.

So you're going to have to use Carbon. szczególności, trzeba użyć SetMenuItemIconHandle albo kMenuSystemIconSelectorType (obejmuje Carbon IconRef s, otrzymane z GetIconRef) lub kMenuIconResourceType (CFString y, które odnoszą się do pliku w folderze Resources .icns swoją aplikację w wiązce).

Odpowiednie nagłówki są <HIToolbox/MacApplication.h> (dla GetApplicationDockTileMenu) <HIToolbox/Menus.h> (dla SetMenuItemIconHandle) i <HIServices/Icons.h> (na GetIconRef, jeśli używasz ikon systemowych).

Nietestowane, ale powinno to wyglądać mniej więcej tak:

#include <Carbon/Carbon.h> 

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

może nie być to proste; niektóre z nich mogą być tylko 32-bitowe.

+0

"Niedostępny dla aplikacji 64-bitowych." :( – Wevah

+0

Musi być coś jeszcze, QuickTime, Preview & XCode są aplikacjami 64-bitowymi –

+0

@MatthieuRiegler Czy to nie coś, co robi 'NSDocumentController' Może używać prywatnego Apple API –

Powiązane problemy