martes, 17 de enero de 2012

Manejo de Formularios MDI con C# y Visual Studio 2010 Express

Antes de iniciar debemos aclarar que existen dos tipos de Formularios:
SDI (Single Document Interface)
MDI (Multiple Document Interface)

Los Formularios MDI son aquellos que permiten contener otros formularios dentro de ellos.

Para crear una aplicación de tipo MDI primeramente tenemos que crear nuestro proyecto (Aplicación de Windows).
En el formulario principal debemos establecer la propiedad IsMdiContainer a True.

Formulario Principal


Posteriormente debemos Crear el formulario base que será la plantilla que tendrán nuestros formularios child. En nuestro caso hemos tratado de simular un editor de texto bastante simple pero con soporte MDI.

Agregamos un nuevo formulario a nuestro proyecto.

Agregamos un primer panel en la parte inferior que podrá contener botones si así lo deseamos, para hacer eso establecemos la propiedad Dock del panel en Bottom.


Después agregamos un segundo panel que contendrá nuestro cuadro de texto y establecemos la propiedad Dock en Fill.



Agregamos nuestro textbox y lo renombramos a txtBoxContent y establecemos su propiedad Dock en Fill.





Agregamos un botón al panel de la parte inferior que sera la simulación de un botón que servirá para guardar nuestro documento. Con esto tendremos nuestro formulario base.

Formulario Base


Ahora crearemos un menú para tener una administración muy sencilla de las ventanas child (en el formulario Principal). Observemos que la opción "Lista ->"  no tiene subelementos ya que los crearemos en tiempo de ejecución

.



Para crear ventanas nuevas manejaremos el evento clic del menú Nueva Ventana.
Debemos crear un nuevo objeto de nuestro formulario base (en nuestro caso FrmChildBase) y establecer su propiedad MdiParent.

Código para agregar nuevos formularios Child

Para ordenar nuestras ventanas debemos de manejar el evento clic de nuestro Menú Horizontal, Vertical y Cascada. Para cambiar el ordenamiento de las ventanas existe la función LayoutMdi() que acepta una enumeración MdiLayout. Aquí el ejemplo de las 3 opciones:


Una gran utilidad es el saber que ventana se encuentra activa, para eso existe la propiedad ActiveMdiChild que nos devuelve el formulario que se encuentra activo. En nuestro ejemplo manejaremos el evento clic del menú Ventana Activa y tendremos este código:


También podemos tener referencia al control activo con la propiedad ActiveControl de nuestro formulario activo.

Por ultimo para poder listar los formularios child que se encuentran activos manejaremos el evento MouseEnter de nuestro menú Lista. Esto hará que cada vez que pase el mouse sobre el menú Lista se obtenga una referencia de todos los formularios child y se agreguen de forma dinámica al menú. Esto gracias a la propiedad MdiChildren de nuestro formulario principal. La propiedad MdiChildren nos devuelve un arreglo de formularios.