天天看點

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;

待續......

繼續閱讀