La Web del Programador: Comunidad de Programadores
 
    Pregunta:  55557 - FORM POR DEBAJO DE OTROS CONTROLES
Autor:  Adela Segura
Hola a tod@s!

Estoy un poco liada. Necesito ayuda! ;-)

He creado un FORM "principal" con barra de menus, statusbar, etc. En dicho form he añadido otros controles (groupbox, panel, radiobutton, etc). Cuando desde el menu llamo a otro FORM (usando ShowDialog), este se queda por detras de los controles del form principal: es decir, se queda semi oculto tras el panel y el groupbox...

Gracias de antemano!!

  Respuesta:  Carlos Rivera
La forma mas eficiente es hacer que los controles queden anclados al form donde estan

Para lograr esto:

1. Importamos el espacio de nombres InteropServices

Imports System.Runtime.InteropServices

2. Importamos una funcion que nos permite "anclar" los controles
<DllImport("user32.dll", SetLastError := True)> _
Private Shared Function SetParent(child As IntPtr, newParent As IntPtr) As IntPtr
End Function

3. En el load del formulario ponemos
Dim clienteMDI As MdiClient
For Each control As Control In Me.Controls
Try
clienteMDI = DirectCast(control, MdiClient)
SetParent(TreeMenu.Handle, clienteMDI.Handle)
Catch generatedExceptionName As InvalidCastException
End Try
Next

y listo con eso ya tenemos los controles debajo de los formularios que se llamen

Nota: los controles ralmente se ponen como si fueran controles mdi, esto esta probado con el form principal como form mdi es decir form1.IsmdiContainer = true
asi que si no funciona con un form normal, solo lo debe poner como isMdiContainer = true

Espero que le sirva

  Respuesta:  Juan Carlos Martínez López
Hola adelita, leyendo aca tu problema, a mi también me salia asi el mismo problema lo que hice fue hacer MDI al principal, crear otro form que no tenga bordes vos sabes en la propiedad formBorderStyle = None,
y lo instanciaba en el evento Load al cargar el principal. Espero que si te sirve la idea la uses, a mi me sirvio y no se echa de ver la diferencia.

El codigo que use para instanciar el formulario donde vas a poner tus controles, el q te dije q no debe tener bordes, es este:

lo pones despues del codigo generado por el editor:

/* Esta es una instancia del formulario en q estas ahorita, o sea instanciaFormulario se llama el formulario donde coloco este codigo
Private Shared mp As instanciaFormulario = Nothing

/* Este es mi funcion que me va a permitir que no se creen mas de una instancia de este formulario
Public Shared Function Instanciar() As instanciaFormulario
If mp Is Nothing OrElse _
mp.IsDisposed Then
mp = New instanciaFormulario()
End If
Return mp
End Function

Ahora en el codigo del evento Load de tu Principal colocas lo siguiente:

/* Declaras una instancia del formulario anterior, el q vas a mostrar tus controles */
Dim instanciaNueva as new instanciaFormulario()

/* Aca .instanciar() es la funcion que colocaste en el otro form, cuando le des . te tiene q aparecer, sino es q no has colocado la funcion
instanciaNueva = instanciaNueva.instanciar()

/* Aca le digo que el padre de la instancia es el principal
instanciaNueva.mdiParent = Me

/* y al final lo muestro
instanciaNueva.show()

Espero te sirva, sino entendes algo me escribes al correo, con gusto te respondo.
Suerte!