AIR/메뉴2008. 12. 9. 14:48

메뉴를 만들 때는 항상 NativeMenu()라는 클래스를 사용하는데 NativeMenu를 이용하여 크롬메뉴나 우클릭 메뉴를 만들어 보았다. NativeMenu()는 OS에서 제공하는 기본적인 레이아웃의 메뉴 형태이며 가끔 좌클릭시 contextMenu처럼 시스템 메뉴를 팝업시키고자 할 때 display라는 속성을 사용한다.

NativeMenu.display( 메뉴를 표시할 윈도우 객체의 스테이지  , X좌표 , Y좌표 );
마우스 이벤트나 기타 사용자 이벤트가 발생할 때 위처럼 display()를 호출하면 시스템 메뉴가 팝업된다.
Posted by 버터백통
AIR/메뉴2008. 12. 9. 14:38

시스템 메뉴를 사용하다 보면 좌클릭 이벤트 뿐만 아니라 휠이나 우클릭 등 여러가지 사용자 이벤트를 사용하여야 하는 경우가 필요하다. 이처럼 좌클릭에 다른 이벤트가 걸려있고 다른 기능을 우클릭에서 활용하고자 할때는 AIR에서 제공하는 contextMenu를 사용한다. 일반적인 AS기반의 우클릭 메뉴에는 "player버전"과 "인쇄" 등 원치 않는 내용이 포함되어 있지만 AIR의 contextMenu는 그러한 메뉴항목이 없고 개발시에 제공하는 순수한 메뉴 항목만 제공한다.

요전에 일반 시스템(크롬)메뉴를 NativeMenu()와 NativeMenuItem()를 활용하여 만들어 보았는데 마찬가지로 우클릭 메뉴도 위의 두개의 클래스들을 가지고 만들어 준다. 그러나 contextMenu는 만든 delegator를 NativeApplication.nativeApplication.menu속성에 대입하는것이 아니고 우클릭 영역의 디스플레이 객체에 contextMenu라는 속성에 대입한다.

var rec:Sprite = new Sprite();
rec.graphics.lineStyle( 0 , 0 , 1 );
rec.graphics.beginFill( 0 , 1 );
rec.graphics.drawRect( 0 , 0 , 100 , 100 );
rec.graphics.endFill();
    
var ui:UIComponent = new UIComponent();
addChild( ui );
ui.addChild( rec );
    
var menu:NativeMenu = new NativeMenu();
var item:NativeMenuItem = new NativeMenuItem("copy");
menu.addItem( item );
rec.contextMenu  = menu;  

 

위 그림은 rec의 영역에 우클릭하여 copy라는 item을 보여주고 있다.

Posted by 버터백통
AIR/메뉴2008. 11. 30. 18:59

윈도우 시스템에 보면 우측 하단에 시계와 여러가지 어플리케이션 아이콘들이 모여있다.
이곳이 System Tray영역인데 우리가 만든 AIR어플리케이션의 아이콘을 만들어 등록하고 우클릭시 메뉴를 열어 실행하고자 한다면 SystemTrayIcon(윈도우)를 사용한다. 같은 방법으로 맥킨토시에서 사용하기 위해서는 DockIcon(맥킨토시)를 사용한다. 일반적으로 AIR개발시 이둘을 모두 적용하여 개발을 한다. 어플리케이션이 어느 OS에서도 비교적 정상적으로 작동하기 위한 크로스 플랫폼을 적극 활용하여야 하기 때문이다.

메뉴의 등록은 앞서 살펴본 바와 같이 NativeMenu()와 NativeMenuItem()를 사용하여 구성하는데 문제는 아이콘에 등록하는 방법이다. 
첫째로 dock아이콘이나 system tray아이콘에 우리가 만든 아이콘을 등록하기 위해서는NativeApplication.nativeApplication.icon.bitmaps에 사용하고자 하는 아이콘비트맵을 배열로 대입한다. 여기까지 완성하여 실행하면 아래 그림처럼 아이콘을 볼 수 있다.

둘재로 메뉴를 등록해야하는데 현재까지 NativeApplication.nativeApplication.icon에는 menu라는 속성이 없다. 따라서 이부분을 windowIcon:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon 으로 as캐스팅한 다음 windowIcon.menu = NativeMenu를 대입한다.

맥킨토시의 Dock아이콘도 같은 방법으로 대입한다.
macIcon:DockIcon = NativeApplication.nativeApplication.icon as DockIcon으로 as 캐스팅한 다음 delegator에 메뉴를 대입한다.
macIcon.menu = menu
이렇게 등록하면 우클릭 메뉴를 설정할 수 있다.

Posted by 버터백통
AIR/메뉴2008. 11. 30. 18:01

일반적으로 사용하는 이벤트는 대체로 적용이 되지 않는다. 따라서 윈도우 메뉴에 롤오버나 롤아웃 ,클릭.. 등의 이벤트를 사용하기는 까다롭다. AIR에서 새로 제공하는 윈도우 메뉴를 사용하기 위해서는 Event.SELECT를 사용하여 메뉴아이템에 등록하여야 한다.
Posted by 버터백통
AIR/메뉴2008. 11. 30. 17:44

AIR에서 메뉴를 생성하려면 크게 2가지의 클래스가 필요하다.
NativeMenu() 클래스는 메뉴 줄기를 담는 그릇 정도라고 생각하면 좋을 것 같다. 이 자체를 메뉴로 사용한다기 보다는 NativeMenuItem()라는 클래스에 메뉴 이름이나 이벤트 등을 설정하여
NativeMenu 클래스에 addItem()하게 된다.

보통 NativeMenu는 크롬창 밑에 바로 붙는 시스템 메뉴로 사용이 되고,
NativeMenuItem는 메뉴의 이름 등 한 개 항목을 설정하는데 NativeMenuItem() 여러개를 한 개의 NativeMenu() 에 설정하면 아래 그림처럼 풀다운 메뉴로 사용된다.


참고) 그림에서 메인메뉴항목은 담는그릇인 NativeMenu와 라벨명이 "메인메뉴항목"이라고 설정된 NativeMenuItem으로 구성

또한 그림처럼 메뉴명 아래 구분 되어진 선을 추가 하고 싶을 때는 NativeMenuItem("",구분선 여부=true)라는 클래스를 생성하여 사용하는 NativeMenu()에 addItem()하면 된다. NativeMenuItem는 메뉴로서도 이용되지만 이처럼 구분선으로도 활용된다.

이들을 생성하여 윈도우의 메뉴로 설정하기 위해서는 몇가지 주의할 필요가 있다.
윈도우에서 사용할 수 있는 메뉴는 1개뿐이다. 그림처럼 주 메뉴가 2개 이상이 설정하고자 할때는 NativeMenu()에 다른 여러개의 NativeMenu()를 만들어 addSubmenu(대상NativeMenu() , 라벨 )을 사용하여 설정한다.

[주메뉴가 3개인 메뉴 트리]
mainMenu[ NativeMenu ] - subMenu[ NativeMenu ]
     - subMenu[ NativeMenu ]
     - subMenu[ NativeMenu ]

 
이처럼 만든 NativeMenu를 어플리케이션에 반영하고자 한다면  
NativeApplication.nativeApplication.menu 속성에 대입할 수 있다.
물론 윈도우가 1개일 경우에는 위처럼 직접 설정하면 되지만 여러개의 윈도우에서 각각 메뉴를 설정하고자 한다면 NativeApplication.nativeApplication.openedWindows[ 윈도우 index번호 ].menu 를 사용하여 메뉴를 설정할 수 있다. 또는 대상.stage.nativeWindow.menu 속성을 사용하여 메뉴를 설정 할 수도 있다.
Posted by 버터백통