AS3自定义contextMenu给孩子

时间:2012-03-12 14:53:21

标签: actionscript-3 contextmenu

我使用AS3创建了一个自定义contextMenu,可以将其应用到舞台上。我放在舞台上的任何影片剪辑都不会从舞台继承contextMenu,即它们会显示默认的contextMenu。

如何将自定义contextMenu应用于我的应用程序中的每个子项?

[编辑]

这是我在main.as文件中的简化版本:

var my_menu:ContextMenu = new ContextMenu();
my_menu.hideBuiltInItems();

var my_copyright = new ContextMenuItem("Copyright - 2012");
my_copyright.enabled = false;
my_copyright.separatorBefore = true;

my_menu.customItems.push(my_copyright);

stage.contextMenu = my_menu;

如果我右键点击舞台,那么我就会获得版权。如果我向舞台添加一个movieclip(或其他任何东西),然后右键单击它,然后我得到默认的上下文菜单。

[编辑]

我找到了问题并修复了它。我正在使用stage.addChildAt(mc,0);添加背景图像。由于某种原因,这将删除上下文菜单。将子项置于1会修复此问题并允许所有内容继承contextMenu。

之前:http://richard.parnaby-king.co.uk/examples/stackoverflow/stackoverflow.swf

之后:http://richard.parnaby-king.co.uk/examples/stackoverflow/stackoverflow-after.swf

我正在改变赏金的目的 - 有人可以解释为什么会发生这种情况!?

3 个答案:

答案 0 :(得分:1)

你的原因在于你为舞台添加了什么?他们的订单。

我可以引用与adobe live docs相关的2分:


  

索引0表示显示列表的后面(底部)   这个DisplayObjectContainer对象。


  

如果指定当前占用的索引位置,则为子对象   存在于该位置,所有较高位置向上移动一个   在儿童名单中的位置。


我认为如果你正确地分析了添加到舞台上的所有东西,你自己可能会得到答案。

答案 1 :(得分:1)

好的,经过一些测试后,这就是我所拥有的。我不能说这是明确的,因为闪存没有给出右键点击的事件,所以这只是一个猜测,但它似乎坚持。

在旁注中,您无法向舞台添加上下文菜单,它不会允许它,因此您可以将其添加到的最低项是文档类

右键单击DisplayObject时,它将在该对象上查找ContextMenu。它没有找到它,它将继续在该对象的层次结构中寻找一个,在找到它时停止。像这样:

stage
    - document (has context menu1)
        - parent (has context menu2)
            - child
        - parent2

在此示例中,如果右键单击child,则没有菜单,因此它会显示parent。在这里它找到context menu2所以它显示了这一点。但是,如果您右键单击parent2,则没有菜单,因此它会显示document,并在此处找到context menu1

当你右键点击舞台上的其他地方(即没有图形的地方)时,似乎有点黑客攻击。在这种情况下,由于舞台不能有ContextMenu(或者至少你不能设置一个),它似乎决定使用深度为0的子项的上下文菜单(通常是文档类)

当您在深度0处添加背景图像时,您将文档类提升到深度1.您的层次结构现在看起来像这样:

stage
    - bg
    - document (has context menu1)
        - parent (has context menu2)
            - child
        - parent2

我假设您要将上下文菜单添加到文档类(在此示例中为context menu1),因此除非您的文档类中包含某些图形,否则您的事件将搜索到该阶段,找到没有上下文菜单,然后尝试查找子0的上下文菜单 - 在这种情况下bg没有。

您可以通过在文档类的graphics对象中绘制内容(或单击其中一个嵌套元素)来测试它。如果您右键单击图形,即使bg位于深度0,您也会看到自定义菜单。或者,您可以向bg添加另一个菜单以查看我的意思。

答案 2 :(得分:0)

尝试将stage.contextMenu = my_menu;更改为contextMenu = my_menu;