Tempo fa avevo bisogno di utilizzare form di tipo MDI (Multiple Document Interface).
In un'applicazione SDI (Single Document Interface) ciascuna form non dipende dalle altre e non esiste una gerarchia.
In un'applicazione MDI, invece, c'è una parent window che fa da contenitore per una o più child window. Tutte le finestre child condividono con con la parent il menù e la toolbar, che compaiono nella parent window, e sono racchiuse all'interno di quest'ultima.
Mi sono letto questo post dalla sezione tips di dotnetside, in cui Miguell ci presenta le MDI Forms. In pratica ci spiega come una form diventa un container impostandone:
IsMDIContainer = true
A questo punto si possono aggiungere quante child form si vogliono: per ciascuna di esse basterà impostare la proprietà MDIParent indicando il nome della form che fa da container. (Ovviamente un'applicazione MDI può avere anche finestre normali)
Sempre Miguell ci spiega come aggiungere una voce Windows al menu della container form in cui verranno elencate tutte le finestre aperte, semplicemente con la proprietà MdiWindowListItem del menù. Ogni finestra nell'elenco potrà essere attivata semplicemente cliccando sulla rispettiva voce nell'elenco.
Cercando un po' in giro ho trovato questo articolo e quest'altro, che mi hanno dato la possibilità di arricchire ulteriormente la voce Windows con funzionalità tipiche di un'applicazione MDI, quali: ArrangeIcons, Cascade, TileHorizontal, TileVertical, MinimizeAll, MaximizeAll.
Le prime quattro si ottengono semplicemente usando il metodo LayoutMDI della parent form, passandogli come argomento uno dei quattro valori della enumeration MdiLayout, ossia proprio ArrangeIcons, Cascade, TileHorizontal, TileVertical.
Ad esempio (in VB.NET):
Private Sub ArrangeIconsToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ArrangeIconsToolStripMenuItem.Click
Me.LayoutMdi(MdiLayout.ArrangeIcons)
End Sub
Private Sub TileVerticalToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles TileVerticalToolStripMenuItem.Click
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
Le altre due si ottengono invece impostando la proprietà WindowState di ciascuna child form, utilizzando l'opportuno valore della enumeration FormWindowState.
Ad esempio (in VB.NET):
Private Sub MinimizeAllToolStripMenuItem_Click _
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MinimizeAllToolStripMenuItem.Click
Dim childActive As Form = Me.ActiveMdiChild
For Each childForm As Form In Me.MdiChildren
childForm.WindowState = FormWindowState.Minimized
Next
If (childActive IsNot Nothing) Then
childActive.Activate()
End If
End Sub
View blog reactions