Francesco Geri

Il blog di Francesco Geri
posts - 94, comments - 165, trackbacks - 2

VB.NET 2.0: Applicazioni MDI e icone perse

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:

  1. creo la form e la apro con WindowState = FormWindowState.Normal
  2. faccio la show
  3. massimizzo la form

Piccolo problema: c'è un po' di flickering... allora il mio algoritmo diventa:

  1. creo la form e la apro con WindowState = FormWindowState.Normal
  2. 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)
  3. faccio la show
  4. massimizzo la form
  5. 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:

  1. creo la form e la apro con
    WindowState = FormWindowState.Normal
  2. 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)
  3. se ActiveMdiChild non è Nothing ed è massimizzata le imposto
    WindowState = FormWindowState.Normal
  4. faccio la show
  5. massimizzo la form
  6. 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

Print | posted on martedì 23 gennaio 2007 11:18 | Filed Under [ VS2005 ]

Powered by:
Powered By Subtext Powered By ASP.NET