Click here to Skip to main content
15,886,069 members
Articles / Multimedia / GDI+

Slide Show

Rate me:
Please Sign up or sign in to vote.
3.33/5 (8 votes)
12 Oct 2007CPOL 32.4K   1.4K   16  
This article describes how to create a simple presentation application
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;

namespace WindowsApplication1
{

    public partial class MainForm : Form
    {
        int m_currentNo = 0;
        int m_totalSlides = 0;
        int m_currentSlide = 1;
        bool b_readyToDrawText = false;
        bool b_readyToDrawImage = false;
        public ArrayList  m_SlideContainer;
        private MainObject m_tempObject;
        private SlidesControl m_selectedSlide;

        private Color[] m_backColor;

        public MainForm()
        {
            InitializeComponent();
         

            m_SlideContainer = new ArrayList();
         
        }
       
        private void Form1_Load(object sender, EventArgs e)
        {
           
            addSlide("White");
            
        }

        private void textControl1_Load(object sender, EventArgs e)
        {

        }

        private MainObject[][] listToArray()
        {

            MainObject[][] slides = new MainObject[m_SlideContainer.Count][];

            for (int i = 0; i < m_SlideContainer.Count; i++)
            {
                slides[i] = new MainObject[((ArrayList)((ArrayList)m_SlideContainer[i])).Count];
                for (int j = 0; j < ((ArrayList)((ArrayList)m_SlideContainer[i])).Count; j++)
                {
                    MainObject obj = ((MainObject)((ArrayList)((ArrayList)m_SlideContainer[i]))[j]);
                    slides[i][j] = obj;
                }
            }

            return slides;
        }


        private void arrangeCurrentSlide()
        {
            Control[] ctrl = this.Controls.Find("newCustomControl", false);

            MainObject tmpTextControl;
            for (int i = 0; i < ctrl.Length; i++)
            {
                //aaa[i].Top = aaa[i - 1].Top + aaa[i].Height;
                if (findCast(ctrl[i]) == "TextControl")
                    tmpTextControl = ((TextControl)ctrl[i]);
                else
                    tmpTextControl = ((PictureControl)ctrl[i]);

                int x = (int)(((float)tmpTextControl.Left + tmpTextControl.Width / 2) / this.Width * 100);
                int y = (int)((float)tmpTextControl.Top / this.Height * 100);




                tmpTextControl.X2 = tmpTextControl.X1 = tmpTextControl.Left;
                tmpTextControl.Y2 = tmpTextControl.Y1 = tmpTextControl.Top;







            }
        }


        private Color[] getSlidesBackColor()
        {
            m_backColor = new Color[m_totalSlides];
            Control[] slideControl = SlidePanel.Controls.Find("newSlideObject", false);
            for (int i = 0; i < slideControl.Length; i++)
            {
                m_backColor[i] = ((SlidesControl)slideControl[i]).BackColor;
            }
            return m_backColor;
        }

        

        private void textBoxToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_currentNo++;
            b_readyToDrawText = true;           
            b_readyToDrawImage = false;
            //TextControl textbox = new TextControl();
            //textbox.Name = "textControl1" + currentNo.ToString();
        }

        private void Form1_Click(object sender, EventArgs e)
        {
            animationToolStripMenuItem.Enabled = false;
        }
        private void addSlide(string bgColor)
        {
            SlidesControl SlideObject = new SlidesControl();
            SlideObject.Name = "newSlideObject";
            SlideObject.Size = slideCtrl.Size;
            SlideObject.Location = slideCtrl.Location;
            SlideObject.Top = 20;
            SlideObject.Left = 0;
            SlideObject.AutoSize = false;
            SlideObject.BackColor = System.Drawing.ColorTranslator.FromHtml(bgColor); //slideCtrl.BackColor;
            SlideObject.BorderStyle =  BorderStyle.FixedSingle;
            SlideObject.Visible = true;
            SlideObject.Text = "Slide " + (m_totalSlides + 1);

            m_SlideContainer.Add(new ArrayList());


            SlideObject.Click += new System.EventHandler(this.runTimeSlide_Click);

            m_totalSlides++;
            if (m_totalSlides == 1)
            {
                SlideObject.Selected = true;
                this.BackColor = SlideObject.BackColor;
                m_selectedSlide = SlideObject;

            }

            SlidePanel.Controls.Add(SlideObject);

            Control[] ctrl = SlidePanel.Controls.Find("newSlideObject", false);

            SlidesControl tmpControl;
            for (int i = 1; i < ctrl.Length; i++)
            {
                tmpControl = ((SlidesControl)ctrl[i]);
                tmpControl.Left = ((SlidesControl)ctrl[i - 1]).Left;
                tmpControl.Top = ((SlidesControl)ctrl[i - 1]).Top + tmpControl.Height;

            }


            
        }

