天天看点

Adobekit教你如何修改FLASH右键菜单

有些东西只有用到了才会去看,才会去寻找答案。这真的挺有道理,毕竟人的精力有限。今天对FLASH右键菜单专门做了下研究,有高手看到觉得不足的地方请指出。

首先来了解ContextMenu的基本常识。

ContextMenu 类提供对 Flash Player 上下文菜单项的运行时控制,当用户在 Flash Player 中右键单击(在 Windows 中)或按住 Control 键并单击(在 Macintosh 中)时,将出现上下文菜单。您可以使用 ContextMenu 类的方法和属性添加自定义菜单项,控制内置上下文菜单项的显示(例如"放大"和"打印"),或者创建菜单的副本。

Flash Player 具有三种类型的上下文菜单:标准菜单(当您在 Flash Player 中右键单击时出现)、编辑菜单(当您在可选择或可编辑的文本字段上右键单击时出现)和错误菜单(当 SWF 文件未能加载到 Flash Player 中时出现)。只有标准菜单和编辑菜单才能使用 ContextMenu 类进行修改。

自定义菜单项始终出现在 Flash Player 上下文菜单的顶部,并位于所有可见内置菜单项之上;内置菜单项和自定义菜单项之间由一个分隔条加以分隔。向上下文菜单添加的自定义菜单项不得超过 15 个。您不能从上下文菜单中删除"设置"菜单项。在 Flash 中,必须有"设置"菜单项,有了这个菜单项后,用户才能访问影响其计算机上的隐私和存储的设置。您也不能从上下文菜单中删除"关于"菜单项,必须在使用这个菜单项后,用户才能了解正在使用的 Flash Player 的版本信息。

必须使用构造函数 new ContextMenu() 创建 ContextMenu 对象才能调用其方法。

一、ContextMenu.builtInItems 属性

public builtInItems : Object

具有以下布尔属性的对象:zoom、quality、play、loop、rewind、forward_back 和 print。将这些变量设置为 false 将删除指定的 ContextMenu 对象中的相应菜单项。这些属性是可枚举的属性,默认情况下设置为 true。

如:对于附加到 SWF 文件的当前时间轴的 ContextMenu 对象 my_cm,内置"品质"和"打印"菜单项被禁用。

var my_cm:ContextMenu = new ContextMenu ();

my_cm.builtInItems.quality=false;

my_cm.builtInItems.print=false;

this.menu = my_cm;

二、ContextMenu 构造函数

public ContextMenu([callbackFunction:Function])

callbackFunction:Function [可选] - 对函数的引用,该函数在用户右键单击或按住 Control 键单击菜单并在菜单显示之前被调用。

如:隐藏上下文菜单中的所有内置对象。(但是,由于不能禁用"设置"和"关于"菜单项,所以它们仍会出现。)

var newMenu:ContextMenu = new ContextMenu();

newMenu.hideBuiltInItems();

this.menu = newMenu;

三、copy(ContextMenu.copy 方法)

public copy() : ContextMenu

创建指定的 ContextMenu 对象的副本。该副本继承初始菜单对象的所有属性。

如:创建名为 my_cm 的 ContextMenu 对象的副本(其内置菜单项被隐藏),并添加具有文本"Save..."的菜单项。然后,该示例创建 my_cm 的副本,并将它分配给变量 clone_cm,该变量继承原始菜单的所有属性。

var my_cm:ContextMenu = new ContextMenu();

my_cm.hideBuiltInItems();

var menuItem_cmi:ContextMenuItem = new ContextMenuItem("Save...", saveHandler);

my_cm.customItems.push(menuItem_cmi);

function saveHandler(obj, menuItem) {

    // saveDocument();

    // custom function (not shown)

    trace("something");

}

clone_cm = my_cm.copy();

this.menu = my_cm;

for (var j in clone_cm.customItems) {

    trace("clone_cm-> "+clone_cm.customItems[j].caption);

}

for (var j in my_cm.customItems) {

    trace("my_cm-> "+my_cm.customItems[j].caption);

}

四、customItems(ContextMenu.customItems 属性)

public customItems : Array

ContextMenuItem 对象的数组。数组中的每个对象表示您已经定义的上下文菜单项。使用此属性可添加、删除或修改这些自定义菜单项。若要添加新的菜单项,请首先创建一个新的 ContextMenuItem 对象,然后将其添加到 menu_mc .customItems 数组(例如使用 Array.push())。

如:创建一个新的名为 menuItem_cmi 的自定义菜单项(其标题为"发送电子邮件")和一个名为 emailHandler 的回调处理函数。然后,使用 customItems 数组将新的菜单项添加到 ContextMenu 对象 my_cm。最后,将新菜单附加到名为 email_mc 的影片剪辑。若要使此示例正常运行,请在舞台上创建影片剪辑实例,然后使用属性检查器将该实例命名为 email_mc。在"测试影片"模式中,如果在鼠标指针位于 email_mc 影片剪辑上方时弹出上下文菜单,将出现新的上下文菜单项。

var my_cm:ContextMenu = new ContextMenu();

var menuItem_cmi:ContextMenuItem = new ContextMenuItem("Send e-mail", emailHandler);

my_cm.customItems.push(menuItem_cmi);

email_mc.menu = my_cm;

function emailHandler() {

    trace("sending email");

}

五、hideBuiltInItems(ContextMenu.hideBuiltInItems 方法)

public hideBuiltInItems() : Void

隐藏指定的 ContextMenu 对象中的所有内置菜单项("设置"除外)。如果 Flash 调试播放器正在运行,则显示"调试"菜单项,但如果 SWF 文件未启用远程调试功能,则该菜单项将变暗。

如:创建其内置菜单项已隐藏("打印"除外)的新的 ContextMenu 对象 my_cm。然后将该菜单对象附加到当前时间轴。

var my_cm:ContextMenu = new ContextMenu();

my_cm.hideBuiltInItems();

my_cm.builtInItems.print = true;

this.menu = my_cm;

六、onSelect(ContextMenu.onSelect 处理函数)

onSelect = function(item:Object, item_menu:Object) {}

在用户调用 Flash Player 上下文菜单并在该菜单实际显示之前调用。此事件处理函数允许根据当前应用程序状态自定义上下文菜单的内容。

如:确定对哪种类型的对象调用了上下文菜单。

my_cm:ContextMenu = new ContextMenu();

function menuHandler(obj:Object, menu:ContextMenu) {

    if(obj instanceof MovieClip) {

        trace("Movie clip: " + obj);

    }

    if(obj instanceof TextField) {

        trace("Text field: " + obj);

    }

    if(obj instanceof Button) {

        trace("Button: " + obj);

    }

}

my_cm.onSelect = menuHandler;

my_mc.menu = my_cm;

my_btn.menu = my_cm;

待续......

继续阅读