AIR/파일시스템 연동2008. 12. 9. 19:06

FileReference()에 기본적으로 OS다이얼로그 창을 제공하는 메서드를 지원한다. player10 이후에는 FileReference()만으로 무비에 불러오고 로컬에 저장까지 가능하다.  
이러한 클래스를 상속받은 File()클래스는 같은 방법으로 로컬상의 파일을 불러오거나 저장을 할 수 있다.

* 다이얼로그 창 여는 메서드
File.browse() : 업로드할 파일을 선택할 수 있는 대화상자를 연다.
File.browseForDirectory() : 폴더를 선택하는 대화상자를 연다.
File.browseForOpen() : 파일을 오픈(불러오는)기능의 대화상자를 연다.
File.browseForOpenMultiple() : 여러개의 파일을 오픈(불러오는)기능의 대화상자를 연다.
File.browseForSave() : 파일을 저장하는 기능의 대화상자를 연다


이러한 메서드들을 호출하면 그림과 같은 대화상자(다이얼로그창)이 나타난다.

그림을 보면 파일형식에 images라고 적혀 있고 실제로 jpg, gif, png 등 이미지 파일만 보여지고 불러올 수 있다 .
이는 browserXXX( 이름 , 파일필터 )를 호출 할 때 대화상자 이름과 파일필터를 인수 값으로 설정할 수 있다. 대화상자의 이름은 문자열로 설정하며 파일필터는 FileFilter()를 담은 배열이나 단독적인 파일필터를 사용하여 설정한다. FileFilter()에 설정된 파일형태만 다이얼로그창에 표현할 수 있다. 단 로드하고자 하는 형태가 아닌 다른형태의 파일형태가 존재하고 해당 이름을 창에서 직접 입력하여 불러오면 무비속으로 불려 진다. 당연히 사용할 수 없는 포맷이므로 그냥 사용하지 말고 내부에서 확장자 검사를 다시 한번 하여 사용하는 예외처리를 하는 것을 잊지말자.

이처럼 File을 delegate한 객체에 Event.SELECT이벤트를 사용하면 어떠한 파일을 선택하였거나 저장시 저장할 파일을 선택 또는 생성 하였을 때  Select이벤트가 발생하며 리스너에서 처리하면 된다.

AIR에서는 FileListEvent라는 이벤트를 추가로 제공한다. browseForOpenMultiple() 호출을 통해 여러개의 파일을 선택하였을 때 객체에 FileListEvent.SELECT_MULTIPLE을 리스너로 등록하면 이벤트의 files에 배열 형태로 파일들이 저장되게 된다. 또한 FileListEvent.DIRECTORY_LISTING 역시 디렉토리에 포함된 내용을 배열에 등록하는 이벤트도 지원한다.


Posted by 버터백통
AIR/파일시스템 연동2008. 12. 9. 16:43

앞서 AIR의 File이라는 클래스를 통해 로컬디렉토리에 접근하는 방법을 공부하였다. 이번에는 File로 특정 디렉토리로 접근하여 대상 디렉토리에 존재하는 파일과 폴더정보를 읽어 오는 getDirectoryListingAsync()getDirectoryListing()를 살펴보도록 한다. 이 둘의 기능은 똑같지만 차이가 있다면 비동기 방식과 동기 방식밖에는 차이가 나질 않는다.

비동기식으로 대상 디렉토리의 내용을 읽어 올 때는 항상 FileListEvent.DIRECTORY_LISTING이벤트를 사용하여 이벤트의 files라는 속성으로 접근하여야 하는 점을 유의한다
동기식일 때는 try catch를 적절하게 사용하여야 하며 무비가 끊기지(멈추지) 않도록 신경을 써서 처리하여야 한다.

아래 코드는 윈도우 OS의 내문서 폴더에 있는 내용을 비동기식으로 읽어오는 테스트이다.
var documentDirectoryList:File = File.documentsDirectory;
documentDirectoryList.addEventListener( FileListEvent.DIRECTORY_LISTING , result );
documentDirectoryList.getDirectoryListingAsync()

