SmartInvoke屏蔽了Flash中的系统内置右键,添加了系统本地右键菜单功能。只需几段代码就可以创建出本地右键菜单。右键菜单主要用到以下四个类:
cn.smartinvoke.gui.control.CAction;
菜单项信息类,封装了菜单项的id,菜单项的显示文字,菜单项的图标,菜单项类型等信息。
cn.smartinvoke.gui.control.CNativeMenuBuilder
本地菜单类,该对象表示一个菜单。他由菜单项CAction与CMenuRelation组成。
cn.smartinvoke.gui.module.CActionEvent;
菜单的点击事件类,单用户点击了某个菜单项后,smartinvoke就会派发这个事件。
cn.smartinvoke.gui.CContextMenuManager
菜单管理器,用户不能单独创建该类,该类是SIApplication对象的成员,管理着当前窗口总的所有菜单对象。每个菜单都要与某个显示控件相关联,不可能独立存在,所以菜单管理器在这里还维护这菜单与显示控件的关联关系。
cn.smartinvoke.gui.module.CMenuRelation;
菜单项组织者,该对象将多个菜单项组织成一个菜单。然后通过CContextMenuManager与指定控件关联。
下面我们就来简单的实现一个本地菜单。在First_项目的FirstWin.mxml的init方法中增加如下内容:
//菜单的实现 //构造三个菜单项 var act1:CAction=new CAction("action1","菜单一");//action1为第一个菜单项的id var act2:CAction=new CAction("action2","第二个菜单"); var act3:CAction=new CAction("about","关于smartinvoke"); //构造菜单对象 var menu:CNativeMenuBuilder=new CNativeMenuBuilder(this.shell); //将菜单项数组传递给菜单对象 menu.initAction([act1,act2,act3]); //组织菜单项之间的关系 var subRel:CMenuRelation=new CMenuRelation(); subRel.actions=[act2.actionId]; subRel.label="子菜单"; var rel:CMenuRelation=new CMenuRelation(); rel.actions=[act1.actionId,subRel,"-",act3.actionId]; menu.initMenu(rel); //添加事件监听器 menu.addListener(function (evt:CActionEvent):void{ this.labelInfo.text="您点击了菜单"+evt.actionId+" 菜单路径:"+evt.path; },this); //将当前创建的菜单,关联到当前SIApplication应用程序对象上, //当然你可以关联到任何InteractiveObject类型对象上 this.contextMenuManager.addNativeMenu(this,menu);
当然我们也可以通过调用CNativeMenuBuilder类的addAction与addMenuItem两个方法动态的添加一菜单项到菜单对象中。
addAction(cAction:CAction):void 作用为添加一菜单项实体对象。
addMenuItem(actionId:String, path:String):void 将菜单项添加到菜单path所指定的显示位置上,这里的path由CMenuRelation对象的label属性加反斜杠/组成。比如在下图所示的菜单中:
菜单项全屏的path为空字符串,菜单项:简体中文(GB18030)的path为:字符编码(C),菜单项:东亚 的path为:字符编码(C)/自动检测(A)
也可以调用CNativeMenuBuilder类的removeMenuItem(actionId:String, path:String):void方法删除指定位置上的菜单项。
当然CNativeMenuBuilder类还有设置菜单项状态,菜单项显示文字等方法,请参考中文API。
注意:
在Java项目部分将eclipse安装目录下的org.eclipse.core.commands这个jar添加进编译路径上去,不然右键菜单会出错。这是开发工具的一个小bug
1 楼 jzzwy 2012-01-01 23:06