23.4.创建本地菜单

23.4.1.问题
我想提供一个本地菜单供用户执行特殊的命令。
23.4.2.解决办法
使用本地的菜单API 创建程序和窗体菜单。
23.4.3.讨论
本地菜单API类提供了操作系统本地菜单的相关特性。你可以添加菜单项以及监听菜单项选择事件。有好几种本地菜单类型,如何创建和交互这取决于你的AIR程序所运行的操作系统,因此你添加菜单时要确认是否支持所有目标操作系统。

Mac OS X操作系统支持应用程序菜单。应用程序菜单是个全局菜单,可被程序工具栏所访问,且不依赖于当前获得焦点的本地窗口。应用程序菜单是MAC OS X操作系统自动创建的,你可以往上面添加菜单项或子菜单以及事件处理器,成为标准菜单。

Windows操作系统支持的本地菜单本认为是窗体菜单。Window菜单显示在本地窗体对象上,刚好在标题栏下面,且只支持具有系统边框的本地窗体,因此当<mx:Window>实例的systemChrome属性被设为none时Window菜单是不能被添加进去的。

要检测AIR 程序运行在什么操作系统上, 你可以使用NativeWindow.supportsMenu 和
+展开
-ActionScript
NativeApplication.supportsMenu属性:
if( NativeWindow.supportsMenu )
{
// Windows
}
else if( NativeApplication.supportsMenu )
{
// Mac OS X
}

如果NativeWindow.supportsMenu属性值为true,运行在Windows操作系统下的程序具有本地窗口菜单。flash.desktop.NativeApplication类提供程序级信息和函数,其中有个静态的supportsMenu属性。如果NativeApplication对象支持程序级菜单,则说明当前运行在Mac OS X环境中。

要添加本地菜单对象作为根菜单,可先实例化NativeMenu,并赋值给NativeWindow或NativeApplication实例的menu属性:
+展开
-ActionScript
if( NativeWindow.supportsMenu )
{
stage.nativeWindow.menu = new NativeMenu();
}
else if( NativeApplication.supportsMenu )
{
NativeApplication.nativeApplication.menu = new NativeMenu();
}

设置好根菜单后,接着就可以添加菜单或子菜单到NativeMenu对象上了。下面的例子在<mx:WindowedApplication>上创建一个应用程序菜单或窗体菜单,这取决在什么操作系统上:
+展开
-XML
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="verticalwindowComplete="initHandler();">

<mx:Script>
<![CDATA[
private function initHandler():void {
var fItem:NativeMenuItem = new NativeMenuItem( "File");
var fileMenu:NativeMenuItem;
if( NativeWindow.supportsMenu ){
stage.nativeWindow.menu = new NativeMenu();
fileMenu = stage.nativeWindow.menu.addItem( fItem);
}
else if( NativeApplication.supportsMenu ){
NativeApplication.nativeApplication.menu = new NativeMenu();
fileMenu = NativeApplication.nativeApplication.menu.addItem( fItem );
}
fileMenu.submenu = createFileMenu();
}
private function createFileMenu():NativeMenu {
var menu:NativeMenu = new NativeMenu();
var openItem:NativeMenuItem = new NativeMenuItem( "Open");
var openCmd:NativeMenuItem = menu.addItem( openItem);
openCmd.addEventListener( Event.SELECT, openHandler);
var saveItem:NativeMenuItem =new NativeMenuItem( "Save");
var saveCmd:NativeMenuItem = menu.addItem( saveItem);
saveCmd.addEventListener( Event.SELECT, saveHandler);
return menu;
}
private function openHandler( evt:Event ):void {
printOut.text += "You selected open.\n";
}
private function saveHandler( evt:Event ):void{
printOut.text += "You selected save.\n";
}

]]>
</mx:Script>
<mx:TextArea id="printOutwidth="100%height="100%" />
</mx:WindowedApplication>

当应用程序被创建,布局初始化完成后,initHandler方法被调用,新的File菜单被添加到WindowedApplication 或NativeApplication 实例的menu 属性上, 这取决于你的操作系统(Windows 或Mac OS X)。通过createFileMenu方法子菜单被添加到File菜单中,事件监听器被添加用于响应每个目录项的select事件。

当应用程序运行在Windows操作系统时,主应用程序窗口将在标题栏下面显示File菜单。当运行在Mac OS X 操作系统时,File菜单将会显示在应用程序工具栏上。选择File菜单后会打开拥有子菜单选项的上下文菜单。点击任何菜单项会调用注册了的事件监听器并在<mx:TextArea>对象上打印出文本。

NativeMenuItem类还提供分割线支持,构造器默认的isSeperator参数值为false,如果设为true则会显示一条水平线:
+展开
-ActionScript
var rule:NativeMenuItem = new NativeMenuItem( "Line"true );

你还可以在运行期间通过NativeMenuItem类的enabled属性启动和禁止菜单项:
+展开
-ActionScript
var saveItem:NativeMenuItem = new NativeMenuItem( "Save" );
saveItem.enabled = false;

通过在运行期间启动和禁止菜单,可以设定哪些菜单命令可用,这依赖于你的程序需求。

本地菜单的概念不仅仅局限于应用程序菜单和窗体菜单,还有如上下文菜单----鼠标右键打开,或者是窗口中命令打开的菜单以及系统托盘打开的菜单都可以认为是本地菜单,实际上flash.ui.ContextMenu和flash.ui.ContextMenuItem类都是继承自AIR native menu API.

加支付宝好友偷能量挖...


评论(0)网络
阅读(94)喜欢(0)flash/flex/fcs/AIR