SSISO Community

갤러리정

ComboBox with color cell renderer

/*
Professional  Windows  GUI  Programming  Using  C#
by  Jay  Glynn,  Csaba  Torok,  Richard  Conway,  Wahid  Choudhury,  
      Zach  Greenvoss,  Shripad  Kulkarni,  Neil  Whitlow

Publisher:  Peer  Information
ISBN:  1861007663
*/
using  System;
using  System.Drawing;
using  System.Collections;
using  System.ComponentModel;
using  System.Windows.Forms;
using  System.Data;

namespace  MyComboBox
{
    ///  <summary>
    ///  Summary  description  for  MyComboBox.
    ///  </summary>
    public  class  MyComboBox  :  System.Windows.Forms.Form
    {
        private  System.Windows.Forms.ComboBox  comboBox1;
        private  System.Windows.Forms.Label  label1;
        private  System.Windows.Forms.ComboBox  comboBox2;
        private  System.Windows.Forms.Label  label2;
        ArrayList  colorArray  =  new  ArrayList()  ;
        ArrayList  fontArray    =  new  ArrayList()  ;
        ///  <summary>
        ///  Required  designer  variable.
        ///  </summary>
        private  System.ComponentModel.Container  components  =  null;

        public  MyComboBox()
        {
            //
            //  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.comboBox1  =  new  System.Windows.Forms.ComboBox();
            this.label1  =  new  System.Windows.Forms.Label();
            this.comboBox2  =  new  System.Windows.Forms.ComboBox();
            this.label2  =  new  System.Windows.Forms.Label();
            this.SuspendLayout();
            //  
            //  comboBox1
            //  
            this.comboBox1.DrawMode  =  System.Windows.Forms.DrawMode.OwnerDrawVariable;
            this.comboBox1.ItemHeight  =  25;
            this.comboBox1.Location  =  new  System.Drawing.Point(16,  40);
            this.comboBox1.Name  =  "comboBox1";
            this.comboBox1.Size  =  new  System.Drawing.Size(264,  31);
            this.comboBox1.TabIndex  =  0;
            this.comboBox1.SelectedIndexChanged  +=  new  System.EventHandler(this.MyItemSelected);
            this.comboBox1.MeasureItem  +=  new  System.Windows.Forms.MeasureItemEventHandler(this.comboBox1_MeasureItem);
            this.comboBox1.DrawItem  +=  new  System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);
            //  
            //  label1
            //  
            this.label1.Location  =  new  System.Drawing.Point(16,  16);
            this.label1.Name  =  "label1";
            this.label1.Size  =  new  System.Drawing.Size(100,  16);
            this.label1.TabIndex  =  1;
            this.label1.Text  =  "Font  Combo  Box";
            //  
            //  comboBox2
            //  
            this.comboBox2.DrawMode  =  System.Windows.Forms.DrawMode.OwnerDrawFixed;
            this.comboBox2.DropDownStyle  =  System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.comboBox2.ItemHeight  =  20;
            this.comboBox2.Location  =  new  System.Drawing.Point(16,  104);
            this.comboBox2.Name  =  "comboBox2";
            this.comboBox2.Size  =  new  System.Drawing.Size(264,  26);
            this.comboBox2.TabIndex  =  0;
            this.comboBox2.SelectedIndexChanged  +=  new  System.EventHandler(this.MyItemSelected);
            this.comboBox2.DrawItem  +=  new  System.Windows.Forms.DrawItemEventHandler(this.comboBox2_DrawItem);
            //  
            //  label2
            //  
            this.label2.Location  =  new  System.Drawing.Point(24,  80);
            this.label2.Name  =  "label2";
            this.label2.TabIndex  =  2;
            this.label2.Text  =  "Color  Combo  Box";
            //  
            //  MyComboBox
            //  
            this.AutoScaleBaseSize  =  new  System.Drawing.Size(5,  13);
            this.ClientSize  =  new  System.Drawing.Size(312,  157);
            this.Controls.AddRange(new  System.Windows.Forms.Control[]  {
                                                                            this.label2,
                                                                            this.label1,
                                                                            this.comboBox1,
                                                                            this.comboBox2});
            this.Name  =  "MyComboBox";
            this.Text  =  "OwnerDraw  ComboBox";
            this.Load  +=  new  System.EventHandler(this.MyComboBox_Load);
            this.ResumeLayout(false);

        }
        #endregion

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

