Ejemplos usando el Api de windows para Visual basic

185 - Animación de ventanas y controles con el Api AnimateWindow

<Volver> - Anterior - Siguiente



 

 

Ejemplo de esta función Api que permite aplicar un efecto animado al cargar o descargar una ventana o formulario y también para controles

 

En esta página se describe el uso de esta función, que puede ser útil entre otras cosas, por ejemplo para aplicaciones de estilo multimedia o formularios splash o de presentación por decir algunos usos

Nota Importante En la siguiente página a esta, hay un ejemplo que muestra como poder subclasficar la ventana, para poder repintar la misma durante el transcurso de la animación, ya que si no se hace esto, al utilizar solo la función Api AnimateWindow como se ve en esta página, en objetos que poseen la propiedad Hdc ( Formularios y picturebox ), los mismos se visualizarán en forma incorrecta.

 

 

Función AnimateWindow

La declaración del api AnimateWindow es la siguiente

Private Declare Function AnimateWindow Lib "user32" ( _
    ByVal hwnd As Long, _
    ByVal dwTime As Long, _
    ByVal dwFlags As Long) As Long 

 

El primer parámetro hwnd , corresponde al Hwnd de ventana a aplicar el efecto.

El parámetro dwTime, es el tiempo de duración del efecto. Este valor está expresado en milisegundos, donde lo mas común es pasar un valor entre 200 y 500 milisegundos

El parámetro dwFlags, son los valores que permite indicar que efecto usar y algunas otras propiedades, como por ejemplo la orientación del efecto, es decir que la ventana vaya apareciendo desde el centro, desde el lado izquierdo hacia el derecho, con efecto Fade o transparencia .

Estos flags se pueden combinar mediante el operador Or para usarlos en conjunto. A continuación se ven algunos ejemplos

 

Ejemplo 1 - Animación Fade con transparencia

 

Efecto de transparencia o efecto fade

El siguiente código , hace que la ventana vaya apareciendo paulatinamente usando como constante AW_BLEND . El valor de los milisegundos se establece en 250

 

Nota: Para que al finalizar la animación, la ventana recupere el foco, se debe pasar en el parámetro Flags, la constante AW_ACTIVATE, como se ve en el ejemplo anterior.

 

Ejemplo 2 - Animación desde los costados

En este caso , la ventana aparece desde el lado izquierdo hacia el derecho.

Usa la constante AW_HOR_POSITIVE como valor para el parámetro dwFlags

 

Nota: para cambiar las direcciones utilizar las siguientes costantes:

Private Const AW_HOR_NEGATIVE = &H2 ' Derecha a izquierda
Private Const AW_VER_POSITIVE = &H4 ' Arriba abajo
Private Const AW_VER_NEGATIVE = &H8 ' Abajo hacia arriba
Private Const AW_HOR_POSITIVE = &O1 ' Izquierda a derecha

 

Ejemplo 3 - Animar en forma diagonal

Se pueden combinar las constantes anteriores para hacer la animación en forma diagonal

Por ejemplo, al pasar como flags la combinación AW_HOR_POSITIVE Or AW_VER_POSITIVE , la animación de la ventana se produce desde la esqui9na superior izquierda en forma diagonal

 

 

 

.. Idem al anterior, pero comenzando desde la esquina inferior derecha

 

 

Ejemplo 4 - Animar desde el centro

Para animar la ventana desde el centro se debe utilizar la constante AW_CENTER

Ejemplo

 

 

Ejemplo 5 - Cargando otra ventana

Por ejemplo si queremos cargar un Form2 al persionar un Command1 desde un Form1, no es necesario ejecutar el método Show del form2 y luego ejecutar el Api, simplemente llamando AnimatedWindow la ventana se cargará y mostrará. Es decir esta función , además de animar la ventana, la carga y la muestra. Si ya estaba cargada, pero oculta ..solo la muestra

Ejemplo

Agregar un Form2 y un Command1 en el Form1

Código en el clic del Command1

AnimateWindow Form2.hwnd, 300, AW_CENTER Or AW_ACTIVATE

 

Ejemplo 6 - Animar una ventana al descargarla u ocultarla

Para realizar las animaciones vistas , pero en ves de que se produzcan en el momento de llamar a la ventana, y poder hacerlo al ocultar o descargar la misma , de debe utilizar la constante AW_HIDE como valor para el parámetro dwFlags

Por ejemplo lo siguiente, al descargar el formulario ( en el evento Form_Unload ) , anima la ventana con el efecto AW_BLEND, y también le indica la constante AW_HIDE. Una ves terminada la animación la ventana se descarga

 

 

.. si solo queremos ocultar la ventana, pero no descargarla de memoria, ejecutar el mismo ejemplo anterior, pero no el Unload form

 

Ejemplo 7 - Animar controles

 

Además de animar ventanas, también se pueden animar controles que posean Hwnd, .. al fin y al cabo son también ventanas

El siguiente ejemplo, aplica un efecto de animación a un control Picturebox. El efecto hace aparecer y ocultar desde el centro con la constante AW_CENTER

Colocar un Command1 , un Command2 y un Picture1. Al picture cargarle un gráfico

Importante : notar que se utiliza luego de animar el picture, el método Refresh

 

Código en el formulario

 

 

Animar todos los controles del formulario

 

Este otro ejemplo es similar al anterior, pero se recorren mediante un bucle For Each todos los controles que haya en el formulario y se verifica que posean la propiedad Hwnd. Si posee dicha propiedad, llama a la Rutina Animar

Colocar en el formulario varios controles que posean Hwnd, DriveListbox, listbox, combo etc. y también dos CommandButton para la animación de los mismos

 

vista del ejemplo para animación de controles y objetos en windows desde vb

 

Código fuente en el formulario

 

 

Si se desea aplicar el efecto a controles que no posean hwnd, como los Label o Shape, lo que se puede hacer es colocarlo dentro de un contenedor que si posea Hwnd y ocultar dicho contenedor, por ejemplo meterlo dentro de un control frame

 


Nota: Una ves teminada la animación, como se vió en el ejemplo anterior, se refresca el control u obeto con el método Refresh, pero hay un problema ( que se comentó al principio de la página) , y es que si bien se puede utilizar el método Refresh para refrescar el control y solucionar este problema " a medias ", lo que no se puede solucionar es el tema de que la ventana, " mientras se está animando ", NO se repinta ( Se visualiza de color negro ) en los objetos que posean Hdc, como los formulario o picturebox

La única forma de solucionar esto es haciendo subclasificación

En la página siguiente se muestra como subclasificar la ventana para interceptar el mensaje WM_PRINTCLIENT , y poder hacer el redibujado completo mientras se ejecuta la animación, y de esta manera poder visualizar los controles correctamente

Subclasificación para hacer Animación de ventanas con la Función AnimateWindow

 



Buscar en Recursos vb