Francesco Geri

Il blog di Francesco Geri
posts - 87, comments - 342, trackbacks - 2

My Links

News



Anch'io metto nel mio blog cose che scrivo così, tanto per fare, tanto per condividere miei appunti, senza prendermi la briga di garantirne l'infallibilità, né l'assoluta correttezza, senza pretese e con grande umilté.

Quanti mi hanno visto dal 25/10/2007:
...dettagli

Quanta gente che c'è in questo blog!!

site statistics

Archives

Post Categories

Altre

Blogs

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 9.18 | Filed Under [ VS2005 ]

Powered by: