Immagini di sfondo su form in vs 2008 crea problemi

venerdì 04 dicembre 2009 - 09.41

basicdany Profilo | Expert

Scusate se ho rimesso lo stesso thread, come spiegavo caricando un immagine come sfondo a un form, rallenta il caricamento della form, qualcuno puoi darmi una mano?

grazie a tutti

freeteo Profilo | Guru

Ciao,
che il caricamento sia lento è inevitabile, deve disegnare tutti i vari pixel dell'immagine.
Poi che sia "troppo" lento probabilmente lo si deve ad un problema di qualità dell'immagine, che formato hai? Quanto occupa l'immagine sul disco?

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

basicdany Profilo | Expert

ciao, gentilissimo, allora carico l'immagine dalla proprieta del form (bakgroudimage),lo sfondo che carico e di solo 1k con estensione jpg.

utilizzo vs 2008, vb.

grazie un utente mi ha postato un esempio in c ma non riesco a tradurlo e inserirlo:
http://www.bloginformatico.net/2009/03/12/diminuire-leffetto-flickering-aumentando-le-prestazioni-in-gdi/
Luigi Di Biasi


aspetto risposta ciao grazie tanto

freeteo Profilo | Guru

Ciao,
in quell'esempio ti basta sostituire alla parola "this" la parola "Me" che in vb vuol dire la classe che sono io.
Per l'evento invece è l'evento Paint, ti basta andare negli eventi della form (da designer aperto) e nella voce eventi (il fulmine arancione) fare doppio click in concomitanza con l'evento paint.

Dentro ci scrivi il codice tradotto con questo traduttore:
http://www.carlosag.net/Tools/CodeTranslator/

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

basicdany Profilo | Expert

ho inserito nel form load:

Me.InitializeComponent()
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.UpdateStyles()

'carica immagini nelle form
Me.BackgroundImage = New Bitmap(Application.StartupPath & "\Sfondo.jpg")

nell'evento paint

If True Then
Dim buffer As New Bitmap(Me.Width, Me.Height)
Using graphics As Graphics = graphics.FromImage(buffer)
End Using
e.Graphics.Clear(Me.BackColor)
e.Graphics.DrawImage(buffer, 0, 0, buffer.Width, buffer.Height)
End If


non funziona non carica l'immagine, è lento nel caricare il form

perche??

ciao

freeteo Profilo | Guru

Allega un esempio che indaghiamo sul codice.
ps: meglio se metti anche l'immagine come file singolo così provo a fare qualche conversione di formato...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

basicdany Profilo | Expert

Ti passo l'immagine per il codice non e altro che questo metodo:

nel form load di qualsiasi form:


Me.InitializeComponent()
Me.SetStyle(ControlStyles.UserPaint, True)
Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.DoubleBuffer, True)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
Me.UpdateStyles()

Me.BackgroundImage = New Bitmap(Application.StartupPath & "\Sfondo.jpg")

evento paint di qualsiasi form

If True Then
Dim buffer As New Bitmap(Me.Width, Me.Height)
Using graphics As Graphics = graphics.FromImage(buffer)
End Using
e.Graphics.Clear(Me.BackColor)
e.Graphics.DrawImage(buffer, 0, 0, buffer.Width, buffer.Height)
End If

grazie aspetto risposta



freeteo Profilo | Guru

Ciao,
perchè non lo usi come risorsa del progetto invece di caricarlo ogni volta dal disco?
Io se lo imposto da designer della form (che automaticamente poi lo aggiunge alle risorse del progetto) non vedo questa lentezza.

Il file effettivamente è piccolo, non può essere così lento come dici...dovrebbe essere appena percettibile.
Prova a fare così e vedi se è lento...se ancora è lento potrebbe essere un problema della tua macchina, hai provato in qualche altro pc? magari è un problema di Directx o cose di questo genere legate alla scheda video...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

basicdany Profilo | Expert

ok gentilmente mi dici come fare questa operazione:

perchè non lo usi come risorsa del progetto invece di caricarlo ogni volta dal disco?
Io se lo imposto da designer della form (che automaticamente poi lo aggiunge alle risorse del progetto) non vedo questa lentezza

ciao grazie

freeteo Profilo | Guru

>ok gentilmente mi dici come fare questa operazione:
allora apri la form dentro a visual studio, vai nella finestra delle sue proprietà (equivalente del pulsante F4) e vai nella proprietà "BackgroundImage".
La selezioni, premi il pulsantino ".." vicino al valore di questa, ti si apre una maschera, scegli "Project Resource File", e poi premi "import" e aggiungi il file immagine al tuo progetto.

Se non cambia spesso il file, ti conviene fare così, in modo che poi sia già caricato in memoria con il progetto stesso (in quanto viene poi agganciato dentro) e quindi visualizzato sfruttando la cache tra le varie aperture della form.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

basicdany Profilo | Expert

ciao,la tua soluzione e buona ma il problema è nella quantita di controlli che si caricano nel form, ti allego un progetto dove vedrai l'effetto ottico e la differenza tra un form con dei controlli e uno senza controlli

e incredibile!!!! vedi ilprogetto che ti ho allegato

non so che fare comunque, se hai qualche idea al merito

ciao e grazie tanto.

basicdany Profilo | Expert

ciao, t ho inviato un email con progetto di esempio, puoi aiutarmi?

freeteo Profilo | Guru

Ciao,
effettivamente il problema è che hai usato troppi controlli, tutti su una stessa maschera.
Puoi tentare di migliorare qualcosa togliendo i groupbox e usando al loro posto dei panel che hanno meno pesantezza, ma siamo veramente alle briciole...il problema sta nell'elevato numero di controlli (150 circa) dentro un'unica maschera, sinceramente mi sembra che siano troppi.

Chiaramente i valori e quei controlli ti servono, non intendo che devi usarne meno, ma intendo che dovresti usare una tecnica diversa, ossia dei tab che ti raggruppino alcune tipologie di controlli, se vuoi migliorare.

Io ti suggerisco di usare cominciare usando un tabControl, usare una tab per ogni groupbox (quindi 3 tab) anche perchè ne guadagni di layout, ossia puoi ad esempio mettere i controlli anche uno sotto all'altro perchè ogni tab ha tutto lo spazio della form a disposizione...
Purtroppo però non c'è il background transparent nella tabcontrol normale, dovresti usare qualche trucchetto come questo: http://homepage.ntlworld.com/mdaudi100/alternate/tabcontrols.html
ma io mi concentrerei sul dare un'interfaccia migliore ed un tempo di caricamento decente piuttosto che sul colore di sfondo...

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5