Efectos de ventanas con la API de Windows

Bueno lo primero de todo es explicar para el que no lo
sepa que es la API de Windows. Vale pues sus siglas significan Application
Programing Interface y son un conjunto de bibliotecas de funciones que permiten
crear programas que solo vayan a correr sobre plataformas Windows.

Las partes en las que se divide la API son las
siguientes (sacado de wikipedia):

  • Depuración
    y manejo de errores
  • E/S de
    dispositivos
  • DLLs,
    procesos e hilos
  • Comunicación
    entre procesos
  • Manejo
    de la memoria
  • Monitoreo
  • Manejo
    de energía
  • Almacenamiento
  • Información
    del sistema
  • GDI
    (interfaz gráfica) de Windows
  • Interfaz
    de usuario de Windows

La versión más extendida es la Win32, versión para
arquitecturas de 32 bits, pero también nos podemos encontrar Win64 para
arquitecturas de 64 bits.

Dicho esto ¿que es lo que necesitamos para programar
con esta API? bueno pues documentación, un entorno de desarrollo, que en mi
caso va a ser VisualStudio 2005 y elegir el lenguaje de programación.

La documentación la podemos sacar de cualquier rincón
de la red, que ya existe bastante gente que ha tenido que programar con la API
y han compartido lo que sabían para que los demás pudiéramos avanzar. Pero en
vez de buscar por esos mundillos cibernéticos ¿por que no vamos directamente a
la fuente? luego ya buscaremos más si es que lo necesitamos.

Entonces nuestra primera parada la vamos a hacer en
MSDN Library concretamente en este enlace, aquí nos encontramos la función
AnimateWindow que como describe nos permite hacer 4 efectos sobre las ventanas
cuando estas se muestran.

Después de la breve descripción nos dan la sintaxis
que debe tener la función, que sería esta:

BOOL AnimateWindow(      

    HWND hwnd,


    DWORD dwTime,


    DWORD dwFlags


);

 ¿Cómo lo pasamos nosotros a nuestro
código? pues de la siguiente manera:

1º.- Lo primero de todo añadimos un namespace System.Runtime.InteropServices
para poder utilizar la API.

2º- Indicamos la dll que tenemos que importar:

[DllImport(«user32.dll»)] 

La dll en la que se encuentra nuestra función es
user32.dll.

3º- Declaramos nuestra función justo debajo de la
importación de la dll:

                     static extern bool AnimateWindow(IntPtr hwnd, uint dwTime, uint dwFlags); 

La declaración tiene que ser static extern porque lo
obliga el Framework de .NET, a continuación viene el booleano que debe devolver
y el nombre de la función.

Como parámetros lo primero que hay que pasarle es el
manejador de la ventana, que en .NET se declara con el tipo IntPtr que viene de
System.IntPtr. El resto de párametros los vamos a pasar como enteros sin signos
que es el equivalente en C# de DWORD. 

4º.-  Los valores que hay que pasarle dwFlags son
los que indican el efecto que quieres producir en la ventana y hay que pasarlos
en hexadecimal.

        enum AnimateWindowFlags : uint
        {
            AW_HOR_POSITIVE = 0x00000007,
            AW_HOR_NEGATIVE = 0x00000002,
            AW_VER_POSITIVE = 0x00000004,
            AW_VER_NEGATIVE = 0x00000008,
            AW_CENTER = 0x00000010,
            AW_HIDE = 0x00010000,
            AW_ACTIVATE = 0x00020000,
            AW_SLIDE = 0x00040000,
            AW_BLEND = 0x00080000
        }

 

5º.- En cada uno de los botones
creamos una ventana nueva y llamamos a la función antes de mostrarla. Yo me he
creado un botón para cada efecto:

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_ACTIVATE);
            a.Show();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_BLEND);
            a.Show();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_CENTER);
            a.Show();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_HIDE);
            a.Show();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_HOR_NEGATIVE);
            a.Show();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_HOR_POSITIVE);
            a.Show();
        }

        private void button7_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_SLIDE);
            a.Show();
        }

        private void button8_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_VER_NEGATIVE);
            a.Show();
        }

        private void button9_Click(object sender, EventArgs e)
        {
            Form2 a = new Form2();

            AnimateWindow(a.Handle, 1000, (uint)AnimateWindowFlags.AW_VER_POSITIVE);
            a.Show();
        }

 

Y poco más que contar sobre esto, simplemente ver que
a veces no hay que cascarse la cabeza buscando librerías que hagan efectos de
este tipo si el mismo Windows lo hace con un par de líneas.

Saludetes
[8-|]