mac上的应用程序除了左上方会有菜单之外,在屏幕的右上方也会有一个图标样的菜单,这个类似于windows上右下角的system tray。

本文讲述如何给自己的应用程序添加一个system tray(在mac上应该叫状态栏吧,status item)

1. 创建cocoa的application,名字为MyStatusItem,其他默认选项。

2. 导入两个文件,名为StatusItemController,如下图所示:

3. 准备好2个png文件,icon.png以及icon@2x.png,选中拖拽到Project上,然后会弹出窗口要求copy并导入这两个resource文件,都选默认。

4. 添加一个object知道MainMenu.xib中,并选中Class为刚刚导入的StatusItemController.

5. 跟第4步一样的方法,拖入一个Menu项,然后重命名各个menu item的名字。

我就写了2个,一个打开主界面一个关闭程序

6. 修改文件如下:

//
// AppDelegate.h
// MySatusItem
//
// Created by user on 12/3/14.
// Copyright (c) 2014 user. All rights reserved.
// #import <Cocoa/Cocoa.h>
#import "StatusItemController.h" @interface AppDelegate : NSObject <NSApplicationDelegate,StatusItemDelegate> @property (assign) IBOutlet NSWindow *window; @end
//
// AppDelegate.m
// MySatusItem
//
// Created by user on 12/3/14.
// Copyright (c) 2014 user. All rights reserved.
// #import "AppDelegate.h" @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
} -(IBAction)openMainConsole:(id)sender
{
NSLog(@"open Main console from status item");
NSWindow *window = [self window];
[window makeKeyAndOrderFront:nil];
}
@end
//
// StatusItemController.h
// MySatusItem
//
// Created by user on 12/3/14.
// Copyright (c) 2014 user. All rights reserved.
// #import <Foundation/Foundation.h>
@protocol StatusItemDelegate; @interface StatusItemController : NSView
{
IBOutlet NSMenu *statuMenu;
NSStatusItem *statusItem;
NSImage *statusImage;
NSImage *statusHighLightImage;
}
@end @protocol StatusItemDelegate <NSObject> -(IBAction)openMainConsole:(id)sender; @end
//
// StatusItemController.m
// MySatusItem
//
// Created by user on 12/3/14.
// Copyright (c) 2014 user. All rights reserved.
// #import "StatusItemController.h" @implementation StatusItemController
-(void)awakeFromNib
{
statusItem = [[NSStatusBar systemStatusBar]statusItemWithLength:NSSquareStatusItemLength];
NSBundle *bundle = [NSBundle mainBundle];
statusImage = [[NSImage alloc]initWithContentsOfFile:[bundle pathForResource:@"icon" ofType:@"tiff"]];
statusHighLightImage = [[NSImage alloc]initWithContentsOfFile:[bundle pathForResource:@"icon@2x" ofType:@"tiff"]]; [statusItem setImage:statusImage];
[statusItem setAlternateImage:statusHighLightImage]; [statusItem setMenu:statuMenu];
[statusItem setToolTip:@"My custom Menu Item"];
[statusItem setHighlightMode:YES]; }
@end

7. 剩下的就是在xib中把StatusItem跟StatusItemController关联起来

8. 最后把StatusMenu上的两个item跟程序里的方法关联起来,open main console就关联到App Delegate中的openMainConsole; quit关联到First Responder中的terminate:。

9. 结束后运行程序。

cocoa应用程序中NSStatusItem的使用的更多相关文章

  1. [深入浅出Cocoa]iOS程序性能优化

    本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...

  2. XCode和Cocoa在开发中使用第三方dylib示例

    XCode和Cocoa在开发中使用第三方dylib示例 www.educity.cn   发布者:yukowang   来源:网络转载   发布日期:2014年06月13日      XCode和Co ...

  3. C# 程序中嵌入百度地图

    本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...

  4. 在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能

    在我上篇随笔<在DevExpress程序中使用Winform分页控件直接录入数据并保存>中介绍了在GridView以及在其封装的分页控件上做数据的直接录入的处理,介绍情况下数据的保存和校验 ...

  5. Android程序中--不能改变的事情

    有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...

  6. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...

  7. 网页或微信小程序中使元素占满整个屏幕高度

    在项目中经常要用到一个容器元素占满屏幕高度和宽度,然后再在这个容器元素里放置其他元素. 宽度很简单就是width:100% 但是高度呢,我们知道的是height:100%必须是在父元素的高度给定了的情 ...

  8. 在DevExpress程序中使用Winform分页控件直接录入数据并保存

    一般情况下,我们都倾向于使用一个组织比较好的独立界面来录入或者展示相关的数据,这样处理比较规范,也方便显示比较复杂的数据.不过在一些情况下,我们也可能需要直接在GridView表格上直接录入或者修改数 ...

  9. 在DevExpress程序中使用内置的图标构建美观的界面元素

    在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...

随机推荐

  1. Eclipse Android 代码自己主动提示功能

    Eclipse Android 代码自己主动提示功能 Eclipse for android 实现代码自己主动提示智能提示功能.介绍 Eclipse for android 编辑器中实现两种主要文件 ...

  2. django用户认证系统——重置密码7

    当用户不小心忘记了密码时,网站需要提供让用户找回账户密码的功能.在示例项目中,我们将发送一封含有重置用户密码链接的邮件到用户注册时的邮箱,用户点击收到的链接就可以重置他的密码,下面是具体做法. 发送邮 ...

  3. JZOJ.3769【NOI2015模拟8.14】A+B

    Description 对于每个数字x,我们总可以把它表示成一些斐波拉切数字之和,比如8 = 5 + 3,  而22 = 21 + 1,因此我们可以写成  x = a1 * Fib1 + a2 * F ...

  4. oracle 实现多字段匹配一个关键字查询语句

    oracle 实现多字段匹配一个关键字查询语句:有两种方法(经测试,10g中不能用,11g才行): 第一种. select * from table where ('字段名1' ||'字段名2' || ...

  5. 巨蟒python全栈开发flask5

    1.轮询&&长轮询&&长连接 2.GeventWebsocket 3.Websocket群聊 4.Websocket单聊 5.websocket握手 6.websock ...

  6. 《挑战程序设计竞赛》2.3 动态规划-基础 POJ3176 2229 2385 3616 3280

    POJ3176 Cow Bowling 题意 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线. 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个 ...

  7. Outlook Top of Information Store

    Actually I got to thinking this might make a good blog post so I took a closer look - Try this: On t ...

  8. mysql数据库转移到oracle的经历

    简单说明一下情况,系统原本是LAMP的.现在要添加对oracle的支持,原来的mysql也同样支持(通过配置选择数据库类型). 第一步,表结构转移到oracle,并掌握转移的方法(方便给有二开的老客户 ...

  9. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器(2)---更方便很多其它操作更像编辑器

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦.他说:随便写,第一别全然照搬代码:第二能够说 ...

  10. 007-组件和Props

    一.概述 组件让你可以将用户界面分成独立的,可重复使用的部分,并且可以独立思考每个部分. 从概念上讲,组件就像JavaScript函数一样.他们接受任意输入(称为“props”)并返回描述屏幕上应显示 ...