public static void Animate(Image image, EventHandler onFrameChangedHandler) { // must be non-null and contain animation time frames if (!CanAnimate(image)) { return; } // is animation already in progress ? if (ht.ContainsKey(image)) { return; } PropertyItem item = image.GetPropertyItem(0x5100); // FrameDelay in libgdiplus byte[] value = item.Value; int[] delay = new int [(value.Length >> 2)]; for (int i = 0, n = 0; i < value.Length; i += 4, n++) { int d = BitConverter.ToInt32(value, i) * 10; // follow worse case (Opera) see http://news.deviantart.com/article/27613/ delay [n] = d < 100 ? 100 : d; } AnimateEventArgs aea = new AnimateEventArgs(image); WorkerThread wt = new WorkerThread(onFrameChangedHandler, aea, delay); Thread thread = new Thread(new ThreadStart(wt.LoopHandler)); thread.IsBackground = true; aea.RunThread = thread; ht.Add(image, aea); thread.Start(); }
public static void StopAnimate(Image image, EventHandler onFrameChangedHandler) { if (image == null) { return; } if (ht.ContainsKey(image)) { AnimateEventArgs evtArgs = (AnimateEventArgs)ht [image]; evtArgs.RunThread.Abort(); ht.Remove(image); } }
public WorkerThread(EventHandler frmChgHandler, AnimateEventArgs aniEvtArgs, int[] delay) { frameChangeHandler = frmChgHandler; animateEventArgs = aniEvtArgs; this.delay = delay; }
// this method avoid checks that aren't requied for UpdateFrames() private static void UpdateImageFrame(Image image) { AnimateEventArgs aea = (AnimateEventArgs)ht [image]; image.SelectActiveFrame(FrameDimension.Time, aea.GetNextFrame()); }