2011-10-07 19 views
9

Ho un cliente che come progetto Visual Basic in modalità istanza singola con una logica di presentazione cablata.Posso ospitare un Windows Form all'interno di un controllo

Il modulo principale contiene un TabControl con più TabPages. Se faccio clic su TabPageA, un altro modulo viene mostrato davanti al modulo e ridimensionato per avere le stesse dimensioni di TabPage.

Se faccio clic su TabPageB, il primo modulo è nascosto e viene visualizzato un altro modulo. Quindi, in pratica per l'utente, sembra che tu abbia un TabControl con TabPages diversi che non è il caso.

Ho provato a convertire i moduli in UserControls e li ho inseriti all'interno di TabPage, ma, grazie all'app SingleInstance, ci sarebbe voluto un sacco di refactoring. L'ho provato, ma alla fine ho rinunciato a causa di molti errori di runtime e non voglio fare altro sforzo in questo.

Il mio Ideam era che, durante il runtime, potevo aggiungere i moduli ai TabPages e lasciarli agire come UserControls, è possibile?

+0

Si potrebbe provare ad afferrare una copia dell'array di controllo del modulo e spingerlo in un nuovo pannello sull'altro controllo forse. – asawyer

+0

Hai guardato MDI? Forse potresti sostituire il controllo a schede con le voci di menu in modo che la finestra principale possa avere e aprire finestre secondarie dalla barra dei menu. –

risposta

32

È possibile trasformare una classe Form in un controllo figlio impostando la proprietà TopLevel su False. Diventa essenzialmente un UserControl con alcuni overhead inutilizzati. Assomiglia a questo:

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

Questa è una risposta sorprendente. E in tutto questo tempo l'ho creato con i proprietari e gestendo le mosse ... +5! – Ryan

+0

È bello. Lo proverò, ma sembra promettente. –

+0

Fantastico. Grazie. – jww

6

Qualsiasi finestra può essere ospitata in qualsiasi altra finestra (un controllo è una finestra, tecnicamente) utilizzando SetParent.

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

End Function 

di dichiarare e

SetParent(FormToHost.Handle, ControlToHostForm.Handle) 

da usare. Potrebbe non essere l'ideale, ma va bene se non vuoi fare altro sforzo in questo, come dici tu. I moduli verranno ingranditi e ridotti a icona correttamente e non verranno visualizzati nella barra delle applicazioni e verranno chiusi con i relativi contenitori.

+1

Mentre il suggerimento di Hans è migliore per questo problema, questo ha il vantaggio che funziona anche con altri tipi di finestre. – CodesInChaos

+0

L'ho usato molto tempo fa per "agganciare" un'applicazione di terze parti nella mia. Fai attenzione a qualsiasi "tasto di scelta rapida" (tasti che eseguono funzioni nell'app anche quando non ha il focus) nelle altre app. Potresti interrompere questa funzionalità. –

-1

è possibile utilizzare i pannelli. in ogni scheda devono essere mostrati un pannello o pannelli diversi e l'altro o altri devono essere nascosti.

Problemi correlati