skip to main |skip to sidebar

2007-04-22

NativeWindow 类的事件详解1

以下是 NativeWindow 的事件列表:

Code:
displayStateChange //NativeWindow 对象的 displayState 属性被变更后
displayStateChanging //NativeWindow 对象的 displayState 属性被变更前
move //NativeWindow 对象在桌面上移动后
moving //NativeWindow 对象在桌面上移动前
resize //NativeWindow 对象改变大小后
resizing //NativeWindow 对象改变大小前
close //NativeWindow 对象被关闭后
closing //NativeWindow 对象被关闭前

我想一看就明白各2个事件成为一对。定义了对窗口的4种操作的紧接之前和完成后各自的状态的事件。

ing 结束的事件赋予像警告一样的地位,在处理事件完成前,可以确认状况,根据场合的不同取消处理等。为此 ing结束的事件全都是可以取消的。

另一方面,不以ing 结束的事件是通知完成后的事件。需要事后处理的情况使用。

下面稍微详细地查看以下各个事件。

NativeWindowDisplayStateEvent

是首先有关 displayState 属性变更的事件。displayStateChanging 是NativeWindow 对象的 displayState 被变更的紧接之前,而displayStateChange 是根据 displayState 被变更了之后的 NativeWindow 的处理(dispatch)。

这个时候dispatch的事件对象的形式为 flash.events.NativeWindowDisplayStateEvent 。这个对象的事件有着 beforeDisplayState 和 afterDisplayState 的属性,表示各自变更前的值和变更后的值。

因为在displayStateChanging 事件的情况下变更还没完成,在接收了事件的时刻的 displayState 属性的值就是 beforeDisplayState 。但在 displayStateChange 事件的情况下变更已经进行,那个时刻的 displayState 属性的值就是 afterDisplayState 。

下面来写一个例子。首先,确认程序配置文件(程序名-app.xml)的 rootContent 标签的 systemChrome 为 standard 。
Code:XML
<rootContent systemChrome="standard" transparent="false" visible="true">[SWF reference is generated]</rootContent>

下面的例子是在 applicationComplete事件里添加listener (onDispStateEvent)。在onDispStateEvent 里面 trace()输出事件信息,请用debug 方式执行。

Code: MXML
<?xml version="1.0" encoding="utf-8"?>
<mx:ApolloApplication xmlns:mx="http://www.adobe.com/2006/mxml" applicationComplete="addListeners()">
<mx:Script>
<![CDATA[
private function addListeners():void {
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGE, onDispStateEvent);
stage.window.addEventListener( NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, onDispStateEvent);
}

private function onDispStateEvent(e:NativeWindowDisplayStateEvent):void {
trace("type:", e.type, e.afterDisplayState);
}

private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
}
private function onMaxBtnClick(e:MouseEvent):void {
if (stage.window.displayState != NativeWindowDisplayState.MAXIMIZED) {

stage.window.maximize();
maxBtn.label = "v";
}else{
stage.window.restore();
maxBtn.label = "\u25A2";
}
}
private function onCloseBtnClick(e:MouseEvent):void {

stage.window.close();
}
]]>
</mx:Script>
<mx:HBox width="100%" backgroundColor="#ffffff">
<mx:Button id="minBtn" label="_" click="onMinBtnClick(event)" />
<mx:Button id="maxBtn" label='{"\u25A2"}' click="onMaxBtnClick(event)" />
<mx:Button id="closeBtn" label="X" click="onCloseBtnClick(event)" />
</mx:HBox>
<mx:HBox width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:ApolloApplication>

有人可能会注意到系统chrome的最小化/最大化按钮和窗口内的最小化/最大化按钮的事件有些差异。

由系统chrome的按钮来最大化窗口会触发 displayStateChanging 和 displayStateChange 两个事件。

但如果按了窗口内的按钮来最大化窗口,displayStateChange 事件以外的不会发生。(即 ing 事件不会发生)。

这是因为由系统chrome的按钮来最大化窗口的话,他考虑到处理实际被进行之前的对应 。为此,NativeWindow 自动地做了 displayStateChanging dispatch。

但如果按窗口内的按钮来调用 minimize()等方法,处理实际被进行之前的对应应该是可以的(在minimize()等方法里写)。为此即使调用了 minimize(), maximize(), restore(), displayStateChanging 也不自动dispatch。

如果想在 minimize()等调用后,触发 displayStateChanging 事件的话,也可以追加以下语句:

Code: Actionscript
//以minimize()为例
private function onMinBtnClick(e:MouseEvent):void {
stage.window.minimize();
var dispStateEvent:NativeWindowDisplayStateEvent = new NativeWindowDisplayStateEvent(
NativeWindowDisplayStateEvent.DISPLAY_STATE_CHANGING, true, true,
stage.window.displayState, NativeWindowDisplayState.MINIMIZED);
stage.window.dispatchEvent(dispStateEvent);
}

这样,就与由系统chrome的按钮来最大化窗口是一样的了。把程序配置文件(程序名-app.xml)的 rootContent 标签的 systemChrome 变为 none 就可以看到效果了。

未完待续。

没有评论: