管理窗口



使用 NativeWindow 类的属性和方法可管理桌面窗口的外观、行为和生命周期。

获取 NativeWindow 实例

若要操作窗口,必须首先获取窗口实例。可以从以下任一位置获取窗口实例:

window 构造函数
即,新 NativeWindow 的 window 构造函数。

窗口舞台
stage.nativeWindow

舞台上的任何显示对象
myDisplayObject.stage.nativeWindow

窗口事件
事件对象的 target 属性引用调度该事件的窗口。

HTMLLoader 或 HTML 窗口的全局 nativeWindow 属性
window.nativeWindow

nativeApplication 对象
NativeApplication.nativeApplication.activeWindow 引用应用程序的活动窗口(但如果该活动窗口不是此 AIR 应用程序的窗口,则返回 null)。NativeApplication.nativeApplication.openedWindows 数组包含 AIR 应用程序中尚未关闭的所有窗口。

由于 Flex Application、WindowedApplication 和 Window 对象是显示对象,因此可以轻松地使用 stage 属性在 MXML 文件中引用应用程序窗口,如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<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
注: 在 Flex 框架将 WindowedApplication 或 Window 组件添加到窗口舞台后,该组件的 stage 属性为 null。此行为与 Flex Application 组件的行为一致,但并不意味着不能访问舞台或 WindowedApplication 和 Window 组件初始化周期中较早出现事件(例如 creationComplete)的侦听器中的 NativeWindow 实例。在调度 applicationComplete 事件后,访问舞台和 NativeWindow 实例是安全的。

激活、显示和隐藏窗口

若要激活窗口,请调用 NativeWindow activate() 方法。激活窗口会将该窗口置于前面,为其提供键盘和鼠标焦点,并在必要时通过还原窗口或将 visible 属性设置为 true 来使其可见。激活窗口不会更改应用程序中其它窗口的顺序。调用 activate() 方法会导致窗口调度 activate 事件。

若要在不激活的情况下显示隐藏窗口,请将 visible 属性设置为 true。此操作使该窗口置于前面,但不会向它分配焦点。

若要从视图中隐藏窗口,请将其 visible 属性设置为 false。隐藏窗口会禁止窗口和任何相关任务栏图标的显示,并且会在 Mac OS X 中禁止 Windows 菜单中条目的显示。

注: 在 Mac OS X 中,不可能完全隐藏具有停靠栏图标的最小化窗口。如果最小化窗口上的 visible 属性设置为 false,则仍然显示该窗口的停靠栏图标。如果用户单击该图标,则会将该窗口还原为可见状态并显示该窗口。

更改窗口显示顺序

AIR 提供几种方法来直接更改窗口的显示顺序。可以将窗口的显示顺序向前或向后移动;可以将窗口移动到其它窗口的前面或后面。同时,用户可以通过激活窗口来对窗口进行重新排序。

可以通过将窗口的 alwaysInFront 属性设置为 true 来使该窗口位于其它窗口的前面。如果多个窗口都具有此设置,则这些窗口的显示顺序是它们相互之间的排序顺序,而且它们始终排序在 alwaysInFront 设置为 false 的窗口前面。即使 AIR 应用程序未处于活动状态,最上面组中的窗口也显示在其它应用程序中窗口的前面。由于此行为会阻碍用户查看其它窗口,因此应仅在必要和适当时才能将 alwaysInFront 设置为 true。经调整的使用示例包括:

  • 控件(例如工具提示、弹出列表、自定义菜单或组合框)的临时弹出窗口。由于这些窗口在失去焦点后将关闭,因此可以避免阻碍用户查看其它窗口的不便。

  • 极其紧急的错误消息和警告。在可能发生不可撤销的更改时,如果用户未及时响应,则可能调整为将警告窗口置于最前面。但是,可以按正常的窗口显示顺序处理大多数错误消息和警告。

  • 短期弹出式窗口。

注: AIR 不强制要求 alwaysInFront 属性的正确使用。但是,如果应用程序打断了用户的工作流,则可能将其传递到同一用户的垃圾桶。

NativeWindow 类提供以下属性和方法来设置一个窗口相对于其它窗口的显示顺序:

成员

说明

alwaysInFront 属性

指定窗口是否显示在最上面的窗口组中。

几乎在所有情况下,false 都是最佳设置。将值从 false 更改为 true 会将窗口置于所有其它窗口的前面(但不会激活该窗口)。将值从 true 更改为 false 会将窗口的顺序排在最上面组中其余窗口的后面,但仍位于其它窗口的前面。将窗口的该属性设置为其当前值不会更改窗口显示顺序。

orderToFront()

将窗口置于前面。

orderInFrontOf()

将窗口置于紧靠特定窗口前面。

orderToBack()

