ComboBox with color cell renderer

image_pdfimage_print



   

/*
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 ; 
      }
    }
  }
}


           
          


ComboBox.zip( 65 k)