AIR のウインドウ (1) -- メインウインドウ で、いろいろなウインドウを作成しましたが、 メインウインドウでは設定でき無い type を使用するには、2次ウインドウを作成 して使用する必要があります。 2次ウインドウを使用すれば、自由にウインドウ設定ができるようになるので、 メインウインドウは特に必要無いかもしれません。ですから、それを想定して、 AIR のウインドウ (2) -- メインウインドウ では、メインウインドウをシステムトレイ に登録して動作するようにしました。 2次ウインドウを作成するには、Window クラスを別ファイルで作成して、 ユーザークラス( Window クラスを継承した形 ) をインスタンス化して使用します ユーザークラスと呼び出しtype="utility"
systemChrome が standard と none での見た目の差は、type="normal"と差はありませんが、 utility では、タスクバーに表示されません。standard の場合には、「閉じる」ボタンしか 無いので処理を実装すれば矛盾しませんが、none の場合では最小化や最大化が有効になっているので カスタマイズが必要です ↓ minimizable="false" maximizable="false" LboxWindow.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" type="utility" systemChrome="none" transparent="false" showFlexChrome="true" initialize="initData();" creationComplete="initApp1()" applicationActivate="initApp2()" visible="true" usePreloader="true" backgroundAlpha="1" alwaysInFront="false" title="Flex" titleIcon="@Embed('icon.png')" width="600" height="300" horizontalAlign="center" verticalAlign="middle" > <mx:Script> <![CDATA[ // ********************************************************* // initialize // ********************************************************* public function initData():void { trace("[App:beforeDisplay]"); } // ********************************************************* // creationComplete // ********************************************************* private function initApp1():void { trace("[App:afterDisplay]"); } // ********************************************************* // applicationComplete // ********************************************************* private function initApp2():void { trace("[App:start]"); dr.setFocus(); } ]]> </mx:Script> <mx:Image id="dr" source="@Embed('dr.png')" /> <mx:HBox> <mx:TextInput id="data" width="400" /> <mx:Button id="btn" label="参照" /> </mx:HBox> </mx:Window> 呼び出し部分
import LboxWindow; public var win:LboxWindow = new LboxWindow(); public var rect:Rectangle; public var primaryScreen:Screen; // ********************************************************* // initialize // ********************************************************* public function initData():void { trace("[App:beforeDisplay]"); // ********************************************************* // 表示レイアウトが完成する前に、 // タイトルのアイコンを Image に転送しておきます // initApp1 では正しいビットマップが作成されません // ********************************************************* app_icon.source = Object(this.titleIcon); primaryScreen = Screen.mainScreen; rect = primaryScreen.bounds; win.open(); win.nativeWindow.x = (rect.width-this.nativeWindow.width)/2; win.nativeWindow.y = (rect.height-this.nativeWindow.height)/2 - 200; } type="lightweight" では、systemChrome は none でのみ動作します。 見た目の差はありませんが、マニュアルでは「最小ウインドウ」とあります。 やはり、タスクバーに表示されません。 type="lightweight"
タスクバーに表示されない、最小化と元のサイズに戻すtype="utility" でかつ systemChrome="none" の場合、最小化ボタンが有効です。 しかし、最小化してしまうとタスクバーに表示されないので戻せません。 実際バグっぽい動きもしますので、最小化した場合は「非表示」にし、 システムトレイのメニューに「元のサイズに戻す」を実装します。 <?xml version="1.0" encoding="utf-8"?> <mx:Window xmlns:mx="http://www.adobe.com/2006/mxml" type="utility" systemChrome="none" transparent="false" showFlexChrome="true" initialize="initData();" creationComplete="initApp1()" applicationActivate="initApp2()" visible="true" usePreloader="true" backgroundAlpha="1" alwaysInFront="false" title="Flex" titleIcon="@Embed('icon.png')" width="600" height="300" horizontalAlign="center" verticalAlign="middle" minimizable="true" maximizable="false" displayStateChange="miniAction(event)" close="exitApp()" > <mx:Script> <![CDATA[ // ********************************************************* // initialize // ********************************************************* public function initData():void { trace("[App:beforeDisplay]"); } // ********************************************************* // creationComplete // ********************************************************* private function initApp1():void { trace("[App:afterDisplay]"); } // ********************************************************* // applicationComplete // ********************************************************* private function initApp2():void { trace("[App:start]"); dr.setFocus(); } // ********************************************************* // 最小化の処理 // ********************************************************* private function miniAction( e:flash.events.NativeWindowDisplayStateEvent ):void { trace("[State] : " + e.afterDisplayState); // 最小化の場合のみ if ( e.afterDisplayState == "minimized" ) { this.visible = false; } } // ********************************************************* // アプリケーション終了 // ********************************************************* private function exitApp():void { mx.core.Application.application.nativeApplication.icon.bitmaps = []; // 終了 mx.core.Application.application.exit(); } ]]> </mx:Script> <mx:Image id="dr" source="@Embed('dr.png')" /> <mx:HBox> <mx:TextInput id="data" width="400" /> <mx:Button id="btn" label="参照" /> </mx:HBox> </mx:Window> Mainw.mxml の メニュー追加
// セパレータ menuItem = nativeMenu.addItem(new NativeMenuItem("", true)); // 最小化 menuItem = nativeMenu.addItem(new NativeMenuItem("最小化")); menuItem.addEventListener(flash.events.Event.SELECT, function():void { win.minimize(); win.visible = false; } ); // 元に戻す menuItem = nativeMenu.addItem(new NativeMenuItem("元に戻す")); menuItem.addEventListener(flash.events.Event.SELECT, function():void { win.visible = true; win.restore(); } ); |