windowing APIの最近のブログ記事

displayStateChanging イベントのキャンセル

前回書いたように、ing 系のイベントは必要に応じて処理自体をキャンセルするために使用できます。displayStateChanging イベントであれば displayState の変更をキャンセルするわけですから、最大化や最小化を行わないという指示を出すことになります。

AS3 では、イベントにより標準的に行われることになっている処理をキャンセルするには、イベントハンドラ内で preventDefault() を呼び出します。前回のサンプルをそのまま使うと、onDispStateEvent() メソッド内に preventDefault() を追加すればよいことになります。

onDispStateEvent() メソッドは displayStateChange と displayStateChanging イベントの両者で共用しているのでキャンセル不可のイベント (displayStateChange) も渡される可能性があります。そのため、キャンセル可能かを確認するロジックも追加しています。

以下は NativeWindow クラスのイベントのリストです。

displayStateChange    NativeWindow オブジェクトの displayState 属性が変更された
displayStateChanging  NativeWindow オブジェクトの displayState 属性が変更される直前
move                  NativeWindow オブジェクトがデスクトップ上で移動した
moving                NativeWindow オブジェクトがデスクトップ上で移動する直前
resize                NativeWindow オブジェクトの大きさが変更された
resizing              NativeWindow オブジェクトの大きさが変更される直前
close                 NativeWindow オブジェクトが閉じられた
closing               NativeWindow オブジェクトが閉じられる直前
  

ひとめで2つずつペアになっているのが分かるかと思います。4種類のウインドウに対する操作に対して、完了の直前と完了後それぞれの状態を通知するイベントが定義されています。

ing で終わるイベントは警告のような位置づけで、これを受け取ることで処理が完了する前に状況を確認したり、場合によっては処理自体をキャンセルするといった使い方が想定されています。そのため ing 系のイベントはいずれもキャンセル可能です。

一方 ing のつかないイベントは完了を通知するイベントです。事後処理が必要な場合に使用します。

では個々のイベントを少し詳しく見てみたいと思います。

Apollo アプリケーションから新しいウインドウを開くには NativeWindow もしくはそのサブクラスのインスタンスを生成します。下は NativeWindow のコンストラクタです。

public function NativeWindow(visible:Boolean, initOptions:NativeWindowInitOptions)
 

NativeWindow のコンストラクタは2つの引数を取ります。

1 つ目の引数はウインドウが作成されたときに表示するかしないかのフラグです。ウインドウを作成したら表示位置や大きさなどに多少の細工を加えることも多いと思います。ウインドウが表示された状態でこれらの処理を行うと途中の段階も画面に表示されてしまいますので、とりあえずコンストラクタでは false (非表示) を指定しておいて、必要な処理が終わったら window.visible = true を呼んでウインドウを表示するというのが一般的にはよさそうですね。

同様に、アプリケーション起動時に画面に表示したくない初期処理が存在する場合は、アプリケーション記述ファイル (-app.xml) 内 rootContent タグの visible を false にしておいて適当なタイミングで window.visible = true を呼ぶことで対応できます。

NativeWindow クラスには Apollo アプリケーションのウインドウの位置や大きさを示すプロパティがあります。

x:Number       // ウインドウの左上の角の x 座標
y:Number       // ウインドウの左上の角の y 座標
width:Number   // ウインドウの幅(単位:ピクセル)
height:Number  // ウインドウの高さ(単位:ピクセル)
 

これらのプロパティに値を設定することでウインドウの位置や大きさを変えることができます。

stage.window.x = 50;
stage.window.y = 50;
stage.window.width = 800;
stage.window.height = 600;
 

ウインドウの幅と高さに指定できる最小値と最大値は予め決められています。最小値より小さな値を指定すると最小値として与えられている大きさになります。つまり下限の定義よりウインドウを小さくすることはできません。同様に最大値として定義されている値よりウインドウを大きくすることもできません。

最大値と最小値はそれぞれ以下のプロパティから参照できます。当然ですがこれらのプロパティは読み取り専用です。

ふつうのウインドウだったらマウスでウインドウの位置を変えたり大きさを変えたりできますよね?今回はそれらの機能を追加したいと思います。

startMove() メソッド

startMove() は NativeWindow クラスのメソッドです。

public function startMove():void
 

マウスのボタンを押すと mouseDown イベントが発生します。この状態で startMove() メソッドを呼び出すと、マウスボタンを離す (もしくは何らかのマウスイベントが発生する) までマウスの動きに従ってウインドウを移動させることができます。

移動終了の判断は Apollo 側で勝手に行いますので、特に設定する必要はありません。ですので stopMove() といった類のメソッドは提供されていません。

ちなみに Windows では mouseDown 以外のタイミングから startMove() を呼ぶとキー操作による移動も可能になるようです。

さて、前回のサンプルにタイトルバーを使った移動ができるように機能を追加してみましょう。

NativeWindowDisplayState クラス

ウインドウの現在の表示状態を知りたいとき、NativeWindow クラスの displayState プロパティ (読み取り専用) から取得することができます。

var windowStatus:String = stage.window.displayState;
 

このプロパティの持つ値は NativeWindowDisplayState というクラスに定義されています。とりうる値は以下の3種類です。

NativeWindowDisplayState.NORMAL     // ウインドウは通常の表示状態である
NativeWindowDisplayState.MINIMIZED  // ウインドウは最小化されている
NativeWindowDisplayState.MAXIMIZED  // ウインドウは最大化されている
 

これを使うと前回紹介した NativeWindow のメソッドは以下のように理解することができます。

Apollo アプリケーションのウインドウは NativeWindow というクラスのインスタンスです。この NativeWindow クラスの API を使うとウインドウを閉じたり最大化したりできます。

NativeWindow クラス

DisplayObject のインスタンス (画面に表示されるオブジェクトは基本的にみんなそうです) であれば、自身が所属する表示領域を stage 属性に持っています。この stage 属性から stage を表示している NativeWindow オブジェクトを取得することができます。

// DisplayObject のインスタンス内では以下の記述が可能
var window:NativeWindow = stage.window;
 

Stage の window プロパティは Apollo 実行環境でのみ有効で、Flash Player 環境では存在しません。プラグインは個別のウインドウを持たないので当たり前といえば当たり前ですが。

ちなみに、アプリケーションから実行環境を調べる方法の一つとして System.Capabilities.playerType が使えます。

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      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 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261