function result( e:FileListEvent ):void
{
    for( var atrb:String in e.files  ){
     //내문서의 폴더와 파일 경로 읽어오기
     trace( atrb + "  : " + e.files[atrb].url)
    }
}

결과는 좀 지저분하지만 몇개 적는다면 아래와 같이 URL scheme로 출력해 보았다
0  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/2%ed%8c%80_1%ed%8c%8c%ed%8a%b8_%ec%a3%bc%ea%b0%84%eb%b3%b4%ea%b3%a0_%ec%8a%a4%ec%bc%b8%ec%a5%b4(081204).xls
1  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/AIR%20%ec%9d%b8%ec%a6%9d
2  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/createDirectory
3  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/DB.db3
4  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/Downloads
5  : file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/dxva_sig.txt
......

출력 결과물 0번과 1번의 초록색 부분을 보면 제일 뒤에 심하게 깨져(인코딩 되어)있는 것을 볼 수 있다. 이것은 한글 이름으로 정의된 폴더와 파일 이름이다.
Posted by 버터백통
AIR/파일시스템 연동2008. 12. 9. 15:23


AIR에는 FileReference를 상속받은 File()이라는 클래스가 있다.
File클래스의 주된 기능은 로컬의 디렉토리나 파일로 접근하여 데이터를 읽어 오거나 디렉토리 생성 삭제, 파일 생성 삭제 등 File 시스템 작업을 하는 클래스 이다.

File에는 몇 가지 디렉토리로 접근하는 경로가 상수로 잡혀있다.
File.userDirectory: 사용자 계정의 폴더경로
File.applicationDirectory : AIR어플리케리션 파일이 있는 경로(읽기만 가능)
File.applicationStorageDirectory : AIR어플리케이션 storage 경로(읽기와 쓰기가 가능)
File.desktopDirectory : 바탕화면 경로(읽기와 쓰기가 가능)
File.documentsDirectory : 내문서 경로(읽기와 쓰기가 가능)


위와 같은 기본 경로를 토대로 resolvePath()를 사용하여 경로를 완성한다.

* 하위 경로를 설정하는 resolvePath( path:String ) 메서드
resolvePath( )의 path에 문자열로 하위 폴더나 또는 접근하고자 하는 파일을 설정하면 해당 파일이나 폴더로 접근이 가능하다. 가령 윈도우OS의 내문서 폴더로 접근하려면 File.documentsDirectory 까지만 사용하면 되지만 내문서에 "My Folder"라는 폴더로 접근하고자 할 때는 resolvePath()를 사용하여 File.documentsDirectory.resolvePath("My Folder")라고 하위 디렉토리 명까지 적어 주어야 한다. 물론 파일에도 접근이 가능하다. 만약 My Folder에 sys.txt파일로 접근하여 데이터를 가져오고자 한다면
File.documentsDirectory.resolvePath("My Folder/sys.txt")라고 적어준다. 또한 한 단계 상위로 이동하고자 할때는 "../" 또는 ".."을 사용하면 현재위치에서 한 단계 상위 폴더로 이동한다.

* 현재 위치를 확인하는 nativePath 속성과 url속성
현재 위치를 알고 싶을 때는 nativePath속성을 사용한다. nativePath는 현재 File의 지점이 어디인지를 확인할 수 있도록 자세한 경로를 나타낸다.
가령 var myDoc:File = File.documentsDirectory.resolvePath("My Folder");
trace( myDoc.nativePath )
trace결과는 "C:\Documents and Settings\Administrator\My Documents\My Folder"라고 출력을 한다. 위의 경로에서 "C:\Documents and Settings\Administrator\My Documents"까지가 File.documentsDirectory에서 기본 제공하는 경로이며 resolvePath("My Folder") 에 의하여 내문서 폴더안에 "My Folder"라는 이름의 디렉토리까지 접근이 가능하다.

