GIF Animate

martedì 25 marzo 2008 - 11.10

grillo75 Profilo | Newbie

Ciao a tutti e ben tornati dalla Pasquetta :)

Vorrei inserire una gif animata in un win form.
L'ho inserita in una pictureBox settando il tag (proprietà dell'immagine della picture box) a it just works. Questa funziona.
Il problema è quando premo il pulsante per far eseguire delle operazioni che girano circa 1 minuto (è il momento incui essa dovrebbe essere visibile) e l'immagine si blocca suppongo perchè il controllo passa al thread dell'operazione.

Sapete come fare per rendere la gif indipendente dal controllo?
Spero di non essere stato troppo confuso.

Grazie 1000!!!
Ciao
Roberto
-

0v3rCl0ck Profilo | Guru

Ciao,

Ti consiglio di implementare una gestione a multi-thread, cioè devi fare girare il lavoro "pesante", su di un altro thread, che non sia il principale, perchè sul Main-Thread girano tutti i controlli della GUI. Se utilizzi il framework 2.0 puoi utilizzare comodamente il componente "BackgroundWorker", comodo perchè gestisce lui il ritorno sul thread principale, quando l'esecuzione è terminata e si vuole ad esempio scrivere il risultato su di una textbox, cosa che non è possibile farlo, da un altro thread che non sia il principale (il framework 1.1 te lo permette di fare, ma può causare gravi problemi di stabilità delle interfacce grafiche e quindi devi gestirti anche il ritorno sul thread principale).

Se hai bisogno di esempi, o ragguagli, chiedimi pure...

http://blogs.dotnethell.it/Regulator/

freeteo Profilo | Guru

ciao,
al tempo mi ero fatto un componentino molto "spartano" per visualizzare le gif animate, con questo codice abbastanza intuitivo:

public partial class PictureBoxAnimated : PictureBox { System.Timers.Timer timeRefresh = new System.Timers.Timer(100); List<Image> pagine = new List<Image>(); Image immagine; public new Image Image { get { return immagine; } set { immagine = value; FrameDimension frameDim = new FrameDimension(immagine.FrameDimensionsList[0]); int frameCount = immagine.GetFrameCount(frameDim); //--- se ha piu' immagini dentro (quindi gif animata) if (frameCount > 1) { for (int i = 0; i < frameCount; i++) { immagine.SelectActiveFrame(frameDim, i); pagine.Add(immagine.Clone() as Image); } timeRefresh.Enabled = true; } else base.Image = immagine; } } public PictureBoxAnimated() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; timeRefresh.Elapsed += new System.Timers.ElapsedEventHandler(timeRefresh_Elapsed); } int i = 0; void timeRefresh_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { using (Graphics graph = this.CreateGraphics()) { graph.Clear(this.BackColor); graph.DrawImage(pagine[i++ % pagine.Count], 0, 0); } } catch {} } }
se vuoi puoi provare a darci un'occhiata.
Come vedi la proprieta' "CheckForIllegalCrossThreadCalls" ti aiuta per evitare il Cross-Thread.


ps: non ho capito cosa intendi qui:
>...settando il tag (proprietà dell'immagine della picture box) a it just works. Questa funziona.
cosa vuole dire "a it just works" ? e poi perche' la proprieta "tag" e non "image"?



ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

0v3rCl0ck Profilo | Guru

Grillo75, sei poi riuscito a fare quello che ti serviva?


- Michael -
http://blogs.dotnethell.it/Regulator/
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