        private void insertCustomControl(string type,Point Location,Size size,int Animation,string caption,string path,string foreColor, bool addToStage )
        {
            MainObject tempControl;

            if (type == "TextControl")
                tempControl = new  TextControl();
            else
                tempControl = new PictureControl();

            tempControl.Name = "newCustomControl";
            tempControl.Size = textControl1.Size;
            tempControl.Location = Location;

            tempControl.Animation = Animation;

            if (type == "TextControl")
            {
                ((TextControl)tempControl).Caption = caption;
               ((TextControl)tempControl).ForeColor= System.Drawing.ColorTranslator.FromHtml(foreColor);
            }
            else
                ((PictureControl)tempControl).Path = path;


            tempControl.Click += new System.EventHandler(this.runTime_Click);
            tempControl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.runTime_KeyDown);

            ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Add(tempControl);
            if(addToStage)
            this.Controls.Add(tempControl);


        }














        private void insertCustomControl(string type,Point Location,Size size,int Animation,bool addToStage )
        {
            MainObject tempControl;
            if (type == "TextControl")
                tempControl = new  TextControl();
            else
                tempControl = new PictureControl();

            tempControl.Name = "newCustomControl";
            tempControl.Size = textControl1.Size;
            tempControl.Location = Location;

            tempControl.Animation = Animation;

            tempControl.Click += new System.EventHandler(this.runTime_Click);
            tempControl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.runTime_KeyDown);

            ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Add(tempControl);
            if(addToStage)
            this.Controls.Add(tempControl);


        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            Point pt = new Point(e.X, e.Y);
            if (b_readyToDrawText)
            {
                b_readyToDrawText = false;               
                insertCustomControl("TextControl",pt,textControl1.Size,1005 ,true);

            }
            else if(b_readyToDrawImage)
            {
                b_readyToDrawImage=false;               
                insertCustomControl("PictureControl", pt, pictureControl1.Size,1005, true);

            }

        }

        private void runTime_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == 46)
            {
                this.Controls.Remove(((MainObject)sender));
            }
            
     
     
        }

        private string findCast(object obj)
        {
            Type cast = obj.GetType();
            string[] str = cast.ToString().Split(new Char[] { '.' });

            string s_cast = str[1];
            return s_cast;
        }

        private void refreshCurrentSlide()
        {
            int length = ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Count;
            for (int i = 0; i < length; i++)
            {
                ((ArrayList)m_SlideContainer[m_currentSlide - 1]).RemoveAt(0);

            }








            Control[] ctrl1 = this.Controls.Find("newCustomControl", false);

            for (int i = 0; i < ctrl1.Length; i++)
            {


               // Type objType = ctrl1[i].GetType();
                if (findCast(ctrl1[i]) == "TextControl")
                    ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Add((TextControl)ctrl1[i]);
                else if (findCast(ctrl1[i]) == "PictureControl")
                    ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Add((PictureControl)ctrl1[i]);
            }

        }

        private void runTimeSlide_Click(object sender, EventArgs e)
        {

           //for slides selection
            
            Control[] slideControl = SlidePanel.Controls.Find("newSlideObject", false);
            for (int i = 0; i < slideControl.Length; i++)
            {
                ((SlidesControl)slideControl[i]).Selected = false;
            }
            ((SlidesControl)sender).Selected = true;
            this.BackColor = ((SlidesControl)sender).BackColor;

            m_selectedSlide = ((SlidesControl)sender);


            //




            int tempSlide = Int32.Parse(((SlidesControl)sender).Text.Substring(5));

            if (tempSlide != m_currentSlide)
            {


                refreshCurrentSlide();


                m_currentSlide = tempSlide;

                resetCurrentSlide();
                

            }
        }

        private void resetCurrentSlide()
        {
            Control[] ctrl = this.Controls.Find("newCustomControl", false);



            for (int i = 0; i < ctrl.Length; i++)
            {
                // TextControl tmpTextControl;
                //  PictureControl tmpPictureControl;

                //  tmpTextControl = ((TextControl)ctrl2[i]);
                this.Controls.Remove(ctrl[i]);
            }

            for (int i = 0; i < ((ArrayList)m_SlideContainer[m_currentSlide - 1]).Count; i++)
            {
                object obj = ((ArrayList)((ArrayList)m_SlideContainer[m_currentSlide - 1]))[i];

                if (findCast(obj) == "TextControl")
                    this.Controls.Add(((TextControl)((ArrayList)((ArrayList)m_SlideContainer[m_currentSlide - 1]))[i]));
                else if (findCast(obj) == "PictureControl")
                    this.Controls.Add(((PictureControl)((ArrayList)((ArrayList)m_SlideContainer[m_currentSlide - 1]))[i]));
            }


            
        }

        private void unLoadAllData()
        {
            Control[] slideControl = SlidePanel.Controls.Find("newSlideObject", false);
            for (int i = 0; i < slideControl.Length; i++)
            {
                SlidePanel.Controls.Remove(slideControl[i]);
            }

            Control[] ctrl = this.Controls.Find("newCustomControl", false);
            for (int i = 0; i < ctrl.Length; i++)
            {
                this.Controls.Remove(ctrl[i]);
            }

            m_totalSlides = 0;
            m_currentSlide = 1;
            m_SlideContainer = new ArrayList();
        }


        private void runTime_Click(object sender, EventArgs e)
        {
            if(findCast(sender)=="TextControl")
            m_tempObject = ((TextControl)sender);
            else
            m_tempObject = ((PictureControl)sender);

            animationToolStripMenuItem.Enabled = true;

         //   ((TextControl)sender).Top = 0;// "Clicked";
            //this.Text = "Link Clicked :" + ((TextControl)sender).Caption; 
        }

        private void textControl1_Click(object sender, EventArgs e)
        {
            
        }

        private void fromRightToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_tempObject.Animation = m_tempObject.Animation_Right;
        }

        private void animationToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_tempObject.X1 = this.Width;// -tempObject.Width;
            m_tempObject.X2 = (int)((float)m_tempObject.Top / this.Height * 100);
            
            m_tempObject.Y1 = m_tempObject.Y2 = (int)((float)m_tempObject.Top / this.Height * 100);

            m_tempObject.Y1 = -10000;
        }

        private void fromLeftToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_tempObject.Animation = m_tempObject.Animation_Left;
        }

        private void fromTopToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_tempObject.Animation = m_tempObject.Animation_Top;
        }

        private void fromBottomToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_tempObject.Animation = m_tempObject.Animation_Bottom;
        }

        private void textControl1_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void newSlideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            addSlide("White");
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void pictureToolStripMenuItem_Click(object sender, EventArgs e)
        {
            m_currentNo++;
            b_readyToDrawText = false;
            b_readyToDrawImage = true;
        }

        private void backColorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            colorDialog.ShowDialog();
            this.BackColor = colorDialog.Color;
            m_selectedSlide.BackColor = this.BackColor;

        }

        private void slideCtrl_Load(object sender, EventArgs e)
        {

        }



        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            openFile();         
        }

        private ArrayList getDataBlock(string fileData,string tag1,string tag2)
        {
            string str= "   ";
            ArrayList stringList = new ArrayList();
            int last=0;
            while (last > -1)
            {
                str = parseBetweenStrings(fileData, tag1, tag2);
                last = fileData.IndexOf(tag2);

                
                if (last > -1)
                {
                    fileData = fileData.Substring(last + tag2.Length, fileData.Length - (last + tag2.Length));
                    stringList.Add(str);
                }
            }


            int i = stringList.Count;
            return stringList;
        }
        private string parseBetweenStrings(string str,string str1, string str2)
        {

            int first = str.IndexOf(str1);
            first = first + str1.Length;

            int last = str.IndexOf(str2);

          //  
         //   
            if (last > 1)
            {
                string parsedString = str.Substring(first, last - first);

                
                return parsedString;
            }

            return null;// ".";
        }
        

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {

            refreshCurrentSlide();

            arrangeCurrentSlide();
            getSlidesBackColor();

            MainObject[][] slides = listToArray();


            string saveText="";
            
            for (int i = 0; i < slides.Length; i++)
            {
                saveText = saveText + "<Slide>";

                string strColor = System.Drawing.ColorTranslator.ToHtml(m_backColor[i]);

                saveText = saveText + "<bgColor>" + strColor + "</bgColor>";

                for (int j = 0; j<slides[i].Length ; j++)
                {
                    string cast = findCast(((object)slides[i][j]));
                    saveText = saveText + "<object> <type>" + cast + "</type>";

                    saveText = saveText + "<location>" + slides[i][j].Left.ToString() + "," + slides[i][j].Top.ToString() +  "</location>";

                    saveText = saveText + "<animation>" + ((MainObject)slides[i][j]).Animation + "</animation>";

                    if (cast == "TextControl")
                    {
                        saveText = saveText + "<caption>" + ((TextControl)slides[i][j]).Caption + "</caption>";
                        string strForeColor = System.Drawing.ColorTranslator.ToHtml(((TextControl)slides[i][j]).ForeColor);
                        saveText = saveText + "<forecolor>" + strForeColor + "</forecolor>";
                    }
                    else
                        saveText = saveText + "<image>" + ((PictureControl)slides[i][j]).Path + "</image>"; 

                    
                    saveText = saveText + "</object>";
                    
                }
                saveText = saveText + " </Slide> \n";
            }


            saveDialog.Filter = "All presentation files |*.apf";
            saveDialog.ShowDialog();
            string fileName = saveDialog.FileName;
            if (fileName.Length > 0)
            {
                if (System.IO.File.Exists(fileName))
                    System.IO.File.Delete(fileName);


                using (System.IO.FileStream fs = System.IO.File.Create(fileName))
                {
                    byte[] info = new System.Text.UTF8Encoding(true).GetBytes(saveText);
                    fs.Write(info, 0, info.Length);
                }
                
            }


        }

        private void newToolStripMenuItem_Click(object sender, EventArgs e)
        {
            unLoadAllData();

            addSlide("White");
        }


        private void openFile()
        {

            openDialog.Filter = "All presentation files |*.apf";
            openDialog.ShowDialog();
            

            string fileName = openDialog.FileName;
            if (fileName.Length > 0)
            {

                string info = "";
                try
                {

                    using (System.IO.StreamReader sr = System.IO.File.OpenText(fileName))
                    {
                        string s = "";

                        while ((s = sr.ReadLine()) != null)
                        {
                            info = info + s;
                        }
                        parseDatFromString(info);
                    }

                }
                catch(Exception e)
                {

                }
            }
        }


        private void parseDatFromString(string info)
        {
            System.ComponentModel.TypeConverter converter =
      System.ComponentModel.TypeDescriptor.GetConverter(typeof(Point));

            ArrayList SlidesList = getDataBlock(info, "<Slide>", "</Slide>");
            unLoadAllData();
            for (int i = 0; i < SlidesList.Count; i++)
            {
                String sObject = (string)SlidesList[i];

                ArrayList ObjectList = getDataBlock((string)SlidesList[i], "<object>", "</object>");

                string strColor = parseBetweenStrings((string)SlidesList[i], "<bgColor>", "</bgColor>");


                //to add the current slide
                addSlide(strColor);
              
                m_currentSlide = i + 1;

                //parsing slides objects
                for (int j = 0; j < ObjectList.Count; j++)
                {

                    string type = parseBetweenStrings((string)ObjectList[j], "<type>", "</type>");
                    string location = parseBetweenStrings((string)ObjectList[j], "<location>", "</location>");

                    string animation = parseBetweenStrings((string)ObjectList[j], "<animation>", "</animation>");

                    string caption = parseBetweenStrings((string)ObjectList[j], "<caption>", "</caption>");

                    string path = parseBetweenStrings((string)ObjectList[j], "<image>", "</image>");
                    string foreColor = parseBetweenStrings((string)ObjectList[j], "<forecolor>", "</forecolor>");

                    //if(foreColor.Length>1)
                    

                    Point pt = (Point)converter.ConvertFromString(location);
                    bool isVisible = false;
                    if (i == 0) isVisible = true;

                    insertCustomControl(type, pt, textControl1.Size, Int32.Parse(animation), caption, path,foreColor, isVisible);

                }

            }
            m_currentSlide = 1;


        }



        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void foreColorToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (findCast(m_tempObject) == "TextControl")
            {                
                colorDialog.ShowDialog();
                ((TextControl)m_tempObject).ForeColor= colorDialog.Color;
            }
        }

        private void slideShowToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void slideViewToolStripMenuItem_Click(object sender, EventArgs e)
        {
          for (int i = 0; i < m_totalSlides; i++)
            {
                
                refreshCurrentSlide();
                m_currentSlide = i + 1;
                      

                resetCurrentSlide();
                arrangeCurrentSlide();
            }
               

            arrangeCurrentSlide();

            MainObject[][] slides = listToArray();


            SlideView sView = new SlideView(slides, getSlidesBackColor());
            sView.ShowDialog();
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            About aboutBox = new About();
            aboutBox.ShowDialog();
        }

        private void SlidePanel_Paint(object sender, PaintEventArgs e)
        {

        }


    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Pakistan Pakistan
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions