티스토리 뷰

플래시에서 오른쪽 버튼 누르게 되면 플래시의 고정된 컨텍스트 메뉴가 뜨는데, ContextMenu 객체를 이용해 이 항목들을 변경 할 수 있습니다.
참고로, ContextMenu 클래스는 final 로 선언되어 있어 더 이상 확장할 수 없습니다.

여기 예제는 사각형에 2개의 메뉴를 추가하여 컨텍스트 메뉴를 변경한 간단한 코드 입니다.
아래 코드가 바로 sprite 객체와, 메뉴 항목을 컨텍스트 클래스로 넘겨주어 생성하는 부분입니다.

new CustomContextMenu(sprite, menuItems);



CustomContextMenu 클래스를 보면 어떻게 등록하고 변경하는지 알 수 있습니다. Adobe ActionScript3.0 Language Reference 에서 ContextMenu 클래스의 예제를 간략하게 사용자가 정하는 메뉴항목을 등록할 수 있게 수정해 놓은 클래스입니다.
자신의 입맛에 맞게 변경해서 사용하세요. :)

// ./CustomContextMenu.fla
import Lib.ui.CustomContextMenu;

var sprite:Sprite = new Sprite();
sprite.graphics.beginFill(0x000000FF);
sprite.graphics.drawRect(0, 0, 100, 100);
sprite.graphics.endFill();
sprite.name = "mcTestSprite";
sprite.x = (stage.stageWidth - 100) / 2;
sprite.y = (stage.stageHeight - 100) / 2;
addChild(sprite);

// 컨텍스트 메뉴 목록
var menuItems:Array = [
    { label: "객체 이름", handler: getName },
    { label: "객체 삭제", handler: doDelete }
];

// new CustomContextMenu( 추가할객체 , 추가할메뉴목록 );
var context:Sprite = new CustomContextMenu(sprite, menuItems);

// 메뉴 핸들러 함수
// 객체 이름
function getName(evt:ContextMenuEvent):void
{
    trace("getName() : "+ evt);
    trace("객체 이름 : "+ evt.mouseTarget.name);
}

// 객체 삭제
function doDelete(evt:ContextMenuEvent):void
{
    trace("doDelete() : "+ evt);
    removeChild(evt.mouseTarget);
}
// ./Lib/ui/CustomContextMenu.as
package Lib.ui
{
    // {{{ Libraries

    import flash.ui.ContextMenu;
    import flash.ui.ContextMenuItem;
    import flash.ui.ContextMenuBuiltInItems;

    import flash.events.ContextMenuEvent;

    import flash.display.Sprite;
    
    // }}}
    // {{{ Class

    public class CustomContextMenu extends Sprite
    {
        // {{{ Properties

        // 컨텍스트 메뉴 대상
        private var _contextTarget:Object = null;

        // 컨텍스트 메뉴
        private var _contextMenu:ContextMenu;

        // 메뉴 아이템
        private var _contextMenuItems:Array;
        
        // }}}
        // {{{ Methods

        /**
         * public constructor
         *
         * CustomContextMenu
         *
         * @param    (Object)        target                    컨텍스트 메뉴를 적용할 대상
         * @param    (Array)         menuItems        (optional) 메뉴 항목들
         * @return   (void)
         */
        public function CustomContextMenu(target:Object, menuItems:Array = null)
        {
            if (target.hasOwnProperty("contextMenu") === false) {
                throw new Error("컨텍스트 메뉴를 적용할 수 없는 객체 입니다.");
            }

            this._contextTarget = target;
            this._contextMenu = new ContextMenu();
            this.removeDefaultItems();

            if (menuItems !== null) {
                this.contextMenuItem = menuItems;
                this.addContextMenu();
            }

            this._contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, this.menuSelectHandler);
            this._contextTarget.contextMenu = this._contextMenu;
        }

        /**
         * private
         *
         * removeDefaultItems : 기본 컨텍스트 메뉴 항목들을 삭제
         *
         * @return   (void)
         */
        private function removeDefaultItems():void
        {
            this._contextMenu.hideBuiltInItems();
            var defaultItems:ContextMenuBuiltInItems = this._contextMenu.builtInItems;
                defaultItems.print = true;// 기본 컨텍스트 메뉴 중에서 "인쇄" 항목은 삭제하지 않으려면
        }

        /**
         * private
         *
         * addContextMenu : 컨텍스트 메뉴에 메뉴 추가
         *  입력된 컨텍스트 메뉴를 반복하며 메뉴 항목 추가
         *
         * @return   (void)
         */
        private function addContextMenu():void
        {
            var menus:Array = this.contextMenuItem;
            for (var n:int = 0, c:int = menus.length; n < c; n++) {
                this._addContextMenuItem(menus[n]);
            }
        }

        /**
         * private
         *
         * _addContextMenuItem : 컨텍스트 메뉴에 메뉴 항목 한개 추가
         *  인자값은 객체로 아래 형식으로 넘겨줌
         *   { label: 메뉴명, handler: 처리함수 }
         *
         * @param    (Object)        menuItem                    메뉴 아이템
         * @return   (void)
         */
        private function _addContextMenuItem(menuItem:Object):void
        {
            var item:ContextMenuItem = new ContextMenuItem(menuItem["label"]);
            this._contextMenu.customItems.push(item);
            item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItem["handler"]);
        }

        /**
         * private
         *
         * menuSelectHandler : 컨텍스트 이벤트가 발생했을때 콜백 함수
         *
         * @param    (ContextMenuEvent)    evt                        이벤트
         * @return   (void)
         */
        private function menuSelectHandler(evt:ContextMenuEvent):void
        {
        }

        // }}}
        // {{{ Getter / Setter

        // 입력된 컨텍스트 메뉴 정보를 저장
        public function set contextMenuItem(menuItems:Array):void
        {
            this._contextMenuItems = menuItems;
        }

        // 컨텍스트 메뉴 정보를 반환
        public function get contextMenuItem():Array
        {
            return this._contextMenuItems;
        }
    }
}


참고사이트
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함