또한 비슷한 형태로 URL 스키마로 표현하는 url이라는 속성이 있다. 이 속성으로 추출된 값은 URL경로로 사용이 가능하다. 아래 테스트 결과(URL scheme)에 마우스 오버하면 링크가 걸린다는 사실을 확인할 수 있다.
trace( myDoc.url)를 출력하면 결과는 다음과 같다.
"file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/My%20Folder"






Posted by 버터백통
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 버터백통

화면을 꽉채워주는 풀스크린은 대부분의 어플리케이션에서 제공하고 있다 물론 AIR에서도 디스플레이 상태를 설정함으로서 이를 구현 할 수 있다.

[ 스테이지 디스플레이 상태 설정 ]
FULL_SCREEN : String = "fullScreen" 
풀스크린모드로 설정

FULL_SCREEN_INTERACTIVE : String = "fullScreenInteractive"
사용자의 반응을 체크/응답할 수 있는 영역의 풀스크린 모드로 설정
NORMAL : String = "normal"
일반적인 기본 상태

이처럼 stage의 정열이나 디스플레이 상태등을 설정하여 우리가 원하는 크기와 영역등을 설정 할 수 있다.

이제 어플리케이션 설정을 마치는군요...가장 많은 내용이 있었던 챕터 같습니다.
Posted by 버터백통

반드시 사용자의 확인이 필요하거나 주의를 집중시키기 위하여 작업창이 깜박이는 아이콘을 본적이 있을 것이다. 주로 나같은 경우에는 익스플로러를 실행하고 다른 창을 보고있으면 실행 완료 되면 작업 표시줄에 깜빡이는 브라우저 아이콘을 보게된다. 역시 AIR에서도 이러한 기능을 제공하고 있다.

바로 NativeWindow에 notifyUser()에 파라미터 NotificationType을 설정하여 유저에게 알림을 준다
NotificationType.CRITICAL : 작업표시줄의 아이콘과 크롬창이 깜빡인다.
NotificationType.INFORMATIONAL : 작업표시줄의 아이콘만 불이 들어온다
Posted by 버터백통
 
AIR를 공부하면서 가장 마음에 드는 기능 중에 하나는 타파일과의 연계이다. 가령 *.jpg나 *.gif를 클릭하면 이미지뷰어가 자동으로 실행한다. 또는 *.ppt문서를 클릭하면 자동으로 파워포인트가 실행하듯이 기존의 포맷이나 자신만의 특정한 파일포맷을 만들어 *.jys나 *.butter이라는 확장자를 만들어 자신만의 어플리케이션을 만들수 있는 것이다. 이를 실행하기 위해서는 몇가지 설정만으로 가능해진다.

[ 연계관련 메서드 ]
NativeApplication.nativeApplication.setAsDefaultApplication("확장자")
현재 어플을 특정 파일의 기본 어플로 설정
   
NativeApplication.nativeApplication.removeAsDefaultApplication("확장자");
연계된 특정 파일과 연계를 제거

NativeApplication.nativeApplication.isSetAsDefaultApplication("확장자")
현재 어플과 특정 파일과 연계 여부를 체크

NativeApplication.nativeApplication.getDefaultApplication("확장자")
특정 파일에 연계된 디폴트 어플리케이션 이름을 반환

 
메서드와 함께 실행할 파일을 디스크립터의 <fileTypes>를 설정하여야 한다.
또한 로컬에 설치된 상태이어야 연게가 가능하며 이미 타 어플리케이션과 연계되어있다면 사용자의 확인(클릭)후에 자신의 APP와 연계가 가능해진다.
Posted by 버터백통

메신저나 위젯처럼 시스템 실행시 자동으로 실행하여 사용자의 사용을 유도하거나 편의성을 제공하도록 하기 위해서는 AIR에 NativeApplicationstartAtLogin속성을 true로 설정한다.
단 설치된 상태에서만 동작한다. 그렇지 않으면 컴파일 에러를 발생
Posted by 버터백통

AIR는 CS이다 보니 사용자의 자리비움을 체크해야 하는 경우가 있다. 따라서 자리비움이면 중요 정보창인 경우 자동으로 창이 닫히게 하거나 풀스크린 창을 띄워 화면보호기 역할을 수행 할 수도 있게된다.
이는 바로 NativeApplication의 nativeApplication에 idleThreshold에 값을 설정하여 유휴시간을 정할 수 있다. 기본은 300초이고 설정은 초단위로 값을 설정할 수 있다.

