Ciao, non so se vi è capitato di avere problemi con le icone in applicazioni VB.NET 2.0 con un form MDI.
A me è capitato che all'apertura di una finestra child, se questa è massimizzata, allora l'icona mostrata nel menustrip della finestra MDI non è quella corretta della form, ma quella tipica:
Dopo aver creato la form figlia massimizzata è sufficiente riportarla a normale e poi massimizzarla di nuovo perché l'icona diventi finalmente quella giusta.
Quindi, il mio stratagemma per risolvere il problema è stato il seguente:
- creo la form e la apro con WindowState = FormWindowState.Normal
- faccio la show
- massimizzo la form
Piccolo problema: c'è un po' di flickering... allora il mio algoritmo diventa:
- creo la form e la apro con WindowState = FormWindowState.Normal
- ho aggiunto una picturebox non visibile nella form MDI, la dimensiono a coprire tutta la form e la rendo visibile (se si vuole un effetto migliore andrebbe fatto un freeze, vedi qui)
- faccio la show
- massimizzo la form
- nascondo la picturebox
Ulteriore problema: se nella form MDI è già aperta una form massimizzata è necessario rimetterla a Normal prima di fare la show di quella che stiamo creando:
- creo la form e la apro con
WindowState = FormWindowState.Normal
- ho aggiunto una picturebox non visibile nella form MDI, la dimensiono a coprire tutta la form e la rendo visibile (se si vuole un effetto migliore andrebbe fatto un freeze, vedi qui)
- se ActiveMdiChild non è Nothing ed è massimizzata le imposto
WindowState = FormWindowState.Normal
- faccio la show
- massimizzo la form
- nascondo la picturebox
Ecco il codice completo:
Private Sub ApriNuovaFinestraToolStripMenuItem_Click( _
ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ApriNuovaFinestraToolStripMenuItem.Click
' Creo la form Child
Dim fChild As New FormMDIChild
fChild.MdiParent = Me
' Ne imposto il WindowState a Normal
fChild.WindowState = FormWindowState.Normal
' Faccio un freeze banale: creo una picturebox vuota
Dim FreezePictureBox As New PictureBox
' La dimensiono a coprire tutta la finestra MDI Parent
FreezePictureBox.Size = Me.ClientSize
FreezePictureBox.Location = Me.ClientRectangle.Location
' La porto in primo piano
FreezePictureBox.BringToFront()
' La aggiungo ai controlli del form
Me.Controls.Add(FreezePictureBox)
' La rendo visibile
FreezePictureBox.Visible = True
' Se è gia aperta una finestra Child ed è
' massimizzata la metto a Normal
If Me.ActiveMdiChild IsNot Nothing AndAlso _
Me.ActiveMdiChild.WindowState = FormWindowState.Maximized Then
Me.ActiveMdiChild.WindowState = FormWindowState.Normal
End If
' Mostro la mia form Child
fChild.Show()
' La massimizzo
fChild.WindowState = FormWindowState.Maximized
' Nascondo e rimuovo la PictureBox usata per il freeze
FreezePictureBox.Visible = False
FreezePictureBox.Dispose()
End Sub