×
文章路径: Flex

AIR窗口菜单工具类(增加助记键的支持)

发表于3年前(Dec 24, 2014 9:01:10 AM)  阅读 429  评论 0

分类: Flex

标签: 助记键 菜单工具

之前做扫雷游戏时,写过一个菜单工具类,参见扫雷(一):窗口菜单的制作 ,那个菜单工具类,可以支持多层级,支持快捷键,支持分隔符,但是不支持助记键,助记键是一般应用程序窗口菜单,使用ALT+F可以快速展开文件菜单项,这可以说是一个基本功能,AIR窗体也是支持的,所以我完善了一下菜单工具类,废话少说,直接贴源码。

package com.cangzhitao.flex.util
{
	import flash.display.NativeMenu;
	import flash.display.NativeMenuItem;
	import flash.events.Event;
	import flash.utils.Dictionary;
	/**
	 * 修改菜单xml文件label命令错误,增加助记键ALT+
	 * update 2011-9-29
	 *
	 * 修改了包目录,对selectFunction属性值进行了判断,如果为空字符串,则不做监听
	 * update 2011-4-9
	 *
	 * 窗口菜单工具类,支持子菜单,支持定义快捷键,支持回调函数设置。
	 * 菜单xml内容格式如下。data属性暂未使用,keyEquivalent为快捷键,selectFunction为函数名,函数名为完全限定名,函数必须是public的
	 * private var menuXML:XML = <root>
				<menu label="文件(F)" data="file" mnemonicIndex="3">
					<item label="新建(N)" data="new" keyEquivalent="n" mnemonicIndex="3" selectFunction="" />
					<item label="打开(O)" data="open" keyEquivalent="o" mnemonicIndex="3" selectFunction="" />
					<item label="保存(S)" data="save" keyEquivalent="s" mnemonicIndex="3" selectFunction="" />
					<item label="另存为(A)" data="save_as" keyEquivalent="S" mnemonicIndex="4" selectFunction="" />
					<item lable="separator"/>
					<item label="退出(X)" data="exit" keyEquivalent="x" mnemonicIndex="3" selectFunction="main.exitApp" />
				</menu>
				<menu label="帮助(H)" data="help" mnemonicIndex="3">
					<item label="关于" data="about" keyEquivalent="h" selectFunction="" />
				</menu>
			</root>
	 * cangzhitao 2011-1-15
	 * www15119258@qq.com
	 * http://cangzhitao.com
	 */
	public class MenuUtil
	{

		public function MenuUtil()
		{
		}

		//创建顶级菜单
		public static function createRootMenu(menuXML:XML):NativeMenu {
			var rootMenu:NativeMenu = new NativeMenu();
			for each(var xml:XML in menuXML["menu"]) {
				var temp:NativeMenuItem = new NativeMenuItem(xml.@label);
				if(xml.hasOwnProperty("@mnemonicIndex")) {
					temp.mnemonicIndex = xml.@mnemonicIndex;
				}
				rootMenu.addItem(temp);
				temp.submenu = createMenu(xml);
			}
			return rootMenu;
		}

		public static var classes:Dictionary = new Dictionary();;

		//创建子菜单
		private static function createMenu(menuXML:XML):NativeMenu {
			var subMenu:NativeMenu = new NativeMenu();
			for each(var xml:XML in menuXML["item"]) {
				var temp:NativeMenuItem;
				if(xml.@lable=="separator") {
					temp = subMenu.addItem(new NativeMenuItem("", true));
				} else {
					temp = subMenu.addItem(new NativeMenuItem(xml.@label));
				}
				//添加快捷键
				if(xml.hasOwnProperty("@keyEquivalent")) {
					temp.keyEquivalent = xml.@keyEquivalent;
				}
				if(xml.hasOwnProperty("@mnemonicIndex")) {
					temp.mnemonicIndex = xml.@mnemonicIndex;
				}
				if(xml.hasOwnProperty("@data")) {
					temp.data = xml.@data;
				}
				//添加回调函数
				if(xml.hasOwnProperty("@selectFunction")&&xml.@selectFunction!="") {
					var functionArray:Array = String(xml.@selectFunction).split(".");
//					var objectClass:Class = getDefinitionByName(functionArray[0]) as Class;
//					var object:Object = new objectClass();
					//必须把所调函数所在的类添加进classes字典里
					var object:Object = classes[functionArray[0]];
					temp.addEventListener(Event.SELECT, object[functionArray[1]]);
				}
				//迭代添加子菜单
				if(XMLList(xml["item"]).length()>0) {
					temp.submenu = 	createMenu(xml);
				}
			}
			return subMenu;
		}
	}
}

在应用窗口初始化时添加下面代码建立菜单
//添加菜单回调函数里面的源对象
MenuUtil.classes[“main”] = this;
//建立菜单项
nativeWindow.menu = MenuUtil.createRootMenu(menuXML); 

其中main为窗口的名称,包括窗口所在文件夹路径, 如窗口路径为src/com/cangzhitao/main.mxml,这里mian就必须替换成com.cangzhitao.main,menuXML为菜单xml文件,可以参考工具类里面的示例。

运行界面如图:

发表评论