Puede utilizar las propiedades y métodos de la clase NativeWindow para gestionar el aspecto, el comportamiento y el ciclo de vida de las ventanas de escritorio.
Nota:
al utilizar Flex, suele ser mejor administrar el comportamiento de la ventana utilizando las clases de la arquitectura. A la mayoría de los métodos y propiedades de NativeWindow se puede acceder mediante las clases mx:WindowedApplication y mx:Window.
Obtención de una instancia de NativeWindow
Para poder manipular una ventana, primero es necesario obtener la instancia de la ventana. Puede obtener una instancia de ventana de uno de los lugares siguientes:
-
El constructor de ventanas nativas utilizado para crear la ventana:
var win:NativeWindow = new NativeWindow(initOptions);
-
Propiedad
nativeWindow
del escenario de la ventana:
var win:NativeWindow = stage.nativeWindow;
-
Propiedad
stage
de un objeto de visualización en la ventana:
var win:NativeWindow = displayObject.stage.nativeWindow;
-
Propiedad
target
de un evento de ventana nativa distribuido por la ventana:
private function onNativeWindowEvent(event:NativeWindowBoundsEvent):void
{
var win:NativeWindow = event.target as NativeWindow;
}
-
Propiedad
nativeWindow
de una página HTML mostrara en la ventana:
var win:NativeWindow = htmlLoader.window.nativeWindow;
-
Propiedades
activeWindow
y
openedWindows
del objeto NativeApplication:
var nativeWin:NativeWindow = NativeApplication.nativeApplication.activeWindow;
var firstWindow:NativeWindow = NativeApplication.nativeApplication.openedWindows[0];
NativeApplication.nativeApplication.activeWindow
hace referencia a la ventana activa de una aplicación (pero devuelve
null
si la ventana activa no es una ventana de esta aplicación de AIR). El conjunto
NativeApplication.nativeApplication.openedWindows
contiene todas las ventanas de una aplicación de AIR que no se han cerrado.
Dado que los objetos Application, WindowedApplication y Window de Flex son objetos de visualización a los que es muy sencillo hacer referencia a la ventana de aplicación desde un archivo MXML mediante la propiedad
stage
, como puede verse a continuación:
<?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
Nota:
hasta que se añade el componente WindowedApplication o Window al escenario de la ventana por la arquitectura de Flex, la propiedad
stage
del componente es
null
. Este comportamiento es coherente con el del componente Application de Flex, pero no significa que sea imposible acceder al escenario o a la instancia de NativeWindow en detectores de eventos anteriores al ciclo de inicialización de los componentes WindowedApplication y Window, por ejemplo,
creationComplete
. Es seguro acceder al escenario y a la instancia de NativeWindow cuando se distribuye el evento
applicationComplete
.
Activación, visualización y ocultación de ventanas
Para activar una ventana, llame al método
activate()
de NativeWindow. Al activar una ventana, esta se visualiza en primer plano, recibe la selección del teclado y del ratón y, si es necesario, se hace visible restaurando la ventana o estableciendo la propiedad
visible
como
true
. Cuando se activa una ventana, esta no cambia el orden del resto de ventanas de la aplicación. Si se llama al método
activate()
, la ventana distribuye un evento
activate
.
Para mostrar una ventana oculta sin activarla, establezca la propiedad
visible
como
true
. Esto llevará la ventana al primer plano, pero no recibirá la selección.
Para ocultar la visibilidad de una ventana, establezca su propiedad
visible
como
false
. Al ocultar una ventana, se suprime la visualización de la ventana, de los iconos relacionados de la barra de tareas y, en Mac OS X, la entrada del menú Ventana.
Cuando se cambia la visibilidad de una ventana, la visibilidad de cualquier ventana contenida en esa ventana también cambia. Por ejemplo, si se oculta una ventana, todas sus ventanas incluidas también se ocultan.
Nota:
en Mac OS X, no es posible ocultar por completo una ventana minimizada que tenga un icono en la parte de venta del dock. Si la propiedad
visible
se establece como
false
en una ventana minimizada, el icono del Dock de dicha ventana sigue visualizándose. Si el usuario hace clic en el icono, la ventana se restaura con su estado visible y aparece en la pantalla.
Cambio del orden de visualización de las ventanas
AIR proporciona varios métodos para poder cambiar directamente el orden de visualización de las ventanas. Puede colocar una ventana delante del orden de visualización o detrás, mover una ventana encima de otra o detrás. Al mismo tiempo, el usuario puede reordenar las ventanas activándolas.
Puede mantener una ventana delante del resto si establece su propiedad
alwaysInFront
como
true
. Si hay más de una ventana con este ajuste, el orden de visualización de las ventanas se ajustará entre sí, pero siempre se visualizarán delante de ventanas que tengan la propiedad
alwaysInFront
como false.
Las ventanas del grupo superior también se visualizan sobre el resto de las aplicaciones, incluso si la aplicación de AIR no está activa. Como este comportamiento no es el habitual del resto de usuarios, solo se debe establecer
alwaysInFront
como
true
cuando sea realmente necesario. Entre los ejemplos de usos justificados se incluyen:
-
Ventanas emergentes temporales para controles como sugerencias, listas, menús personalizados o cuadros combinados. Como estas ventanas se cierran cuando dejan de recibir la selección, está justificado el comportamiento para evitar que el usuario no pueda ver las ventanas.
-
Mensajes de error y alertas realmente importantes. Si se produce un cambio irrevocable y el usuario no responde a tiempo, está justificado el comportamiento para poner la alerta en primer plano. Sin embargo, la mayoría de los errores y alertas se pueden gestionar con el orden de visualización normal de las ventanas.
-
Ventanas temporales superpuestas.
Nota:
AIR no obliga a utilizar la propiedad
alwaysInFront
correctamente. Si embargo, si su aplicación no se ajusta al flujo normal del resto de usuarios, es muy probable que termine en la papelera de reciclaje.
Si una ventana contiene otras ventanas, estas siempre se ordenan frente a la misma. Si se llama a
orderToFront()
o se establece
alwaysInFront
en
true
en una ventana que incluya otra ventana, las ventanas incluidas se reordenan junto con la ventana propietaria frente a las demás ventanas, pero las ventanas incluidas aún se muestran frente a la propietaria.
La llamada a los métodos de ordenación de ventanas en las ventanas incluidas funciona normalmente entre las ventanas contenidas en la misma ventana, pero también se puede cambiar el orden de todo el grupo de ventanas incluidas en comparación con las ventanas fuera de ese grupo. Por ejemplo, si se llama a
orderToFront()
en una ventana incluida, tanto esa ventana como su propietaria y cualquier otra ventana incluida por la misma propietaria, se mueven a la parte frontal del orden de visualización de ventanas.
La clase NativeWindow proporciona las siguientes propiedades y métodos para establecer el orden de visualización de una ventana con respecto a otras:
Miembro
|
Descripción
|
Propiedad alwaysInFront
|
Especifica si la ventana se muestra en el grupo superior de ventanas.
En casi todos los casos, el mejor ajuste es
false
. Si cambia el valor de
false
a
true
, la ventana se coloca delante del resto (aunque no se activa). Si cambia el valor de
true
a
false
, la ventana se coloca detrás del resto de ventanas del grupo superior, aunque delante del resto de ventanas. Si no cambia la propiedad de la ventana, tampoco cambia su orden de visualización.
La configuración
alwaysInFront
no se aplica a las ventanas incluidas por otra ventana.
|
orderToFront()
|
Trae la ventana al frente.
|
orderInFrontOf()
|
Coloca la ventana directamente delante de una ventana concreta.
|
orderToBack()
|
Envía la ventana detrás del resto de ventanas.
|
orderBehind()
|
Envía la ventana directamente detrás de una ventana concreta.
|
activate()
|
Coloca la ventana en primer plano, la hace visible y le asigna la selección.
|
Nota:
si una ventana está oculta (
visible
es
false
) o minimizada, llamar a los métodos de orden de visualización no produce ningún efecto.
En el sistema operativo Linux, los diferentes administradores de ventana aplican reglas distintas relacionadas con el orden de visualización de la ventana:
-
En algunos administradores, las ventanas de utilidades siempre se muestran delante de las ventanas normales.
-
En algunos administradores de ventanas, una ventana de pantalla completa con
alwaysInFront
establecido en
true
, siempre se muestra delante de otras ventanas que también tienen el valor
alwaysInFront
definido como
true
.
Cómo cerrar una ventana
Para cerrar una ventana, utilice el método
NativeWindow.close()
.
Al cerrar la ventana, se descarga su contenido, pero si otros objetos tienen referencias a él, este no se elimina. El método
NativeWindow.close()
se ejecuta de forma asíncrona y la aplicación contenida en la ventana se sigue ejecutando durante el proceso de cierre. El método close distribuye un evento close una vez finalizada la operación de cierre. El objeto NativeWindow sigue siendo técnicamente válido, aunque al intentar acceder a la mayoría de propiedades y métodos de una ventana cerrada, se genera un error IllegalOperationError. No es posible volver a abrir una ventana cerrada. Verifique la propiedad
closed
de una ventana para ver si se ha cerrado o no. Simplemente para ocultar la visibilidad de una ventana, establezca la propiedad
NativeWindow.visible
como
false
.
Si la propiedad
Nativeapplication.autoExit
es
true
(valor predeterminado), la aplicación se cerrará al cerrarse la última ventana.
Cualquier ventana que tenga una propietaria, se cierra cuando la propietaria se cierra. Las ventanas contenidas no distribuyen un evento de cierre y, por lo tanto, no pueden evitarlo. Se distribuye un evento close.
Permiso para cancelar operaciones con ventanas
Si una ventana utiliza fondo cromático del sistema, es posible cancelar la interacción con el usuario que esté detectando cancelar el comportamiento predeterminado de los eventos adecuados. Por ejemplo, cuando un usuario hace clic en el botón para cerrar el fondo cromático del sistema, se distribuye el evento
closing
. Si algún detector registrado llama al método
preventDefault()
del evento, la ventana no se cierra.
Si una ventana no utiliza fondo cromático, los eventos de notificación de cambios intencionados no se distribuyen automáticamente antes del cambio. Por ello, si llama a métodos para cerrar una ventana, para cambiar su estado o para definir las propiedades de su contorno, el cambio no se puede cancelar. Para avisar a los componentes de la aplicación antes de que se realice un cambio de ventana, la lógica de la aplicación puede distribuir el evento de notificación correspondiente mediante el método
dispatchEvent()
de la ventana.
Por ejemplo, la siguiente lógica implementa un controlador de eventos cancelable para un botón de cierre de una ventana:
public function onCloseCommand(event:MouseEvent):void{
var closingEvent:Event = new Event(Event.CLOSING,true,true);
dispatchEvent(closing);
if(!closingEvent.isDefaultPrevented()){
win.close();
}
}
El método
dispatchEvent()
devuelve
false
si un detector llama al método
preventDefault()
del evento. No obstante, también puede devolver
false
por otros motivos. Por ello, es mejor utilizar explícitamente el método
isDefaultPrevented()
para probar si se debe cancelar o no el cambio.
Maximización, minimización y restauración de una ventana
Para maximizar la ventana, utilice el método
maximize()
de NativeWindow.
myWindow.maximize();
Para minimizar la ventana, utilice el método
minimize()
de NativeWindow.
myWindow.minimize();
Para restaurar la ventana (es decir, hacer que recupere el tamaño que tenía antes de maximizarla o minimizarla), utilice el método
restore()
de NativeWindow.
myWindow.restore();
Una venta que tenga una propietaria se minimiza y se restaura cuando la ventana propietaria se minimice o se restaure. La ventana incluida no distribuye eventos cuando se minimiza, ya que su propietaria también se minimiza.
Nota:
el comportamiento resultante de maximizar una ventana de AIR es distinto al comportamiento estándar de Mac OS X. En vez de alternar entre el tamaño “estándar” definido por la aplicación y el último tamaño establecido por el usuario, las ventanas de AIR alternan entre el último tamaño establecido por la aplicación y el tamaño completo utilizable de la pantalla.
En el sistema operativo Linux, los diferentes administradores de ventana aplican reglas distintas relacionadas con la configuración del estado de visualización de la ventana:
-
En algunos administradores, las ventanas de utilidades no se puede maximizar.
-
Si se define un tamaño máximo para la ventana, algunas ventanas no permiten que se maximice una ventana. Otros administradores de ventanas establecen el estado de visualización como maximizado, pero no cambian el tamaño de la ventana. En cualquier caso, no se distribuye ningún evento de cambio de estado de visualización.
-
Algunos administradores de ventanas no aceptan la configuración
maximizable
o
minimizable
de la ventana.
Nota:
en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si se cambia el estado de visualización en una línea del programa y se lee el valor en la siguiente, el valor leído aún reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento
displayStateChange
cuando cambia el estado de visualización. Si se necesita realizar alguna operación en función del nuevo estado de la ventana, siempre se debe llevar a cabo en un controlador de eventos
displayStateChange
. Consulte
Detección de eventos de ventanas
.
Ejemplo: Minimizar, maximizar, restaurar y cerrar una ventana
La siguiente aplicación corta de MXML muestra los métodos
maximize()
,
minimize()
,
restore()
y
close()
de Window:
<?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>
El siguiente ejemplo de ActionScript para Flash crea cuatro campos de texto en los que se puede hacer clic y que activan los métodos
minimize()
,
maximize()
,
restore()
y
close()
de NativeWindow:
package
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
public class MinimizeExample extends Sprite
{
public function MinimizeExample():void
{
var minTextBtn:TextField = new TextField();
minTextBtn.x = 10;
minTextBtn.y = 10;
minTextBtn.text = "Minimize";
minTextBtn.background = true;
minTextBtn.border = true;
minTextBtn.selectable = false;
addChild(minTextBtn);
minTextBtn.addEventListener(MouseEvent.CLICK, onMinimize);
var maxTextBtn:TextField = new TextField();
maxTextBtn.x = 120;
maxTextBtn.y = 10;
maxTextBtn.text = "Maximize";
maxTextBtn.background = true;
maxTextBtn.border = true;
maxTextBtn.selectable = false;
addChild(maxTextBtn);
maxTextBtn.addEventListener(MouseEvent.CLICK, onMaximize);
var restoreTextBtn:TextField = new TextField();
restoreTextBtn.x = 230;
restoreTextBtn.y = 10;
restoreTextBtn.text = "Restore";
restoreTextBtn.background = true;
restoreTextBtn.border = true;
restoreTextBtn.selectable = false;
addChild(restoreTextBtn);
restoreTextBtn.addEventListener(MouseEvent.CLICK, onRestore);
var closeTextBtn:TextField = new TextField();
closeTextBtn.x = 340;
closeTextBtn.y = 10;
closeTextBtn.text = "Close Window";
closeTextBtn.background = true;
closeTextBtn.border = true;
closeTextBtn.selectable = false;
addChild(closeTextBtn);
closeTextBtn.addEventListener(MouseEvent.CLICK, onCloseWindow);
}
function onMinimize(event:MouseEvent):void
{
this.stage.nativeWindow.minimize();
}
function onMaximize(event:MouseEvent):void
{
this.stage.nativeWindow.maximize();
}
function onRestore(event:MouseEvent):void
{
this.stage.nativeWindow.restore();
}
function onCloseWindow(event:MouseEvent):void
{
this.stage.nativeWindow.close();
}
}
}
Cambio de tamaño y desplazamiento de una ventana
Si una ventana utiliza fondo cromático del sistema, este proporciona controles de arrastre para cambiar el tamaño de la ventana y moverla por el escritorio. Si una ventana no utiliza fondo cromático del sistema, deberá añadir sus propios controles para que el usuario pueda cambiarla de tamaño o desplazarla.
Nota:
para cambiar el tamaño de una ventana, primero debe obtener una referencia a la instancia de NativeWindow. Para obtener más información sobre cómo obtener una referencia a la ventana, consulte
Obtención de una instancia de NativeWindow
.
Cambio de tamaño de una ventana
Para que un usuario pueda cambiar el tamaño de una ventana de forma interactiva, utilice el método
startResize()
de NativeWindow. Si se llama a este método desde un evento
mouseDown
, la operación de cambio de tamaño corre a cargo del ratón y finaliza cuando el sistema operativo recibe un evento
mouseUp
. Cuando se llama a
startResize()
, se transfiere un argumento que especifica el borde y la esquina desde los que se puede cambiar el tamaño de la ventana.
Para establecer el tamaño de la ventana mediante programación, defina las propiedades de la ventana
width
,
height
o
bounds
con las dimensiones deseadas. Si se establecen los límites, la posición y el tamaño de la ventana se pueden modificar al mismo tiempo. Sin embargo, no se puede garantizar el orden en que suceden los cambios. Algunos administradores de ventanas de Linux no permiten que las ventanas se amplíen fuera de los límites de la pantalla del escritorio. En estos casos, el tamaño final de la ventana puede estar limitado debido al orden en que se establecen las propiedades, aunque con el resultado goblal de los cambios se podría haber obtenido una ventana válida. Por ejemplo, si se modifica la altura y la posición y de una ventana junto a la parte inferior de la pantalla, puede que no se produzca el cambio completo de altura cuando se aplique el cambio de altura antes del cambio de posición y.
Nota:
en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si cambia el tamaño de una ventana en una línea del programa y lee las dimensiones en la siguiente, aún se reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento
resize
cuando se cambia el tamaño de la ventana. Si se necesita realizar alguna operación, como distribuir controles en la ventana, en función del nuevo tamaño o estado de la ventana, siempre se debe llevar a cabo en un controlador de eventos
resize
. Consulte
Detección de eventos de ventanas
.
El modo de escala del escenario determina cómo se comporta el escenario de la ventana y su contenido cuando se cambia la ventana de tamaño. No olvide que los modos de escala del escenario están diseñados para situaciones (como un navegador web) en las que la aplicación no controla el tamaño ni la relación de aspecto de la visualización. En general, los mejores resultados se obtienen estableciendo la propiedad
scaleMode
como
StageScaleMode.NO_SCALE
. Si quiere escalar también el contenido de la ventana, debe establecer los parámetros
scaleX
y
scaleY
del contenido como respuesta a los cambios de los límites de la ventana.
Desplazamiento de una ventana
Para desplazar una ventana sin cambiar su tamaño, utilice el método
startMove()
de NativeWindow. Al igual que el método
startResize()
, cuando se llama a
startMove()
desde un evento
mouseDown
, el proceso de desplazamiento corre a cargo del ratón y finaliza cuando el sistema operativo recibe un evento
mouseUp
.
Para obtener más información sobre los métodos
startResize()
y
startMove()
, consulte
Referencia de ActionScript 3.0 para la plataforma de Adobe Flash
.
Para mover una ventana mediante programación, establezca las propiedades
x
,
y
o
bounds
de la ventana en la posición deseada. Si se establecen los límites, la posición y el tamaño de la ventana se pueden modificar al mismo tiempo.
Nota:
en Linux, las propiedades de la ventana se modifican de forma asincrónica. Si se mueve una ventana en una línea del programa y se lee la posición en la siguiente, el valor leído aún reflejará la configuración anterior. En todas las plataformas, el objeto NativeWindow distribuye el evento
move
cuando cambia la posición. Si se necesita realizar alguna operación en función de la nueva posición de la ventana, siempre se debe llevar a cabo en un controlador de eventos
move
. Consulte
Detección de eventos de ventanas
.
Ejemplo: Cambio de tamaño y desplazamiento de ventanas
El siguiente ejemplo muestra como iniciar el campo de tamaño y las operaciones de desplazamiento de una ventana:
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();
}
}
}
|
|
|