/* 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)