índice de Visual Studio 2005 y .NET Framework 2.0

Manejar formularios hijos en aplicaciones MDI con VB2005


Este artículo es la versión para Visual Basic 2005 del artículo anterior para Visual Basic .NET (2003), también veremos cómo manejar los formularios hijos mostrados en una aplicación de tipo MDI (Multiple Document Interface o interfaz de múltiples documentos), y la principal diferencia con el ejemplo de Visual Studio .NET 2003 es que en este caso, en lugar de usar un menú del tipo MainMenu usaremos uno del tipo MenuStrip en el que veremos cómo indicar que un menú determinado hará de lista de las ventanas hijas abiertas.


Publicado: 11/Ene/2006
Actualizado: 21/Ene/2007
Autor: Guillermo 'guille' Som
 

Introducción

Como te he comentado en la pequeña introducción de arriba, en este artículo es básicamente el mismo ejemplo que el de la versión 2003 de Visual Basic, aunque veremos algunas pequeñas diferencias, una de ellas es que el menú que usaremos en el formulario MDI es del tipo MenuStrip que es el que hay disponible en el cuadro de herramientas (ToolBox), este menú ha cambiado con respecto al MainMenu de las versiones anteriores, y aunque podemos seguir usando ese MainMenu en las aplicaciones de VB2005, (y las de C# 2005), mejor que nos vayamos acostumbrando, entre otras cosas porque el MainMenu ya no aparece en la barra de herramientas (aunque lo podemos agregar y seguir usando), por tanto... ¡habrá que usarlo! además de que queda más "cool" (o guay que diríamos nosotros).

Uno de los muchos cambios de este menú, es que ahora la forma de indicar que un menú hará de lista de ventanas hijas ha cambiado, de forma que ahora no es el "elemento" del menú el que tiene la propiedad para indicarlo, sino que es el propio MenuStrip mediante la propiedad MdiWindowListItem en la que indicaremos el menú que queremos usar como menú de ventanas hijas.

En la siguiente figura (figura 1) podemos ver cómo seleccionar el elemento "principal" de los menús añadidos para que haga de lista de ventanas:

Figura 1. Indicar el menú que contiene la lista de ventanas hijas
Figura 1. Indicar el menú que contiene la lista de ventanas hijas

 

Por si no sabes de que va esto de la lista de ventanas hijas, decirte que podemos tener en un menú las diferentes ventanas hijas que tenemos abiertas al estilo de como hacen otras aplicaciones, de esa forma, puedes seleccionar la ventana que quieras activar usando dicho menú, tal como se muestra en la figura 2:

Figura 2. El menú con la lista de ventanas abiertas
Figura 2. El menú con la lista de ventanas abiertas

 

No te voy a mostrar código, ya que en realidad el código a usar sería el mismo que en el ejemplo de Visual Basic 2003, incluso la asignación de las propiedades para crear el form principal como MDI (IsMdiContainer = True) y asignar el valor correspondiente para que los otros formularios sean "hijos" de ese formulario (MdiParent).

' Usando el método "tradicional" se muestra maximizado
' si el valor en tiempo de diseño de WindowState = Normal
' Como esté ControlBox no afecta.
'
' Crear una nueva ventana hija
Dim frm2 As New Form2()
frm2.MdiParent = Me
frm2.WindowState = FormWindowState.Maximized
frm2.Show()

 

Lo que si quiero aclararte es lo siguiente:

Tal como indico en los comentarios del código anterior, podemos hacer que el formulario hijo se muestre a pantalla completa o minimizado dentro del formulario principal, pero para que eso funcione en VB2005, el valor de WindowState del formulario hijo (en este ejemplo el Form2) debe estar asignado a Normal, ya que si está de otra forma, la primera vez que se muestre lo hará en modo normal, pero con los iconos de la parte superior derecha como si estuviera maximizado (ver figura 3), y aunque si pulsamos en la barra de título para ponerlo normal y después para maximizarlo, funcionará bien, (también se "ajustará" al cambiar el tamaño del form principal), el efecto no es muy "profesional" que digamos, así que... apúntate este "truco" por si te ocurre.

 

Figura 3. Si el form hijo, en modo diseño, tiene un valor en WindowState distinto de Normal se verá "raro"
Figura 3. Si el form hijo, en modo diseño,
tiene un valor en WindowState distinto de Normal se verá "raro"

 

Ese "extraño efecto" ocurre tengamos o no la línea que asigna el valor de WindowState en el código mostrado anteriormente (el que usaremos para mostrar el formulario hijo).

El aspecto que debería tener es el que vemos en la figura 4, ya que al estar maximizado, no deberíamos ver la barra de título, que solo debe mostrarse al estar en modo Normal o cuando está minimizado.

Figura 4. El aspecto correcto cuando el form hijo está maximizado
Figura 4. El aspecto correcto cuando el form hijo está maximizado

 

Cuando un GoupBox está dentro de otro GroupBox, en VS 2005 se ve bien, pero no en VS 2003

Una nota final, como puedes ver en las figuras anteriores, el form hijo no tiene una caja de textos, (que es lo que debería tener para que funcione el código del ejemplo de Visual Studio 2003), es que he estado probando si en VB2005 ocurre lo mismo que en VB2003 cuando un GroupBox está dentro de otro GroupBox. En el caso de VS 2003 (en VB y C# ocurre lo mismo), el segundo GroupBox se ve mal, con el texto más grande de lo normal, (ver figura 5), para solucionarlo hay que incluir el segundo GroupBox dentro de un control de tipo Panel y de esa forma el aspecto será como el de la figura 4, que es el correcto.

Figura 5. Los GroupBoxs anidados en VS2003 se ven mal al usar los extilos de XP
Figura 5. Los GroupBoxs anidados en VS2003 se ven mal al usar los estilos de XP

 

Pues esto es todo... salvo por aclarar que todo lo dicho es válido tanto para Visual Basic 2005 como para Visual C# 2005 (y tanto para las versiones Express como las normales de Visual Studio 2005).

Nos vemos.
Guillermo

 


Trucos .NET 2.0

la Luna del Guille o... el Guille que está en la Luna... tanto monta...