3

我正在尝试解决一个问题,当我使用 AS3 和 flash 通过右键单击打开 ContextMenu 时,我需要获取单击的位置。

我试过使用 MouseEvent.Context_Menu:

mapSprite.addEventListener(MouseEvent.CONTEXT_MENU, OnContextMenuOpening);

这确实会在右键单击时触发,但上下文菜单不再打开。

我也尝试过使用 MosueEvent.Right_Click:

mapSprite.addEventListener(MouseEvent.RIGHT_CLICK, OnContextMenuOpening);

这会在右键单击时触发,但会阻止上下文菜单打开。

有人对这个问题有任何见解吗?

4

3 回答 3

2

不是我认为理想的,但这会让你完全明白。创建一个新的菜单对象(具有所有内置菜单选项),并为其添加一个事件侦听器。

var my_menu:ContextMenu = new ContextMenu();
contextMenu = my_menu;
my_menu.addEventListener(ContextMenuEvent.MENU_SELECT, rightClicker)

function rightClicker(e:ContextMenuEvent):void {
    trace(e);
}
于 2013-08-02T13:59:38.697 回答
1

Atriace 的回答基本上是正确的,但它并没有完全直接地解决实际问题,让我立即意识到这一点。这是他的解决方案的一个小扩展:

private function setupSample():void
{
     // NOTE: Sample assumes that I have a TextField named _myTextField defined elsewhere.
     _myTextField.contextMenu = new ContextMenu();
     _myTextField.contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, hContextMenuSelect);
}

private function hContextMenuSelect(pEvent:ContextMenuEvent):void
{
      var x:Number = pEvent.mouseTarget.mouseX;
      var y:Number = pEvent.mouseTarget.mouseY;
}

使用这种方法,实际上会显示上下文菜单,但您也可以访问鼠标单击的坐标。只需将 ContextMenuEvent.MENU_SELECT 侦听器直接添加到上下文菜单并从侦听器参数中提取点。请注意,鼠标位置可通过 ContextMenuEvent 获得。

于 2013-09-09T19:48:52.820 回答
0

以下代码正在工作。我创建了一个 300x300 的形状并在其上分配了上下文菜单。鼠标位置将显示在左上角的文本框中。

package {
import flash.ui.ContextMenuItem;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextFormat;
import flash.display.Sprite;
import flash.text.TextField;
import flash.ui.ContextMenu;
import flash.display.Shape;

/**
 * ...
 * @author GR
 */
public class Main extends Sprite {
    private var cm_item1:ContextMenuItem = new ContextMenuItem("Menu Item 1");
    private var cm_item2:ContextMenuItem = new ContextMenuItem("Menu Item 2");
    private var cm_item3:ContextMenuItem = new ContextMenuItem("Menu Item 3");
    private var cm_item4:ContextMenuItem = new ContextMenuItem("Menu Item 4");
    private var txtFormat:TextFormat = new TextFormat("Arial", 20, 0x000000);
    private var c_menu:ContextMenu = new ContextMenu();
    private var map_mc:MovieClip = new MovieClip();
    private var txt:TextField = new TextField();
    private var bg:Shape = new Shape();

    public function Main():void {
        bg.graphics.beginFill(0x00ffff);
        bg.graphics.drawRect(0, 0, 300, 300);
        bg.graphics.endFill();
        map_mc.addChild(bg);
        map_mc.x = map_mc.y = 100;
        addChild(map_mc);

        txt.background = 0xffffff;
        txt.border = true;
        txt.defaultTextFormat = txtFormat;
        txt.width = 200;
        addChild(txt);

        c_menu.hideBuiltInItems();
        c_menu.customItems.push(cm_item1, cm_item2, cm_item3, cm_item4);
        map_mc.contextMenu = c_menu;

        map_mc.addEventListener(MouseEvent.CONTEXT_MENU, cmFx);
    }

    private function cmFx(e:MouseEvent):void {
        txt.text = "x: " + mouseX + " y: " + mouseY; 
    }

}

}

于 2013-08-02T14:03:55.107 回答