将窗口发送到其它窗口后面。

orderBehind()

将窗口发送到紧靠特定窗口后面。

activate()

将窗口置于前面(同时使该窗口可见并分配焦点)。

注: 如果窗口处于隐藏(visiblefalse)或最小化状态,则调用显示顺序方法无效。

关闭窗口

若要关闭窗口,请使用 NativeWindow.close() 方法。

关闭窗口会卸载该窗口的内容,但如果其它对象引用了此内容,则不会破坏内容对象。NativeWindow.close() 方法以异步方式执行,该窗口中包含的应用程序在关闭过程中继续运行。该 close 方法在关闭操作完成时调度 close 事件。从技术角度而言,NativeWindow 对象仍然有效,但访问已关闭窗口上的大多数属性和方法会生成 IllegalOperationError。不能重新打开已关闭窗口。检查窗口的 closed 属性以测试窗口是否已关闭。若要仅从视图中隐藏窗口,请将 NativeWindow.visible 属性设置为 false

如果 Nativeapplication.autoExit 属性为 true(默认情况),则应用程序在其最后一个窗口关闭后退出。

允许取消窗口操作

在窗口使用系统镶边时,可以通过侦听和取消相应事件的默认行为来取消用户与该窗口的交互。例如,在用户单击系统镶边关闭按钮后,将调度 closing 事件。如果任何已注册的侦听器调用了事件的 preventDefault() 方法,则该窗口不会关闭。

在窗口不使用系统镶边时,不会在执行预期更改之前自动调度这些更改的通知事件。因此,如果调用关闭窗口、更改窗口状态的方法,或者设置任何窗口范围属性,则无法取消更改。若要在执行窗口更改前通知应用程序中的组件,则应用程序逻辑可以使用窗口的 dispatchEvent() 方法调度相关的通知事件。

例如,以下逻辑实现窗口关闭按钮的可取消事件处理函数:

public function onCloseCommand(event:MouseEvent):void{ 
    var closingEvent:Event = new Event(Event.CLOSING,true,true); 
    dispatchEvent(closing); 
    if(!closingEvent.isDefaultPrevented()){ 
        win.close(); 
    } 
} 

如果侦听器调用事件的 preventDefault() 方法,则 dispatchEvent() 方法返回 false。但是,由于其它原因,它还可以返回 false,因此最好显式使用 isDefaultPrevented() 方法来测试是否应取消更改。

最大化、最小化和还原窗口

若要最大化窗口,请使用 NativeWindow maximize() 方法。

myWindow.maximize(); 

若要最小化窗口,请使用 NativeWindow minimize() 方法。

myWindow.minimize(); 

若要还原窗口(即,使其返回最小化或最大化操作之前的大小),请使用 NativeWindow restore() 方法。

myWindow.restore(); 
注: 最大化 AIR 窗口导致的行为与 Mac OS X 标准行为不同。AIR 窗口不是在应用程序定义的“标准”大小和用户最后设置的大小之间切换,而是在应用程序或用户最后设置的大小和屏幕的完整可用区域之间切换。

示例:最小化、最大化、还原和关闭窗口

以下简短的 MXML 应用程序演示 Window maximize()minimize()restore()close() 方法:

<?xml version="1.0" encoding="utf-8"?> 
 
<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 实例的引用。有关如何获取窗口引用的信息,请参阅获取 NativeWindow 实例

调整窗口大小

若要调整窗口大小,请使用 NativeWindow startResize() 方法。如果此方法是从 mouseDown 事件中调用的,则调整大小操作由鼠标驱动并在操作系统收到 mouseUp 事件时完成。在调用 startResize() 时,传入用于指定所调整窗口大小的起始边或角的参数。

舞台的缩放模式确定调整窗口大小时窗口舞台及其内容的行为方式。请记住,舞台缩放模式旨在用于应用程序不控制其显示区大小或高宽比的情况,例如 Web 浏览器。通常,通过将舞台的 scaleMode 属性设置为 StageScaleMode.NO_SCALE 来获得最佳效果。如果希望缩放窗口的内容,则仍然可以设置 scaleXscaleY 参数以响应窗口范围更改。

移动窗口

若要移动窗口而不调整其大小,请使用 NativeWindow startMove() 方法。与 startResize() 方法相似,在从 mouseDown 事件调用 startMove() 方法时,移动过程由鼠标驱动并在操作系统收到 mouseUp 事件时完成。

有关 startResize()startMove() 方法的详细信息,请参阅 Flex 3 语言参考 (http://www.adobe.com/go/learn_flex3_aslr_cn)

示例:调整窗口大小和移动窗口

以下示例说明如何对窗口启动调整大小和移动操作:

package 
{ 
    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 start the 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 start the 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(); 
        } 
    } 
}