2012-07-08 34 views
6

Câu hỏi của tôi là khá đơn giản:Hiển thị biểu tượng trong menu ngữ cảnh của dock trong OS X?

Để sử dụng một menu tùy chỉnh cho các biểu tượng ứng dụng trên thanh dock, - (NSMenu*) applicationDockMenu: (id) sender; của NSApplicationDelegate có quay trở lại menu dock sẽ hiển thị.

Sử dụng setImage trên NSMenuItem, bạn có thể thêm bình thường biểu tượng vào menu. Chúng hiển thị trên menu thông thường, nhưng không hiển thị trong menu ngữ cảnh của biểu tượng dock của ứng dụng.

Sau đó, Apple quản lý QuickTime, XCode, Xem trước để hiển thị các biểu tượng trong danh sách các tệp đã mở gần đây có thể truy cập trong menu ngữ cảnh của trình dock của họ như thế nào?

Thx.

Trả lời

3

Danh sách tệp gần đây thực sự là một phần của menu biểu tượng Dock chuẩn. Để sử dụng nó trong ứng dụng của bạn, bạn nên xây dựng một ứng dụng dựa trên NSDocument. Bằng cách sử dụng NSDocument, bạn sẽ nhận được menu/hành vi tệp gần đây miễn phí.

Nếu ứng dụng của bạn không có thể dựa trên NSDocument, bạn có thể hướng dẫn Cocoa để duy trì một danh sách tài liệu gần đây dựa trên URL:

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

Lưu ý rằng hiện nay, -noteNewRecentDocumentURL: chỉ hỗ trợ file:// URL (mà bạn có thể tạo ra từ một đường dẫn với +[NSURL fileURLWithPath:].) Trong tương lai, hành vi của nó có lẽ sẽ thay đổi để cho phép các URL có các lược đồ khác.

1

Đây là hiểu biết của tôi, đó là một phần phỏng đoán và liên quan đến chi tiết thực hiện:

Các Dock chạy trong một quá trình riêng biệt, và bạn không thể vượt qua một tùy NSImage trivially qua ranh giới quá trình từ ứng dụng của bạn để Dock . Chỉ có hai loại hình ảnh có thể được truyền chính xác: biểu tượng hệ thống chuẩn và biểu tượng trong gói tài nguyên của bạn. Nhưng tôi không nghĩ rằng NSImage có những câu thần chú cần thiết cho một trong hai cách này để hoạt động.

So you're going to have to use Carbon. Cụ thể, bạn cần phải sử dụng SetMenuItemIconHandle với một trong hai kMenuSystemIconSelectorType (bao gồm Carbon IconRef s, thu được với GetIconRef) hoặc kMenuIconResourceType (CFString s tham chiếu đến một tập tin trong thư mục .icns Tài gói ứng dụng của bạn).

Các tiêu đề có liên quan <HIToolbox/MacApplication.h> (ví GetApplicationDockTileMenu), <HIToolbox/Menus.h> (ví SetMenuItemIconHandle) và <HIServices/Icons.h>, (ví GetIconRef, nếu bạn đang sử dụng các biểu tượng hệ thống).

chưa được kiểm tra, nhưng nó sẽ giống như thế này:

#include <Carbon/Carbon.h> 

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

Nó có thể không đơn giản này; một số điều này có thể chỉ 32 bit.

+0

"Không khả dụng cho các ứng dụng 64 bit". :( – Wevah

+0

Phải có một cái gì đó khác, QuickTime, Preview & XCode là các ứng dụng 64 bit. –

+0

@MatthieuRiegler Không phải cái gì mà 'NSDocumentController' có làm được không? Nó có thể sử dụng một API Apple riêng tư –

Các vấn đề liên quan