설정후에 실제 자리비움이 발생하면 이를 체크하는 이벤트를 등록한다. 
USER_IDLE  : 자리비움 발생 이벤트
USER_PRESENT : 자리비움 해제이벤트


Posted by 버터백통

NativeWindow는 생성시 width와 height를 이용하여 창의 크기를 정하여 준다. 또한 생성 이후 runtime시 크롬창으로 창의 크기를  새로 조절할 수 있다. 그러나 크롬레스창으로 조절기능이 없거나 기타 예외사항이 발생하여 조절할 수 없는 창을 runtime시 새로 조절하기 위해서는 startResize(기준이 되는 코너설정)를 사용한다. 물론 stage에는 이를 제어할 버튼이나 처리 할 수 있는 객체가 있어야 할 것 이다.
중요한 것은 startResize 이후 화면갱신이 중요하다. startResize시에는 희미한 회색 테두리만 화면에 그려지므로 실제 이것이 창의 크기에 반영되지 않는다.
따라서 startResize()이 완료될 때 NativeWindowBoundsEvent.RESIZE 이벤트를 사용하여 완료시 stageWidthstageHeight속성을 활용하여 화면을 새로 그리거나 위치 등을 재정리 하여야 한다.

마찬가지로 크롬창이나 창을 조절할 수 없는 형태의 창에서는 startMove()를 사용하여 NativeWindow를 드래그 할 수 있다.
Posted by 버터백통
여러개가 활성화된 NativeWindow에서 창의 앞과 뒤를 바꾸어 주어야 하는 경우가 종종 발생하게 된다. 물론 사용자가 클릭하면 자동으로 제일 앞으로 이동하게 되는데 그렇지 않고 설치나 작업 중에 자동으로 앞뒤의 위치를 바꾸어 가며 정보나 작업상태를 표현하거나 confirm을 요구하는 경우일 때는 코드에서 이러한 처리응 해주어야 한다.

이러한 경우 NativeWindow에서 제공하는 몇 가지 속성이 있다.
orderToFront(); : 한단계 앞으로
orderToBack(); : 한단계 뒤로
orderInFrontOf(매개변수); : 매개변수의 윈도우 보다 앞에 위치
orderInBackOf(매개변수); : 매개변수의 윈도우 보다 뒤에 위치
alwaysInFront : 항상 다른 윈도우창보다 앞으로 위치

위와 같은 메서드를 사용하여 현재 창과 다른 창의 위치를 변경할 수 있다. 이들은 앞서 살펴본 openedWindows에서 제공하는 배열과 함께 사용하며 매개변수는 배열의 원소 값를 이용한다.
Posted by 버터백통

작업을 하다가 모든창을 닫거나 뒤에 가려진 창을 앞으로 이동시키거나 하는 작업을 하기위해서는 현재 열려있는 창으로 접근하여야 한다. 창이 많은 때는 하나하나 delegator를 기록하고 있다가 제어하기 힘들다. 따라서 이들을 관리하는 옵저버가 있을 것이라 생각을 하게 된다. 바로 openedWindows가 이들을 관리하는 옵저버이다.

현재 열려있는 모든 창은 자동으로 NativeApplicationnativeApplicationopenedWindows에 배열로 저장되어있다. 따라서 배열 변수를 선언하고 NativeApplication.nativeApplication.openedWindows를 받아서 현재 열려 있는 모든창으로 접근이 가능해 진다.

 
[ NativeWindow의 순서 ]

먼저 생성된 것이 정수 색인 배열에서 가장 먼저 자리잡고 나중에 생선된 것이 그 앞을 가리게 된다.
따라서 배열에는 적은 정수가 먼저 생성된 것들이고 뒤에서 가려지고 있는 것이다.
가령 창이 3개가 있으면 3번째 창은 배열에서 2에 해당하는 위치에 자리잡고 있다.



