控制窗体
这一章节讨论如何使用NativeWindow类的属性和方法控制应用程序窗体的外观和行为。
得到NativeWindow实例
要想操作窗体,必须先得到窗体实例,可在下面这些地方得到窗体实例:
窗体构造函数
也就是新建NativeWindow所用的构造函数.
窗体的stage
也就是stage.nativeWindow
任何可视化对象的stage
也就是myDisplayObject.stage.nativeWindow.
窗体事件
Event对象的target属性指向窗体引用
HTMLControl或HTML窗体的全局属性nativeWindow
也就是window.nativeWindow.
Shell 对象
Shell.shell.activeWindow 指向应用程序的活动窗体(激活状态,如果没有任何窗体处于激活状态则返回null)。Shell.shell.openedWindows数组包含应用程序中所有未被打开的窗体。
因为Flex Application, WindowedApplication, 和Window 对象都是可视化对象,我们可以很容易通过stage属性得到窗体引用:
< mx:WindowedApplication xmlns:mx ="http://www.adobe.com/2006/mxml" applicationComplete ="init();" >
< mx:Script >
<![CDATA[
import flash.display.NativeWindow;
public function init():void{
var appWindow:NativeWindow = this.stage.nativeWindow;
//set window properties
appWindow.visible = true;
}
]]>
</ mx:Script >
</ WindowedApplication >
激活,显示,隐藏窗体
调用NativeWindow.activate()方法激活一个窗体,激活窗体后将使窗体显示在最顶层,开始获得键盘和鼠标焦点,如果有必要可恢复window的visible属性或设置visible=true,激活一个窗体并不会改变其他窗体的顺序。
要想显示没有激活的隐藏窗体,可设置其visible属性为true,这将使窗体显示在最顶层,但是由于未激活,不能接收键盘和鼠标反应。
要隐藏窗体,可设置NativeWindow.visible属性为false。隐藏一个窗体将取消窗体的显示以及相关的任何栏图标。
最大化,最小化和还原窗体
使用NativeWindow.maximize()方法使窗体最大化显示
myWindow.maximize();
使用NativeWindow.minimize()方法使窗体最小化显示
myWindow.minimize();
还原一个窗体指恢复到最大化和最小化之前的状体。
myWindow.restore();
改变窗体显示顺序
AIR为窗体提供两组显示顺序,由alwaysInFront 属性进行控制。通过设置alwaysInFront=false,意思是把窗体放在正规的组群众,大多数窗体都放在这里。而第二个组群所放的窗体总是显示在正规组群窗体的上层。如果没有这个特殊组群的话,改变窗体顺序将会显得非常混乱,下列情况都将用到这个窗体组群:
l 临时的弹出式窗体,比如提示框,弹出式列表,自定义菜单或组合框,因为这些窗体用完即关闭。
l 屏幕保护
l 一些急需的错误信息框
l 生命周期很短的窗体
l 游戏或视频的全屏窗体
NativeWindow类提供下列方法用于设置窗体之间的显示顺序:
alwaysInFront 属性
指定使用哪个窗体组,一般情况下alwaysInFront=false ,如果设为true,这表示所有窗体都处于顶层位置(只是没有激活),如果在设为false,表示把窗体放入正规组的顶层(但是仍在顶层组的后面)。设置该值并不会改变窗体的顺序。
orderToFront()
设置该窗体为组群中最前
orderInFrontOf()
设置该窗体排在某窗体之前
orderToBack()
设置该窗体为组群中最后
orderBehind()
设置该窗体排在某窗体之后
注意:如果该窗体被隐藏或最小化,调用这些方法将无效。
关闭窗体
使用NativeWindow.close方法关闭窗体
关闭一个窗体将卸载该窗体所包含的内容,不过如果还有其他对象引用这些内容,将不会被销毁。NativeWindow.close()方法的执行是异步的,应用程序仍然在关闭窗体过程中继续运行,当关闭完成时,该close方法将触发一个close事件。窗体被关闭后将无法访问其大部分属性和方法,否则会抛出IllegalOperationError异常,关闭的窗体将不能再次打开,可通过closed属性检测窗体是否已被关闭。要简单的隐藏窗体,只要设置其visible属性为false就可以了。
如果Shell.autoExit属性为true(默认设置),当应用程序的所有窗体都关闭后,程序也将停止运行。
允许撤销对窗体的操作
当窗体使用操作系统窗体风格,用户与窗体的交互可通过一些事件进行取消,比如说,单用户点击一个窗体上系统菜单的关闭按钮,这closing事件将被触发,任何注册的监听器调用preventDefault()方法可以取消关闭窗体。
如果窗体不使用系统窗体风格,这需要手动出发相应的事件。如果你调用一个方法要关闭窗体或改变窗体大小或设置bounds属性,这些改变将不能被取消,除非在窗体发生变化之前通知应用程序,应用程序逻辑通过dispatchEvent()发出相关的事件。
看下面的例子,下面的逻辑实现了可取消的窗体关闭按钮。:
var closingEvent:Event = new Event(Event.CLOSING,true,true);
dispatchEvent(closing);
if(!closingEvent.isDefaultPrevented()){
win.close();
}
}
注意:如果事件的preventDefault() 方法被监听器调用,则dispatchEvent()方法返回false,但是也有其他原因可能返回false,所以最好的办法是使用isDefaultPrevented()方法检测是否已经取消操作。
例子:最小化,最大化,还原和关闭窗体
下面的这段代码演示窗体的maximize(), minimize(), restore(), 和close() 方法。
< mx:WindowedApplication
xmlns:mx ="http://www.adobe.com/2006/mxml"
layout ="vertical" >
< mx:Script >
<![CDATA[
public function minimizeWindow():void
{
this.stage.nativeWindow.minimize();
}
public function maximizeWindow():void
{
this.stage.nativeWindow.maximize();
}
public function restoreWindow():void
{
this.stage.nativeWindow.restore();
}
public function closeWindow():void
{
this.stage.nativeWindow.close();
}
]]>
</ mx:Script >
< mx:VBox >
< mx:Button label ="Minimize" click ="minimizeWindow()" />
< mx:Button label ="Restore" click ="restoreWindow()" />
< mx:Button label ="Maximize" click ="maximizeWindow()" />
< mx:Button label ="Close" click ="closeWindow()" />
</ mx:VBox >
</ mx:WindowedApplication >
例子:改变大小和移动窗体
使用NativeWindow.startResize()方法改变窗体大小,该方法实际上是触发系统控制功能来改变窗体大小。当该方法在mouseDown 事件里调用时,大小改变是由鼠标确定的,当系统接收到mouseUp事件则停止大小调整。
如果不改变大小只移动窗体,可使用NativeWindow.startMove()方法,和startResize()方法一样,当startMove()方法mouseDown 事件里调用时,窗体移动过程是由鼠标确定的,直到系统接收到鼠标的mouseUp事件。
下面的这个例子演示如何初始化改变窗体大小和移动窗体操作:
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.display.NativeWindowResize;
public class NativeWindowResizeExample extends Sprite
{
public function NativeWindowResizeExample():void
{
// Fills a background area.
this.graphics.beginFill(0xFFFFFF);
this.graphics.drawRect(0, 0, 400, 300);
this.graphics.endFill();
// Creates a square area where a mouse down will trigger a resize.
var resizeHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, this.height - 20);
resizeHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartResize);
// Creates a square area where a mouse down will trigger a move.
var moveHandle:Sprite = createSprite(0xCCCCCC, 20, this.width - 20, 0);
moveHandle.addEventListener(MouseEvent.MOUSE_DOWN, onStartMove);
}
public function createSprite(color:int, size:int, x:int, y:int):Sprite
{
var s:Sprite = new Sprite();
s.graphics.beginFill(color);
s.graphics.drawRect(0, 0, size, size);
s.graphics.endFill();
s.x = x;
s.y = y;
this.addChild(s);
return s;
}
public function onStartResize(event:MouseEvent):void
{
this.stage.nativeWindow.startResize(NativeWindowResize.BOTTOM_RIGHT);
}
public function onStartMove(event:MouseEvent):void
{
this.stage.nativeWindow.startMove();
}
}
}