Microsoft Outlook 2007에서 최소화버튼을 누르면, 창이 사라지면서 작업표시줄에서도 같이 사라지고, 트레이아이콘으로만 남게 됩니다.
그것을 AIR에서도 구현할 수 있습니다.

AIR에서는 윈도우의 DisplayState를 캐치할 수 있는데요. 즉, 최소화, 최대화 이런 이벤트가 발생하는 것을 잡을 수 있습니다. 그래서 만약 위와 같은 기능을 구현하고자 한다면 이렇게 하면 됩니다.

최소화이벤트를 잡은 뒤, 창의 visible을 false로 바꾸고, trayicon의 icon이미지를 넣어주면 됩니다.
또, 창을 다시 원래 대로 돌리려면, trayicon에 이벤트를 걸어서 클릭 시, 창의 visible을 true로 바꿔주고, trayicon의 icon이미지를 삭제하면 됩니다.

http://help.adobe.com/en_US/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7dcb.html

음....저는 찾는데 하루를 소비했습니다만-_-;(머리가 딸려서-_-) 찾은 문서는 Adobe AIR에 있는 "Developing Adobe AIR 1.1 Applications with Flex"문서군요 ㅠ

아래는 제가 구현해봤습니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    creationComplete="creationCompleteHandler()">
    <mx:Script>
        <![CDATA[

            private var icons:Loader = new Loader();
                   
            private function creationCompleteHandler():void
            {
                makeTrayIcon();
                icons.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
               
                nativeWindow.addEventListener(
                        NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onChange);
            }
           
            private function onChange(event:NativeWindowDisplayStateEvent):void
            {
                if (event.afterDisplayState == NativeWindowDisplayState.MINIMIZED)
                {
                    event.preventDefault();
                    nativeWindow.visible = false;
                   
                    icons.load(new URLRequest("icons/icon_16.png"));
                }
            }
           
            private function makeTrayIcon():void
            {
                var iconMenu:NativeMenu = new NativeMenu();
                var visibleCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Visible"));
                visibleCommand.addEventListener(Event.SELECT, function(event:Event):void {
                    nativeWindow.visible = true;
                    NativeApplication.nativeApplication.icon.bitmaps = [];
                });
               
                var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit"));
                exitCommand.addEventListener(Event.SELECT, function(event:Event):void {
                    NativeApplication.nativeApplication.icon.bitmaps = [];
                    NativeApplication.nativeApplication.exit();
                });
               
                var systray:SystemTrayIcon =
                NativeApplication.nativeApplication.icon as SystemTrayIcon;
                systray.menu = iconMenu;
            }
        
            private function iconLoadComplete(event:Event):void
            {
                NativeApplication.nativeApplication.icon.bitmaps =
                    [event.target.content.bitmapData];
            }

        ]]>
    </mx:Script>
</mx:WindowedApplication>
[/code]
핵심은
[code]
nativeWindow.addEventListener(
                        NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onChange);

private function onChange(event:NativeWindowDisplayStateEvent):void{
    if(event.afterDisplayState == NativeWindowDisplayState.MINIMIZED){
        event.preventDefault();
        event.target.visible = false;
    }
}
[/code]
우선 윈도우에 NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING 이벤트를 겁니다. 이것은 윈도우의 상태가 변경되었을 때 발생합니다.
최소화버튼을 누르거나 작업표시줄에서 버튼을 클릭하여 최소화 할 때 이벤트가 발생합니다.
event.preventDefault()를 호출하게 되면 디폴트동작을 취소하게 됩니다. 그리고 창만 숨기는거죠. 창을 숨기면 작업표시줄에도 사라집니다. 그리고, trayicon을 만들면 됩니다.

후.....달이차오르니 가야겠습니다.

 
Posted by 머드초보

댓글을 달아 주세요

  1. 박스농사 2009.03.17 09:12  댓글주소  수정/삭제  댓글쓰기

    머드초보님의 블로그가 매우도움이 되네요
    air를 시작한지 얼마 안됬는데 재미있어요~ 감사합니다.

    • 머드초보 2009.03.18 12:05  댓글주소  수정/삭제

      앗 박스농사님! Flexcomponent에서 자주 뵈었는데요^^
      뭐 기초적인 것 밖에 없어서 도움이 되셨다니 다행입니다ㅠ
      방문해주셔서 감사해요~

 

