2010年6月10日星期四

用Cocoa实现Mac的系统托盘图标

虽然这个题目起的有点暧昧——Mac程序当然是用Cocoa实现的——但是这基本上是出于SEO的考虑。好吧,开始用代码说事。

MenuLet.h
#import

@interface MenuLet : NSObject {
}
+ (void) showMenuIcon;
@end
MenuLet.m
#import "MenuLet.h"

@implementation MenuLet

+(void) showMenuIcon {
    NSStatusItem *statusItem;
    NSMenu *theMenu;
    
    statusItem = [[[NSStatusBar systemStatusBar] statusItemWithLength: NSVariableStatusItemLength] retain];
    [statusItem setImage:[NSImage imageNamed:@"iSSHTray.tiff"]];
    [statusItem setHighlightMode:YES];
    [statusItem setTitle:@""];
    [statusItem setEnabled:YES];
    [statusItem setToolTip:@""];
    
    theMenu = [[NSMenu alloc] initWithTitle:@""];
    [theMenu addItemWithTitle:@"Show" action:@selector(unhide:) keyEquivalent:@"S"];
    [theMenu addItemWithTitle:@"Hide" action:@selector(hide:) keyEquivalent:@"H"];
    [theMenu addItemWithTitle:@"Quit" action:@selector(terminate:) keyEquivalent:@"Q"];
    
    [statusItem setMenu:theMenu];
    [theMenu release];
}

@end
使用方法:

在应用程序的Delegate(委托类)的实现中加入:
-(void)applicationDidFinishLaunching:(NSNotification *)anotification {
    [MenuLet showMenuIcon]; //Show Tray Icon and Menu
}
整个代码的原理很简单,就是创建一个NSStatusItem对象,设置图标,标题,工具提示,启用状态,加入一个NSMenu对象。最后,在应用程序的委托类中调用方法,显示菜单。

关于某文中提到的HIG说不要用系统托盘菜单。不过现在的HIG似乎已经修改了关于这部分的描述,没有鼓励,也没有要求开发人员不使用系统托盘(专业名词应该叫做Menubar Extras)。参看这里

不过有时候一个简单的程序占用着Dock图标看着很闹心,还不如用一个MenuLet,更何况,现在的显示器都是宽屏的,不是嘛。 :P

附注:本文代码照抄了这里;理解部分参考了这里;苹果人机界面指导原则在这里

没有评论:

发表评论