Bitmap Viewer Host

image_pdfimage_print


   

/*
User Interfaces in C#: Windows Forms and Custom Controls
by Matthew MacDonald

Publisher: Apress
ISBN: 1590590457
*/

using System.Drawing;
using System.Windows.Forms;
using System.IO;

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace BitmapViewerHost
{
    /// <summary>
    /// Summary description for BitmapViewerHost.
    /// </summary>
    public class BitmapViewerHost : System.Windows.Forms.Form
    {
        private BitmapViewer bitmapViewer1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public BitmapViewerHost()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.bitmapViewer1 = new BitmapViewer();
            this.SuspendLayout();
            // 
            // bitmapViewer1
            // 
            this.bitmapViewer1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right);
            this.bitmapViewer1.Dimension = 80;
            this.bitmapViewer1.Directory = null;
            this.bitmapViewer1.DockPadding.All = 1;
            this.bitmapViewer1.Location = new System.Drawing.Point(12, 12);
            this.bitmapViewer1.Name = "bitmapViewer1";
            this.bitmapViewer1.Size = new System.Drawing.Size(300, 244);
            this.bitmapViewer1.Spacing = 10;
            this.bitmapViewer1.TabIndex = 0;
            this.bitmapViewer1.PictureSelected += new BitmapViewer.PictureSelectedDelegate(this.bitmapViewer1_PictureSelected);
            // 
            // BitmapViewerHost
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(320, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.bitmapViewer1});
            this.Name = "BitmapViewerHost";
            this.Text = "BitmapViewerHost";
            this.Load += new System.EventHandler(this.BitmapViewerHost_Load);
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new BitmapViewerHost());
        }

        private void BitmapViewerHost_Load(object sender, System.EventArgs e)
        {
            bitmapViewer1.Directory = Application.StartupPath;
            bitmapViewer1.Directory = "c:windows";
        }

        private void bitmapViewer1_PictureSelected(object sender, PictureSelectedEventArgs e)
        {
                MessageBox.Show("You chose " + e.FileName);
        }

    
    }
    /// <summary>
    /// Summary description for BitmapViewer.
    /// </summary>
    public class BitmapViewer : System.Windows.Forms.UserControl
    {
        internal System.Windows.Forms.Panel pnlPictures;
        /// <summary> 
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public BitmapViewer()
        {
            // This call is required by the Windows.Forms Form Designer.
            InitializeComponent();

            // TODO: Add any initialization after the InitForm call

        }

        /// <summary> 
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Component Designer generated code
        /// <summary> 
        /// Required method for Designer support - do not modify 
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.pnlPictures = new System.Windows.Forms.Panel();
            this.SuspendLayout();
            // 
            // pnlPictures
            // 
            this.pnlPictures.AutoScroll = true;
            this.pnlPictures.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
            this.pnlPictures.Dock = System.Windows.Forms.DockStyle.Fill;
            this.pnlPictures.Location = new System.Drawing.Point(1, 1);
            this.pnlPictures.Name = "pnlPictures";
            this.pnlPictures.Size = new System.Drawing.Size(530, 218);
            this.pnlPictures.TabIndex = 1;
            // 
            // BitmapViewer
            // 
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.pnlPictures});
            this.DockPadding.All = 1;
            this.Name = "BitmapViewer";
            this.Size = new System.Drawing.Size(532, 220);
            this.ResumeLayout(false);

        }
        #endregion
    
        public delegate void PictureSelectedDelegate(object sender, PictureSelectedEventArgs e);
        public event PictureSelectedDelegate PictureSelected;

        // The directory that will be scanned for image.
        private string directory="";

        // Each picture box will be a square of dimension X dimension pixels.
        private int dimension;

        // The space between the images and the top, left, and right sides.
        private int border = 5;

        // The space between each image.
        private int spacing;

        // The images that were found in the selected directory.
        private ArrayList images = new ArrayList();


        public string Directory
        {
            get
            {
                return directory;
            }
            set
            {
                directory = value;
                GetImages();
                UpdateDisplay();
            }
        }

        public int Dimension
        {
            get
            {
                return dimension;
            }
            set
            {
                dimension = value;
                UpdateDisplay();
            }
        }

        public int Spacing
        {
            get
            {
                return spacing;
            }
            set
            {
                spacing = value;
                UpdateDisplay();
            }
        }



        private void GetImages()
        {
            images.Clear();
            if (this.Directory != "" &amp;&amp; this.directory != null)
            {
                DirectoryInfo dir = new DirectoryInfo(directory);
                foreach (FileInfo file in dir.GetFiles("*.bmp"))
                {
                    images.Add(new NamedImage(Bitmap.FromFile(file.FullName), file.Name));
                }
            }
        }

        private void UpdateDisplay()
        {
            // Clear the current display.
            pnlPictures.Controls.Clear();

            // Row and Col will track the current position where pictures are
            // being inserted. They begin at the top-right corner.
            int row = border, col = border;

            // Iterate through the Images collection, and create PictureBox controls.
            foreach (NamedImage image in images)
            {
                PictureBox pic = new PictureBox();
                pic.Image = image.Image;
                pic.Tag = image.FileName;
                pic.Size = new Size(dimension, dimension);
                pic.Location = new Point(col, row);
                pic.BorderStyle = BorderStyle.FixedSingle;

                // StrechImage mode gives us the "thumbnail" ability.
                pic.SizeMode = PictureBoxSizeMode.StretchImage;

                // Display the picture.
                pnlPictures.Controls.Add(pic);

                // Move to the next column.
                col += dimension + spacing;

                // Handle the event.
                pic.Click += new EventHandler(this.pic_Click);

                // Move to next line if no more pictures will fit.
                if ((col + dimension + spacing + border) > this.Width)
                {
                    col = border;
                    row += dimension + spacing;
                }
            }

        }


        public void RefreshImages()
        {
            GetImages();
            UpdateDisplay();
        }


        protected override void OnSizeChanged(System.EventArgs e)
        {
            UpdateDisplay();
            base.OnSizeChanged(e);
        }


        private PictureBox picSelected;

        private void pic_Click(object sender, System.EventArgs e)
        {
            // Clear the border style from the last selected picture box.
            if (picSelected != null)
            {
                picSelected.BorderStyle = BorderStyle.FixedSingle;
            }

            // Get the new selection.
            picSelected = (PictureBox)sender;
            picSelected.BorderStyle = BorderStyle.Fixed3D;

            // Fire the selection event.
            PictureSelectedEventArgs args = new 
                PictureSelectedEventArgs((string)picSelected.Tag, picSelected.Image);
            if (PictureSelected != null)
            {
                PictureSelected(this, args);
            }

        }



        private class NamedImage
        {
            public Image Image;
            public string FileName;

            public NamedImage(Image image, string fileName)
            {
                this.Image = image;
                this.FileName = fileName;
            }
        }

    
    }
    public class PictureSelectedEventArgs : EventArgs
    {
        public string FileName;
        public Image Image;

        public PictureSelectedEventArgs(String fileName, Image image)
        {
            this.FileName = fileName;
            this.Image = image;
        }

    }


    
}