음 뭔가 해보려고 하는데 잘 안되네요-_-;
원하는 모양은 아니지만 시스템트레이에 아이콘 띄우는 것 까지 성공했습니다--;
우선 저는 윈도우를 없애고 싶은데 이게 은근히 어렵네요-_-;

FLEX3 Beta 3에서 테스트했습니다. Beta2에서는 안됩니다.
방식이 조금 업그레이드되었어요. Beta2에서는 Shall어쩌구를 썼는데 바뀌었네요.
AIR예제니까 프로젝트 만들 때 Desktop Application으로 만들어야겠죠? ^^

예제입니다.
[code]
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
 applicationComplete="init();">

 <mx:Script>
  <![CDATA[
   public function init():void {
   
    var icon:Loader = new Loader();
    var iconMenu:NativeMenu = new NativeMenu();
    var visibleCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Visible"));
    var exitCommand:NativeMenuItem = iconMenu.addItem(new NativeMenuItem("Exit"));
   
    visibleCommand.addEventListener(Event.SELECT,
     function(event:Event):void {
      stage.nativeWindow.visible = true;
     }
    );
   
    exitCommand.addEventListener(Event.SELECT,
     function(event:Event):void {
      NativeApplication.nativeApplication.icon.bitmaps = [];
      NativeApplication.nativeApplication.exit();
     }
    );
     
    if (NativeApplication.supportsSystemTrayIcon) {
     NativeApplication.nativeApplication.autoExit = false;
     icon.contentLoaderInfo.addEventListener(Event.COMPLETE, iconLoadComplete);
     icon.load(new URLRequest("icons/AIRApp_16.png"));
     var systray:SystemTrayIcon = NativeApplication.nativeApplication.icon as SystemTrayIcon;
     systray.tooltip = "AIR application";
     systray.menu = iconMenu;
    }
 
    if (NativeApplication.supportsDockIcon){
     icon.contentLoaderInfo.addEventListener(Event.COMPLETE,iconLoadComplete);
     icon.load(new URLRequest("icons/AIRApp_128.png"));
     var dock:DockIcon = NativeApplication.nativeApplication.icon as DockIcon;
     dock.menu = iconMenu;
    }
   }
   
   private function iconLoadComplete(event:Event):void {
    NativeApplication.nativeApplication.icon.bitmaps =
     [event.target.content.bitmapData];
   }
   
   public function hide():void {
    stage.nativeWindow.visible = false;
   }
  ]]>
 </mx:Script>
 <mx:Button label="창숨기기버튼" click="hide();"/>
 
</mx:WindowedApplication>
[/code]
air 개발자문서를 보고 약간 변형에서 작성해봤습니다.
참숨기기버튼을 클릭하면 창이사라지구요. 트레이아이콘에서 오른쪽버튼을 눌러서
visible을 클릭하면 다시 생기게 만들었습니다. exit누르면 종료하게 하구요.

NativeMenuItem 클래스로 메뉴를 추가하구요.
그 객체에 addEventListener해서 Event.SELECT를 해서 함수를 지정해주면 선택된 메뉴에 대해서 지정된 함수를 호출하는 겁니다.

NativeApplication.supportsSystemTrayIcon 이거는 시스템트레이아이콘을 지원하는 놈이냐? 라고 물어보는겁니다. 윈도우는 당연히 지원하겠지요 ^^
만약 운영체제가 맥os라면 NativeApplication.supportsDockIcon라고 물어봤을 때 지원하는 것 같습니다.

크로스플랫폼(맞나-_-)형태로 제작이 되어있네요. 크로스운영체제!! 어디든 가능하게 ^^

샘플실행할 때 icons경로 밑에 AIRApp_128.png파일과 AIRApp_16.png파일이 있어야겠죠?^^

 
Posted by 머드초보

댓글을 달아 주세요