入れ子のMovieClipに設定したContextMenuが表示されない [Edit]

Flash MX 2004(Flash Player 7)から、ContextMenuクラスを使って、コンテキスト(ショートカット)メニューをカスタマイズできるようになりました。ContextMenuオブジェクトは、MovieClipインスタンスに対して設定します。ところが、そのMovieClipインスタンスが他のMovieClipに入れ子になっていると、設定したコンテキストメニューが表示されません。

Flash Playerのバグだと考えられます(Flash MX 2004 LiveDocsContextMenu classに対するnwebb[co.uk]のコメント参照)。

ContextMenuインスタンスは、ContextMenuItemクラスでメニュー項目を作成したうえで、MovieClip.menuプロパティに設定します。このターゲットのMovieClipインスタンスが、メインタイムライン(_root)に配置されず、他のMovieClipシンボルの入れ子になっていると、コンテキストメニューが表示されません。

ただし、ターゲットのMovieClipシンボル内にButtonインスタンスを配置すると、そのButtonのヒットエリア上でコンテキストメニューが表示されます。

ご参考までに、テスト用のサンプルスクリプト(001)と、そのスクリプトを設定したサンプルムービー(SWFおよびFLA)を掲げます。

スクリプト001■テスト用サンプルスクリプト
// MovieClip: コンテキストメニューを設定するインスタンス
// 第1フレームアクション
// 結果確認用にTextFieldインスタンス_root.my_txtを配置
// [1]インスタンスの生成
var my_cm:ContextMenu = new ContextMenu();
var my_cmi:ContextMenuItem = new ContextMenuItem("Menu item for "+this, myContextMenuHandler);
// [2]ContextMenuインスタンスの設定
my_cm.hideBuiltInItems();
my_cm.customItems.push(my_cmi);
// [3]コンテキストメニュー表示時のコールバック関数設定
my_cm.onSelect = function(obj:Object, menuItem:ContextMenuItem) {
  _root.my_txt.text += ["select", obj, menuItem]+"¥r";
};
// [4]メニュー項目選択時のコールバック関数設定
function myContextMenuHandler(obj:Object, menu:ContextMenuItem) {
  _root.my_txt.text += ["menu", menu.caption]+"¥r";
}
this.menu = my_cm;

参考: FLASH-japan「ネストされたMC内でコンテキストメニューが動作しない

その他の記事