        private  void  MyComboBox_Load(object  sender,  System.EventArgs  e)
        {    
            //  Fill  an  array  with  the  different  color  you  wish
            //  to  display  in  the  ComboBox

            colorArray.Add(new  SolidBrush(Color.Yellow));
            colorArray.Add(new  SolidBrush(Color.Black));
            colorArray.Add(new  SolidBrush(Color.Azure));
            colorArray.Add(new  SolidBrush(Color.Firebrick));
            colorArray.Add(new  SolidBrush(Color.DarkMagenta));

            //  Add  blank  items  to  the  list,  since  the  text  we  will  display
            //  will  be  the  name  of  the  Color  we  are  painting
            comboBox2.Items.Add("");
            comboBox2.Items.Add("");
            comboBox2.Items.Add("");
            comboBox2.Items.Add("");
            comboBox2.Items.Add("");

        
            //  Fill  an  array  with  the  different  fonts  that  you  will  use  to  display  
            //  items  in  the  other  comboBox

            fontArray  .Add(new  Font("Ariel"  ,  15  ,  FontStyle.Bold  ));
            fontArray  .Add(new  Font("Courier"  ,  12  ,  FontStyle.Italic));
            fontArray  .Add(new  Font("Veranda"  ,  14  ,  FontStyle.Bold));
            fontArray  .Add(new  Font("System"  ,  10  ,  FontStyle.Strikeout));
            fontArray  .Add(new  Font("Century  SchoolBook"  ,  15  ,  FontStyle.Underline));

            //  Add  the  items  that  in  the  listBox

            comboBox1.Items.Add("Washington");
            comboBox1.Items.Add("Houston");
            comboBox1.Items.Add("Phoenix");
            comboBox1.Items.Add("Dallas");
            comboBox1.Items.Add("London");

        }

        private  void  comboBox1_DrawItem(object  sender,  System.Windows.Forms.DrawItemEventArgs  e)
        {
            //  Override  this  function  to  draw  items  in  the  Font  comboBox

            //  Get  the  Graphics  Object  (aka.  CDC  or  Device  Context  Object  )
            //  passed  via  the  DrawItemEventArgs  parameter
            Graphics  g  =  e.Graphics  ;

            //  Get  the  bounding  rectangle  of  the  item  currently  being  painted
            Rectangle  r  =  e.Bounds  ;
            Font  fn  =  null  ;

            if  (  e.Index  >=  0  )  
            {
                //  Get  the  Font  object,  at  the  specifid  index  in  the  fontArray
                fn  =  (Font)fontArray[e.Index];

                //  Get  the  text  that  we  wish  to  display
                string  s  =  (string)comboBox1.Items[e.Index];

                //  Set  the  string  format  options
                StringFormat  sf  =  new  StringFormat();
                sf.Alignment  =  StringAlignment.Near;

                Console.WriteLine(e.State.ToString());
                //  Draw  the  rectangle
                e.Graphics.DrawRectangle(new  Pen(new  SolidBrush(Color.Black),  2  ),  r  );

                if  (  e.State  ==  (  DrawItemState.NoAccelerator  |  DrawItemState.NoFocusRect))
                {
                    //  if  the  item  is  not  selected  draw  it  with  a  different  color
                    e.Graphics.FillRectangle(new  SolidBrush(Color.White)  ,  r);
                    e.Graphics.DrawString(  s  ,  fn  ,  new  SolidBrush(Color.Black),  r  ,sf);
                    e.DrawFocusRectangle();
                }
                else
                {
                    //  if  the  item  is  selected  draw  it  with  a  different  color
                    e.Graphics.FillRectangle(new  SolidBrush(Color.LightBlue)  ,  r);
                    e.Graphics.DrawString(  s  ,  fn  ,  new  SolidBrush(Color.Red),  r  ,sf);
                    e.DrawFocusRectangle();
                }
            }
        }