Posted by 버터백통


NativeWindow는 delegator에서 visible속성이나 activate()를 하면 창이 활성화 된다. 창을 닫기 위해서는 close() 메서드를 사용하는데 한번 close된 창은 두번 다시 재 활용할 수 없게 된다. 따라서 창을 다시 열 수 있도록 하기 위해서는 visible을 컨트롤 해야 한다. 또한 사용자가 크롬 창의 닫기버튼을 사용하여 close할 경우를 대비하여 해당 윈도우를 닫을때 NativeWindow의 delegator에 CLOSING이벤트를 두어 visible속성을 false로 한다.
이경우 preventDefault()를 사용한다.

private var options:NativeWindowInitOptions;
private var window:NativeWindow;
private function init():void
{
    options = new NativeWindowInitOptions();
    options.type = NativeWindowType.NORMAL;
    window = new NativeWindow( options );
    
    addEventListener( MouseEvent.CLICK , onOpen );
    window.addEventListener( Event.CLOSING , onClose );
    
    window.width = window.height = 200;
    window.activate();
}
   
private function onOpen( e:MouseEvent ):void
{
      window.visible = true;
}
   
private function onClose( e:Event ):void
{
    window.visible = false;
    e.preventDefault();
}

위의 코드는 자식창을 크롬에서 닫기하였을 때 visible로 컨트롤하고 메인창을 클릭하면 visible = true로 하여 창을 다시 활성화 하도록 처리하였다.

참고) visible을 컨트롤 하여도 작업표시줄에 비활성화 된다.

Posted by 버터백통

윈도우의 상태 즉 모니터상에서 위치나 크기 등 메인 어플리케이션은 WindowedApplication속성이나 디스크립터 또는 <mx:Script>에서 nativeWindow로 접근하여 사용한다.
보통 크기는 width , height 위치는 x , y 등으로 설정되므로 .xml에서 찾아보면 쉽게 발견 할 수 있다.

메인에서 생성된 서브윈도우(NativeWindow)의 위치나 크기 설정도 앞서 투명창 설정한 바와 같이 Delgator에 바로 속성을 설정할 수 있다.
window.width = 300
window.height = 200
window.x = 300
window.y = 400


참고로 이벤트에 의하여 객체를 받아(event.target) Delegator를 처리할때는
아래처럼 stage로 접근하여 붙어있는 nativewindow로 접근한다.
event.target.stage.nativeWindow.x = 0;
event.target.stage.nativeWindow.y = 0;

사용자 모니터의 해상도를 읽어와 항상 가운데에 위치하도록 하기 위해서는 flash.system.Capabilities를 사용한다.

모니터 중앙에 위치
window.x = ( Capabilities.screenResolutionX - width ) / 2;
window.y = ( Capabilities.screenResolutionY - height ) / 2;  

참고로 screenResolutionX는 사용자 모니터의 가로 해상도이며 screenResolutionY는 세로 해상도이다.
Posted by 버터백통
1 메인 어플리케이션 윈도우에 크롬레스적용하기
투명윈도우 창을 만들기위해서는 디스크립터를 이용하여야한다. 물론 플래시는 이부분의 편집을 상당히 쉽게 설정할 수 있도록 되어있지만 플렉스는 .xml에서 <initialWindow>에 크롬레스 등 필요한 설정을 하여야 한다.

플렉스에서는 투명창을 만들기 위해서는 반드시 mx.Window라는 어플리케이션을 포함하고 있어야 한다. 가장 바깥을 감싸고 있는 WindowedApplicationshowFlexChrome="false"로 설정하고  그 안에 Window( UI컴퍼넌트를 포함한 레이아웃컨테이너를 상속받은 클래스 )에 속성을 systemChrome="none" transparent="true" type="lightweight" showFlexChrome="false" 로 설정하여야 정상적인 투명창을 만들 수 있다. 불편한 설정도 플렉스4에서는 많이 개선되리라 기대해본다...

