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 ;
}
}
}
}
ComboBox.zip( 65 k)Related examples in the same category