        private  void  comboBox2_DrawItem(object  sender,  System.Windows.Forms.DrawItemEventArgs  e)
        {
            //  Override  this  function  to  draw  items  in  the  Color  comboBox

            //  Get  the  Graphics  Object  (aka.  CDC  or  Device  Context  Object  )
            //  passed  via  the  DrawItemEventArgs  parameter
            Graphics  g  =  e.Graphics  ;

            //  Get  the  bounding  rectangle  of  the  item  currently  being  painted
            Rectangle  r  =  e.Bounds  ;

            if  (  e.Index  >=  0  )  
            {
                Rectangle  rd  =  r  ;  
                rd.Width  =  100  ;  
                
                Rectangle  rt  =  r  ;
                r.Left  =  rd.Right  ;  

                //  Get  the  brush  object,  at  the  specifid  index  in  the  colorArray
                SolidBrush  b  =  (SolidBrush)colorArray[e.Index];
                //  Fill  a  portion  of  the  rectangle  with  the  selected  brush
                g.FillRectangle(b    ,  rd);

                //  Set  the  string  format  options
                StringFormat  sf  =  new  StringFormat();
                sf.Alignment  =  StringAlignment.Near;

                Console.WriteLine(e.State.ToString());
                
                //  Draw  the  rectangle
                e.Graphics.DrawRectangle(new  Pen(new  SolidBrush(Color.Black),  2  ),  r  );

                if  (  e.State  ==  (  DrawItemState.NoAccelerator  |  DrawItemState.NoFocusRect))
                {
                    //  if  the  item  is  not  selected  draw  it  with  a  different  color
                    e.Graphics.FillRectangle(new  SolidBrush(Color.White)  ,  r);
                    e.Graphics.DrawString(  b.Color.Name,  new  Font("Ariel"  ,  8  ,  FontStyle.Bold    )  ,  new  SolidBrush(Color.Black),  r  ,sf);
                    e.DrawFocusRectangle();
                }
                else
                {
                    //  if  the  item  is  selected  draw  it  with  a  different  color
                    e.Graphics.FillRectangle(new  SolidBrush(Color.LightBlue)  ,  r);
                    e.Graphics.DrawString(  b.Color.Name,  new  Font("Veranda"  ,  12  ,  FontStyle.Bold    )  ,  new  SolidBrush(Color.Red),  r  ,sf);
                    e.DrawFocusRectangle();
                }
            }
        }

        private  void  MyItemSelected(object  sender,  System.EventArgs  e)
        {
            //  UnBox  the  sender.  Since  both  the  ComboBox  controls  use  the  same
            //  events  to  handle  the  selection  of  item  from  the  list

            ComboBox  cb  =  null  ;
            if  (  sender.Equals(comboBox1))
                cb  =  comboBox1;  
            else
                cb  =  comboBox2;  
            
            //  Get  the  index  of  the  Item  Selected
                        int  x  =  cb.SelectedIndex  ;

            string  str  =  "";
            //  Get  the  Text  of  the  item  selected
            if  (  sender.Equals(comboBox1))
            {
                str  =  "Item  Selected  is  =  "  +  (string)cb.Items[x];
            }
            else
            {
                SolidBrush  br  =  (SolidBrush)colorArray[x];
                str  =  "Color  Selected  is  =  "  +  br.Color.Name;
            }
            
            MessageBox.Show(str,"ComboBox  Item");
        }

        private  void  comboBox1_MeasureItem(object  sender,  System.Windows.Forms.MeasureItemEventArgs  e)
        {
            //  For  the  comboBox  with  OwnerDrawVariable  property
            //  Display  every  second  item  with  a  height  of  45
            if  (  e.Index%2  ==  0    )
            {
                e.ItemHeight  =  45  ;
                e.ItemWidth  =  20  ;  
            }
            else
            {
                //  Display  all  other  items  with  a  height  of  25
                e.ItemHeight  =  25  ;
                e.ItemWidth  =  10  ;  
            }
        }
    }
}

726 view

4.0 stars