using System;

using System.Collections.Generic;
using System.Text;

using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Imaging;


namespace AnimateDemo
{
    class AnimateCtl : System.Windows.Forms.Control
    {
        private Bitmap bitmap;
        private System.Windows.Forms.Timer fTimer;

        private int frameCount;
        private int frameWidth;
        private int frameHeight;
        private Graphics graphics;
        private int currentFrame = 0;
        private int loopCount = 0;
        private int loopCounter = 0;

        public AnimateCtl()
        {
            // Подготоавливаемся к работе с графикой
            graphics = this.CreateGraphics();
            // Создаем таймер
            fTimer = new System.Windows.Forms.Timer();
            // Создаем обработчинк для события Tick
            fTimer.Tick += new System.EventHandler(this.timer1_Tick);
        }

        public Bitmap Bitmap
        {
            get 
            { 
                return bitmap; 
            }
            set
            {
                bitmap = value;
            }
        }

        private void DrawFrames(int iframe)
        {
            // Вычисляем верхнюю позцию выводимого кадра
            int YLocation = iframe * frameHeight;

            Rectangle rect = new Rectangle(0, YLocation, frameWidth, frameHeight);

            // Выводим один кадр
            graphics.DrawImage(bitmap, 0, 0, rect, GraphicsUnit.Pixel);
        }

        public void StartAnimation(int frHeight, int DelayInterval, int LoopCount)
        {
            frameHeight = frHeight;
            
            loopCount = LoopCount;
            
            loopCounter = 0;
            // Подсчитываем число кадров
            frameCount = bitmap.Height / frameHeight;
            
            frameWidth = bitmap.Width;
            
            // Изменяем размеры в соответствии с размерами картинки
            this.Size = new Size(frameWidth, frameHeight);
            // Задаем интервал
            fTimer.Interval = DelayInterval;
            //Запускаем таймер
            fTimer.Enabled = true;
        }


        public void StopAnimation()
        {

            fTimer.Enabled = false;
        }

        private void DrawFrame()
        {
            if (currentFrame < frameCount - 1)
            {
                currentFrame++;
            }
            else
            {
                // увеличиваем loopCounter
                loopCounter++;
                currentFrame = 0;
            }
            DrawFrames(currentFrame);
        }

        private void timer1_Tick(object sender, System.EventArgs e)
        {
            if (loopCount == -1) //если равна -1, то бесконечная анимация
            {
                this.DrawFrame();
            }
            else
            {
                if (loopCount == loopCounter) //останавливаем анимацию
                    fTimer.Enabled = false;
                else
                    this.DrawFrame();
            }
        }
    }
}