참고로 플렉스의 컴퍼넌트를 사용하면 플래시보다 파일크기가 상당히 커지게 된다. 코딩이 편한 장점이 크지만 결과물에 대한 단점이 매우 치명적이다. 따라서 액션스크립트 프로젝트에서도 AIR가 지원되야 한다고 생각한다.

2 서브 윈도우에 크롬레스 적용하기
메인 윈도우에서 생성된 서브윈도우( 이벤트 디스패쳐를 상속받은 NativeWindow클래스 )는 스테이지가 등록되어있고 Window컴퍼넌트에서 지원하는 메서드와 속성을 제공하고 있다.

//옵션설정
var option:NativeWindowInitOptions = new NativeWindowInitOptions();
option.type = NativeWindowType.LIGHTWEIGHT;
option.systemChrome = NativeWindowSystemChrome.NONE;
option.transparent = true;
    
//새창생성    
var window:NativeWindow = new NativeWindow(option);
window.visible = true;

//배경생성
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF , 0.5 );
bg.graphics.drawRoundRectComplex(0,0,200,200,10,10,10,10)
bg.graphics.endFill();
    
//환경설정
window.stage.addChild( bg );
window.width = 200
window.height = 200
window.stage.align = StageAlign.TOP_LEFT;
window.stage.scaleMode = StageScaleMode.NO_SCALE;
Posted by 버터백통

AIR는 메인 클래스 또는 도큐먼트 크래스를 어플리케이션으로 설정한다. 따라서 기본 창은 1개를 제공하는데 경우에 따라 서브 윈도우를 열어야 하는 경우 nativeWindow클래스를 사용한다.따라서 어플리케이션(윈도우)과 그와 연계된 서브 프로세스(윈도우)들로 구성된다.

어플리케이션에서 윈도우를 새로 만들기 위해서는 NativeWindow()클래스를 사용한다. 이때 반드시 NativeWindowInitOptions()를 설정하여 NativeWindow()의 파라미터로 설정한다. NativeWindowInitOptions()는 새로 열릴 윈도우의 상태를 설정하는 클래스이다.

type = 새로만들 윈도의 시스템 크롬 설정
NativeWindowType.UTILITY : 시스템 크롬을 부분적 사용
NativeWindowType.NORMAL : 시스템 크롬을 전부 사용(새로운 인스턴스 생성에 적합)
NativeWindowType.LIGHTWEIGHT : 시스템크롬을 비사용(systemChrome = none 설정)
systemChrome = 윈도우창(주변의 크롬 창)의 옵션바 등의 투명도 설정
NativeWindowSystemChrome.STANDARD : OS의 기본 크롬창을 사용한다.
NativeWindowSystemChrome.NONE : 크롬창을 제거한다.
transparent : 투명 여부 설정
minimizable : 최소화 여부 설정
maximizable : 최대화 여부 설정
resizable : 리사이즈 여부 설정
x : 윈도우 창의 x위치
y : 윈도우 창의 y위치
width : 윈도우창의폭
height : 윈도우 창의 높이

NativeWindow()는 디스플레이 오브젝트 컨테이너를 상속받지 않는다. 따라서 이를 담고있는 stage로 가서 객체를 addChild()하여야 한다. 또한 컨텐츠의 정열과 크기의 제어 또한 stage에서 설정한다.
scaleMode : 윈도우 창에 의한 스케일 조절
StageScaleMode.NO_SCALE : 컨텐츠의 스케일 변화 없게
StageScaleMode.EXACT_FIT : 종횡비 없이 강제로 알맞는 크기 제어
StageScaleMode.NO_BORDER : 종횡비를 유지하되 깨짐을 최소화 하여 컨텐츠 크기 제어
StageScaleMode.SHOW_ALL : 종횡비를 유지하고 깨짐을 최소화 하여 전체 내용이 보이도록 크기 제어
align : 윈도우 창에 의한 위치 설정
StageAlign에 여러가지 설정된 상수로 설정한다.

이렇게 생선한 윈도우는 항상 visible = true나 activate(활성화)에 의해 화면에 나타나게 된다.


Posted by 버터백통