//Download from
//Visual C# Kicks - http://www.vcskicks.com/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices; //Needed
using PXP.Crawler.Properties;

namespace SplashScreen
{
    public partial class SplashForm : Form
    {
        private Bitmap logoBitmap;

        public SplashForm()
        {
            InitializeComponent();

            formBitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
            logoBitmap = new Bitmap(180, 180, PixelFormat.Format32bppArgb);
        }

        #region CUSTOM PAINT METHODS ----------------------------------------------
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x00080000; // Required: set WS_EX_LAYERED extended style
                return cp;
            }
        }

        //Updates the Form's display using API calls
        public void UpdateFormDisplay(Image backgroundImage)
        {
            IntPtr screenDc = API.GetDC(IntPtr.Zero);
            IntPtr memDc = API.CreateCompatibleDC(screenDc);
            IntPtr hBitmap = IntPtr.Zero;
            IntPtr oldBitmap = IntPtr.Zero;

            try
            {
                //Display-image
                Bitmap bmp = new Bitmap(backgroundImage);
                hBitmap = bmp.GetHbitmap(Color.FromArgb(0));  //Set the fact that background is transparent
                oldBitmap = API.SelectObject(memDc, hBitmap);

                //Display-rectangle
                Size size = bmp.Size;
                Point pointSource = new Point(0, 0);
                Point topPos = new Point(this.Left, this.Top);

                //Set up blending options
                API.BLENDFUNCTION blend = new API.BLENDFUNCTION();
                blend.BlendOp = API.AC_SRC_OVER;
                blend.BlendFlags = 0;
                blend.SourceConstantAlpha = 255;
                blend.AlphaFormat = API.AC_SRC_ALPHA;

                API.UpdateLayeredWindow(this.Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, API.ULW_ALPHA);

                //Clean-up
                bmp.Dispose();
                API.ReleaseDC(IntPtr.Zero, screenDc);
                if (hBitmap != IntPtr.Zero)
                {
                    API.SelectObject(memDc, oldBitmap);
                    API.DeleteObject(hBitmap);
                }
                API.DeleteDC(memDc);
            }
            catch (Exception)
            {
            }
        } 
        #endregion

        #region MENU EVENTS -------------------------------------------------------
        private void mHomepage_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("http://www.vcskicks.com/");
        }

        private void mExit_Click(object sender, EventArgs e)
        {
            this.Close(); //no extra commands are required
        } 
        #endregion

        #region FORM EVENTS -------------------------------------------------------
        private void Form1_Load(object sender, EventArgs e)
        {
            UpdateFormDisplay(this.BackgroundImage);

           
        }

        private Bitmap formBitmap;

        private float cang = 0;

        protected override void OnPaint(PaintEventArgs e)
        {
            
            

            Graphics g = Graphics.FromImage(formBitmap);
            g.Clear(Color.Transparent);
            g.DrawImageUnscaled(BackgroundImage, 0, 0);
            g.DrawImageUnscaled(logoBitmap, logoPictureBox.Left, logoPictureBox.Top);
            g.Dispose();
            
            UpdateFormDisplay(formBitmap);
            
        } 
        #endregion
        private void drawTimer_Tick(object sender, EventArgs e)
        {
            double a = (Convert.ToDouble(DateTime.Now.Ticks) / 100000000.0f) % 1;
            cang = (float)a * 360;            


            Graphics gl = Graphics.FromImage(logoBitmap);
            gl.Clear(Color.Transparent);
            gl.TranslateTransform(90, 90);
            gl.RotateTransform(cang);
            gl.TranslateTransform(-90, -90);
            gl.DrawImageUnscaled(Resources.Logo, 0, 0);
            gl.Dispose();

            this.Invalidate();
        }

        private void logoPictureBox_Paint(object sender, PaintEventArgs e)
        {
            //e.Graphics.DrawImageUnscaled(Resources.Logo, 0, 0);
        }

        private void SplashForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            formBitmap.Dispose();
            logoBitmap.Dispose();
        }
    }

    internal class API
    {
        public const byte AC_SRC_OVER = 0x00;
        public const byte AC_SRC_ALPHA = 0x01;
        public const Int32 ULW_ALPHA = 0x00000002;

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct BLENDFUNCTION
        {
            public byte BlendOp;
            public byte BlendFlags;
            public byte SourceConstantAlpha;
            public byte AlphaFormat;
        }

        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);

        
        [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr GetDC(IntPtr hWnd);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
        
        [DllImport("user32.dll", ExactSpelling = true)]
        public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern bool DeleteDC(IntPtr hdc);


        [DllImport("gdi32.dll", ExactSpelling = true)]
        public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

        [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
        public static extern bool DeleteObject(IntPtr hObject);
    }
}