skip to main |skip to sidebar

2007-04-27

NativeWindow 类的事件详解2

displayStateChanging 的取消

NativeWindow 类的事件详解1里也提到,ing系的事件是可以取消的。比如取消 displayStateChanging 事件就意味着不变更 displayState,也就是说不进行最大化/最小化。

在AS3里,标准的取消事件方法是调用preventDefault()。如果直接使用上次的例子的话,只需要在onDispStateEvent()里加上preventDefault()。

因为onDispStateEvent()方法是displayStateChange和displayStateChanging两个事件共用了的,所以有可能events是不可取消的displayStateChange事件。所以需要判断是哪一个事件:

Code:Actionscript
private function onDispStateEvent(e:NativeWindowDisplayStateEvent):void {
  if (e.cancelable) { // 检测是否可以取消
    e.preventDefault(); // 取消事件
  }
  trace("type:", e.type, e.afterDisplayState);
}

执行后,就会发现系统窗口的按钮会没反应,但程序里的按钮却照常不误。并且如果在程序里的按钮事件里触发displayStateChanging事件的话,程序里的按钮就与系统窗口的按钮动作一样了。

NativeWindowBoundsEvent

如果NativeWindow的bounds属性被变更,就会触发NativeWindowBoundsEvent。bounds被触发的情况是窗口的大小或位置被改变时。

NativeWindowBoundsEvent拥有beforeBounds和afterBounds属性,分别指变更前和变更后的值。ing系(moving,resizing)事件的beforeBounds为当前值,完成通知(move,resize)事件的afterBounds为当前值。

与NativeWindowDisplayStateEvent一样,move和resize事件会在任何条件下触发,但moving和resizing不会在代码里触发,只会在用鼠标拖动系统窗口等条件下触发。

注意,在Stage类里也有一个resize事件,这是在画面的大小发生改变,重画时触发的。

以下是测试NativeWindowBoundsEvent的例子。

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( NativeWindowBoundsEvent.RESIZE, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.RESIZING, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.MOVE, onBoundsEvent);
      stage.window.addEventListener( NativeWindowBoundsEvent.MOVING, onBoundsEvent);
    }
    private function onBoundsEvent(e:NativeWindowBoundsEvent):void {
      trace("type:", e.type, e.afterBounds);
    }
    private function onBoxMouseDown(e:MouseEvent):void {
      stage.window.startResize( NativeWindowResize.BOTTOM_RIGHT);
    }
    private function onBarMouseDown(e:MouseEvent):void {
      stage.window.startMove();
    }
    ]]>
  </mx:Script>
  <mx:HBox mouseDown="onBarMouseDown(event)" width="100%" height="24" backgroundColor="#ffffff"/>
  <mx:HBox mouseDown="onBoxMouseDown(event)" width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:ApolloApplication>

close与closing事件

这是关闭窗口时触发的事件。事件类型为flash.events.Event。

closing是在关闭前,close是在关闭后触发。如果取消closing事件,窗口将不会被关闭。其余与NativeWindowBoundsEvent的触发方式一样,在这里就不重复了。

(完)

没有评论: