2011-10-07 12 views
9

Tengo un cliente que como un Proyecto de Visual Basic en modo de instancia única con una lógica de presentación con cable.¿Puedo alojar un Windows Form dentro de un control?

El formulario principal contiene un TabControl con múltiples TabPages. Si hago clic en TabPageA, se muestra otro formulario al frente del Formulario y se lo cambia el tamaño para que tenga el mismo tamaño que TabPage.

Si hago clic en TabPageB, el primer formulario está oculto y se muestra otro formulario. Así que, básicamente, para el usuario, parece que tiene un TabControl con diferentes TabPages, que no es el caso.

Traté de convertir las Formas a UserControls y ponerlas dentro de la TabPage, pero, gracias a la aplicación SingleInstance, esto requeriría una gran cantidad de refactorización. Lo intenté pero finalmente me rendí debido a muchos errores de tiempo de ejecución y no quiero poner más esfuerzo en esto.

Mi idea era que, en tiempo de ejecución, podía agregar los formularios a TabPages y dejarlos actuar como UserControls, ¿esto es posible?

+0

Puede intentar agarrar una copia de la matriz de control del formulario y presionarlo en un panel nuevo en el otro control tal vez. – asawyer

+0

¿Has mirado a MDI? Tal vez podría reemplazar el control de pestañas con elementos de menú para que la ventana principal pueda tener y abrir ventanas secundarias desde la barra de Menú. –

Respuesta

32

Puede convertir una clase de formulario a un control secundario estableciendo su propiedad TopLevel en False. Se convierte esencialmente en un UserControl con algunos gastos generales no utilizados. Haga que se vea similar a esto:

Public Class Form1 
    Public Sub New() 
     InitializeComponent() 
     Dim frm As New Form2 
     frm.TopLevel = False 
     frm.FormBorderStyle = Windows.Forms.FormBorderStyle.None 
     frm.Visible = True 
     frm.Dock = DockStyle.Fill 
     TabPage1.Controls.Add(frm) 
    End Sub 
End Class 
+0

Esta es una respuesta increíble. Y todo este tiempo lo he estado organizando con propietarios y moviéndome ... ¡+5! – Ryan

+0

Eso es bueno. Voy a probarlo, pero parece prometedor. –

+0

Impresionante. Gracias. – jww

6

Cualquier ventana puede alojarse en cualquier otra ventana (un Control es una ventana, técnicamente) utilizando SetParent.

<System.Runtime.InteropServices.DllImport("user32.dll")> 
Public Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr 

End Function 

declarar y

SetParent(FormToHost.Handle, ControlToHostForm.Handle) 

de usar. Puede que no sea lo ideal, pero está bien si no quieres poner más esfuerzo en esto, como dices. Los formularios se maximizarán y minimizarán correctamente, y no se mostrarán en la barra de tareas, y se cerrarán con sus contenedores.

+1

Aunque la sugerencia de Hans es mejor para este problema, tiene la ventaja de que también funciona con otros tipos de ventanas. – CodesInChaos

+0

Utilicé esto hace mucho tiempo para "conectar" una aplicación de terceros dentro de la mía. Tenga cuidado con cualquier función de "tecla de acceso rápido" (teclas que realizan funciones en la aplicación incluso cuando no tiene el foco) en otras aplicaciones. Puede romper esa funcionalidad. –

-1

puede usar paneles. en cada pestaña, diferentes paneles o paneles deben mostrarse unos a otros u otros deben estar ocultos.

Cuestiones relacionadas